タグ

asmに関するyheldのブックマーク (15)

  • ログイン - はてな

    yheld
    yheld 2007/07/10
  • R3000命令解説

    プレステのアセンブリ言語であるR3000の 基命令についての解説です。 一部難しい説明がありますがどうかお許しを(--; (特に後半・・・) 凡例 書式 命令の書式です。 r1,r2,r3はレジスタ名、 $nnnnは16ビットの即値、 $8aaaaaaaとなっているものはアドレス値です。 データ変換 R3000の命令から16進数の機械語に変換する際 どのように対応しているかの計算方法です。 R3000ではすべての命令が4バイトで構成されています。 (WINDOWSの8086系だとこうはいかない) レジスタ名とその番号の変換は以下の通り。 zero:00H( 0) t0  :08H( 8) s0  :10H(16) t8    :18H(24) at  :01H( 1) t1  :09H( 9) s1  :11H(17) t9    :19H(25) v0  :02H( 2) t2  :0

  • Programmed Introduction to MIPS Assembly Language

    yheld
    yheld 2007/06/23
  • グレイトなアセンブリ本を見つけた! - ボクノス

    Amazonを徘徊していたら良さげながあったので思わずクリックしてしまった。 届いてみたらとんでもない良書だった!! x86アセンブラ入門―PC/ATなどで使われている80x86のアセンブラを習得 (TECHI―Processor) 作者: 大貫広幸出版社/メーカー: CQ出版発売日: 2006/01メディア: 単行購入: 7人 クリック: 195回この商品を含むブログ (10件) を見る アセンブラ入門というよりは、CPU入門といった印象が強い。 古き良き16ビット命令から、最新のSIMD命令まで。 CPUがどのようにして命令を解釈し実行するのか。レジスタ、メモリの状態が詳細な図解で解説されてます。 しかもアセンブラはMASM,GAS両対応。 概要は・・・ x86の仕組み MASM入門 GAS入門 転送、算術、ビット・フラグ、制御、ストリング、システム命令 浮動小数点(FPU) 並列

    グレイトなアセンブリ本を見つけた! - ボクノス
    yheld
    yheld 2007/06/20
    >はじめて読む486並の良書。, へぇ・・・チェックしとこう。
  • http://d.hatena.ne.jp/sato_tiff/20070618

  • 起動するまでの長い道のり D言語編(3) 標準ライブラリ格闘の巻(1) - Outlandish Watch

    D言語を使って(あれを「使って」と言って良いなら……)、シリアル・ポートを叩くことに成功した。 しかし今のコードはカッコ悪い。IOを直に叩いているだけで、printfでHello,World!するのとあまり変わらない。これから先シリアル・ポートを叩く機会もたくさんあるだろうから、シリアル・ポート操作用の処理をまとめておきたい。今回はそれにチャレンジし、壁にぶちあたる(笑)。 今回のソース startup.d serial.d シリアル・ポート・クラスの作成 さて、シリアル・ポートの処理をまとめる。しかもオブジェクト指向らしくクラスでラップする。ポート番号をメンバ変数に持ち、初期化はコンストラクタ・入出力や待機処理はメンバ関数で行わせる。定数は全部enumで定義する。 で、大体以下のようになった。 module outlandish.os.serial; import std.stdint;

    起動するまでの長い道のり D言語編(3) 標準ライブラリ格闘の巻(1) - Outlandish Watch
    yheld
    yheld 2007/06/08
    シリアルポートキターーーーー!!!今自分が一番知りたい場所ですw
  • 起動するまでの長い道のり D言語編(2) それとなくシリアル・ポートの巻 - Outlandish Watch

    D言語の関数を呼び出すことに成功した。これからどんどんD言語で機能を追加していく。 OSを作っている以上、外部デバイスをいじれないとつまらない。画面表示や何かに動いているという証が欲しい。今回は、割合制御が簡単なシリアル・ポートに文字列を出力させてみる。シリアル・ポートの出力ならqemuからも簡単に見られたりする。 今回のソース startup.d io.d IO関数の用意 シリアル・ポートはIOポートを叩くことによって制御する。IOポートはアセンブラの命令で叩くことができる。が、D言語の世界に既に移行してしまったので、できればD言語の関数でIOポートを叩けるようにしたい。今後もIOを操作する機会は多いだろうから、アセンブラ命令を単純にラップした関数を用意しておく。 実はD言語の標準ライブラリ(Phobos)には、IOポートを叩くための関数が用意されている。しかし、OSを作るに当たって標準

    起動するまでの長い道のり D言語編(2) それとなくシリアル・ポートの巻 - Outlandish Watch
  • アセンブリ言語の教科書 第3章 数値のカウント(yieldで) - ボクノス

    たのしいプログラミングをアセンブリで実現したくなったので、RubyのtimesをGASに移植してみた。 .text .global main main: push %ebp mov %esp,%ebp mov $10, %eax push %eax push $print call times mov $0, %eax leave ret times: push %ebp mov %esp,%ebp mov 8(%ebp),%ebx mov 12(%ebp),%eax mov $0, %ecx 1: push %ecx call *%ebx // yield pop %ecx inc %ecx cmp %ecx, %eax jne 1b leave ret print: push %ebp mov %esp,%ebp mov 8(%ebp),%eax push %eax push $cou

    アセンブリ言語の教科書 第3章 数値のカウント(yieldで) - ボクノス
  • アセンブリ言語の教科書 第3章 数値のカウント(再帰で) - ボクノス

    Scheme勉強中なので、GASで再帰します。 .text .global main main: push %ebp mov %esp,%ebp mov $10, %eax push %eax call count pop %eax mov $0, %eax leave ret count: push %ebp mov %esp,%ebp mov 8(%ebp),%eax push %eax push $count_s call printf pop %eax pop %eax dec %eax cmp $0, %eax je 1f push %eax call count pop %eax 1: leave ret .data count_s: .string "count : %d\n" % gcc -o count count.s % ./count count : 10 count

    アセンブリ言語の教科書 第3章 数値のカウント(再帰で) - ボクノス
  • アセンブリ言語の教科書 第3章 Hello, GAS world!! - ボクノス

    サンプルに少し改良を加えました。 .text .global main main: push %ebp mov %esp,%ebp push $hello call printf mov $0, %eax leave ret .data hello: .string "Hello, GAS World!!" 一見何の変哲もないHello,Worldですが、かなり罠が隠れています。1行づつ罠を解いていきます。 復習ついでに、ベースポインタ入門をしてみる。 ボクノス的ベースポインタ入門 --------------------------------------------- | | | | | | | |呼び出し元のアドレス| --------------------------------------------- ^%esp ^%ebp最初はこの状態。スタックは右から左へ積んでいきます。

    アセンブリ言語の教科書 第3章 Hello, GAS world!! - ボクノス
  • 起動するまでの長い道のり IPL編(9) ビルド環境makeの巻 - Outlandish Watch

    512バイトの制限を超えてカーネルの読み込みができるところまでをやった。これからソースファイルがどんどん増えていくと、ビルドがかなりめんどくさくなる。そこで今回は、makeを使った一括ビルドの方法を解説しようと思う。 makeについて makeとは、UNIX系OSのプログラミング環境で使われる一括ビルドのためのツールだ。一般にMakefileと呼ばれる設定ファイルにビルド方法を書いておくと、後はそのMakefileがあるディレクトリでmakeを実行するだけで自動的にビルドが行われる。あるソースコードが変更された場合、そのソースだけがコンパイルされ直して後は再リンクされるだけ、といったスマートなこともやってくれたりする。 makeは、うまく使うとプログラムのビルド以外にもWebの更新や日常のバックアップやファイアーウォールのルール変更やその他色々なことに活用できる。IDE全盛の昨今ではいささ

    起動するまでの長い道のり IPL編(9) ビルド環境makeの巻 - Outlandish Watch
  • 起動するまでの長い道のり IPL編(8) カーネル読み込み実装の巻 - Outlandish Watch

    前回でディスクからのデータ読み込み方法と、その時にぶつかる壁について解説した。今回はいよいよデータの読み込み処理を実装していく。 ソースファイルを追加する さて、読み込み処理を書くに当たって読み込むデータ(プログラム)が何か無いと始まらない。今までコードは全てipl.sという1つのソースファイルに書いていた。これに加えて、setup.sというソースファイルを別に用意する。この後機能拡張をしていくときは、ipl.sではなくsetup.sの方にコードを追加していく。因みに、わざわざsetupなんて名前にしたのは、今後ここに色々な初期化処理を書くよという布石だ。 とりあえず最初は無限ループで止まるようにしておけばいいだろう。 # setup.s .code16 begin: jmp begin リンカスクリプトを書く setup.oは、今まで書いたIPLのすぐ後ろに追加したい。そのためには、リン

    起動するまでの長い道のり IPL編(8) カーネル読み込み実装の巻 - Outlandish Watch
  • 起動するまでの長い道のり IPL編(7) カーネル読み込みの巻 - Outlandish Watch

    実は、今まで黙っていたが、起動時のIPLはディスク先頭の512バイト=1セクタしか読み込まれない。1セクタだけだからブートセクタなんて言うのだ。 言うのだ、なんて威張っても仕方ない。OSのカーネルがまさか512バイトに納まるわけはないので、残りの部分をディスクから読み込まなければならない。そのためにはまずカーネルのサイズを知り、そしてディスクからメモリの適切なアドレスへ読み込む必要がある。 カーネルをどこに置くか考える リアルモードの制限により、メモリは下位1MBまでしか使えない。しかも、連続してアクセスできるのは64KBまでだ。しかもその1MBの中には、いくつも予約されている領域が存在する。前回に出てきた割り込みハンドラテーブルもその一つだし、BIOSファンクションのコードがある場所やBIOS作業領域、VRAMにマップされている領域などなどがある。それらをかいくぐってカーネルが置ける場所

    起動するまでの長い道のり IPL編(7) カーネル読み込みの巻 - Outlandish Watch
    yheld
    yheld 2007/05/15
    元何グラマだったんだろう?組込関係?
  • 起動するまでの長い道のり IPL編(5) CPU解説の巻 - Outlandish Watch

    前回まで実際のソースコードを元に不器用に説明したけど、いい加減CPUの説明抜きで話を進めるのが非常に辛いと分かったので、必要最低限解説しておこうと思う。 メモリ・レジスタ関連 メモリ・レジスタ 一般的なCPUには全てメモリとレジスタがある。メモリは言うまでもなくデータやプログラムを置く記憶領域で、レジスタは以前説明したとおり作業用の「手」だ。メモリから取り出した値を持ったり、値を加工するために持ったりする。非常に小さく、ほとんど1〜4バイトしかない。また、計算や処理には使わない実行制御用の特殊なレジスタもたくさん存在する。 プログラムカウンタ CPUはメモリに置かれたプログラムのコードを順次実行していく。そのために、メモリ上のどの命令を現在実行しているのかを覚えていなければならない。CPUにはそのための専用のレジスタがあり、プログラムカウンタと呼ばれる。486やPentiumなどのいわゆる

    起動するまでの長い道のり IPL編(5) CPU解説の巻 - Outlandish Watch
    yheld
    yheld 2007/05/11
  • 起動するまでの長い道のり IPL編(3) アセンブラ解説の巻 - Outlandish Watch

    ひたすら打つべし! 打つべし! だったアセンブラのソースについていい加減解説する。 ディレクティブ・コメント ここについて説明する。 # ipl.s # generate real mode code .code16 「#」で始まる行はコメントだ。「#」から行の終りまでがコメントと見なされる。 「.code16」は、16ビットの実行コードを生成するよう指示するためのディレクティブ(指示語)だ。前に解説したとおり、起動直後のマシンは16ビットのリアルモードで動いている。その状態で実行できるコードを生成させるために、このディレクティブは必要となる。 ジャンプ・空の命令 ここについて説明する。 jmp begin nop # 中略 # boot begin begin: マシン起動時、最初にこのjmp命令が実行される。(先述の.code16はアセンブラに指示を与えるディレクティブなので実行コード

    起動するまでの長い道のり IPL編(3) アセンブラ解説の巻 - Outlandish Watch
    yheld
    yheld 2007/05/09
  • 1