- ベストアンサー
アセンブラの読み方
お世話になります。 アセンブラを勉強しています。 下記について教えていただけないでしょうか。 よろしくお願いいたします。 1 .file 2 .data 3 var: .long 0x1234 4.text 5 .global main 6 main: 7 movb $1, %al // 値1をレジスタalに代入 8 push %eax // レジスタeaxの内容をスタックに格納 9 call IncReg // 関数呼び出し 10 pop %eax // スタックからレジスタeaxに引き出し 11 push var // 変数varの内容をスタックに格納 12 call IncReg // 関数呼び出し 13 pop %ecx // スタックからレジスタecxに引き出し 14 ret // リターン 15 IncReg: 16 movl %esp, %ebp // pushによって動いたスタックの先頭アドレスをレジスタ ebp に代入 17 movl 4(%ebp), %edx // mainから渡された eax(var) の値をレジスタ edx に代入 18 incw %edx // レジスタ edx の値を2増やす 19 movl %edx, 4(%ebp) // 2増やしたものを引数のあるスタックの場所に代入 20 ret // リターン (質問) 7 でレジスタ al に 1 を代入したのは何か意味があるのでしょうか。 17 の4(%ebp)はスタックポインタの1つ下、つまりmainから渡された引数でよろしいでしょうか。 18 の incw %edx はレジスタ edx の値を 2 増やすという意味でよろしいでしょうか。 13 でレジスタ ecx の値は 1236 になるので正しいでしょうか。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
>7 でレジスタ al に 1 を代入したのは何か意味があるのでしょうか。 初期化しないとeaxレジスタに何が入っているか判らないから。 alとは「eaxレジスタの下位8ビット」です。 aレジスタの下位8ビットは「al」 aレジスタの下位16ビットは「ax」 aレジスタの32ビット全体は「eax」 と表記し「どの表記も、同じレジスタの一部分または全部」を意味します。 本来、eaxを1にするには movb $1, %al だけでは、eaxの下位8ビットが1になるだけで上位24ビットが不定なので、 xor eax,eax //eaxを0にする movb $1, %al //alを1にする。結果、eaxが1になる か movb $1, %al cbtw //alをaxに符号拡張 cbtl //axをeaxに符号拡張 と書きます(符号拡張するコードを使うのは、-1~-128を代入する時の場合) なんで movl $1,eax と書かないかと言うと「32ビット定数のレジスタ代入は遅いしコードが長くなるから」です。 >18 の incw %edx はレジスタ edx の値を 2 増やすという意味でよろしいでしょうか。 違います。ワードサイズで「1」増やします。 が、これはコードが間違ってます。 incb dl incw dx incl edx のように、命令のサイズ指定(b/w/l)と、オペランドのレジスタサイズ(dl/dx/edx)は一致していなければなりません。 なお、一部のアセンブラは inc edx incb edx incw edx incl edx の4つ全部どれも incl edx と解釈して、incl edxの命令コードを生成する場合があります。 正確に incl edx と書かなければ、思わぬバグを発生させます。 なお、incwはワードサイズで1加算なので、 0x0000ffff⇒0x00000000 0x0001ffff⇒0x00010000 0x1234ffff⇒0x12340000 のように、下位16ビットでオーバーフローし、上位16ビットは変化しません。 >13 でレジスタ ecx の値は 1236 になるので正しいでしょうか。 10進数の1236にはなりません。 10進数の1235にもなりません。 16進数の0x1235、10進数でなら4661になります。 採点:60点 もう少し頑張りましょう。
その他の回答 (2)
- php504
- ベストアンサー率42% (926/2160)
386、Pentium系のCPUですよね ah+alはaxでした。eaxは32ビットですね edxも32ビットなので incw %edx じゃなくて incl %edx じゃなくていいのかな いやアセンブラ詳しくないので自信ないのですが
お礼
さっそくありがとうございます。 >ah+alはaxでした。 うーーん。勉強します。
- php504
- ベストアンサー率42% (926/2160)
gasでしょうか >7 でレジスタ al に 1 を代入したのは何か意味があるのでしょうか。 ahレジスタとalレジスタを合わせてeaxレジスタになるのだと思います。 >17 の4(%ebp)はスタックポインタの1つ下、つまりmainから渡された引数でよろしいでしょうか。 callの前にpushされた値ですね。その通りだと思います。 >18 の incw %edx はレジスタ edx の値を 2 増やすという意味でよろしいでしょうか。 incwは16ビットレジスタを1増やす命令だと思います。
お礼
さっそくご返事をいただきましてありがとうございます。 まだ勉強中ですので、The GNU Assembler の意味もよく分かりません。^^; 『プログラミングの力を生み出す本』を使っています。 >ahレジスタとalレジスタを合わせてeaxレジスタになる 初めて出会う言葉です。ちょっと良く考えてみます。
お礼
丁寧に教えていただいて、本当にありがとうございました。 おかげさまで霧が晴れました。 13 で新しい霧も出ましたが、これは何とか分かりそうです。 もう少し頑張ります。