• 締切済み

asアセンブラに関しまして

movl $(__KERNEL_CS << 16),%eax movw %ax,%dx 上記のソースに関しまして、32bit レジスタ %eax に格納した値を次の行で、 16bit レジスタ%dx に代入していますが。 この時、%ax の指している16ビットの範囲は、%eax の下位16bit になるのでしょうか?

みんなの回答

回答No.2

gnu as ということで、gcc など使えると考えて回答します。(windows等は詳しくないです) この質問というよりも一般的な回答ですが。 コードは、カーネル内とかカーネルのブート中なのかもしれないですが 適当なOS上でテストプログラム作って,gdb使えば簡単だと思います。 具体的にはステップ実行して、レジスタの内容を見ます。 私もアセンブラはあまり詳しくないので、アセンブラで全部書くのは苦なので ---------- int main(void) { return 0; } ----------- みたいなのを、 gcc -S hoge.c とすれば、gcc が細かい部分を作ってくれるので この中に 質問の部分の コード埋めればいいと思います。 私のところではこんな風だったので ---------------- .file "hoge.c" .text .globl main .type main, @function main: leal 4(%esp), %ecx andl $-16, %esp pushl -4(%ecx) pushl %ebp movl %esp, %ebp pushl %ecx movl $0, %eax popl %ecx popl %ebp leal -4(%ecx), %esp ret .size main, .-main .ident "GCC: (GNU) 4.1.1" .section .note.GNU-stack,"",@progbits ----------------------- こんな風にコードを入れればいいと思います。 ----------------------- .file "hoge.c" .text .globl main .type main, @function main: leal 4(%esp), %ecx andl $-16, %esp pushl -4(%ecx) pushl %ebp movl %esp, %ebp pushl %ecx movl $(0x44 << 16),%eax movw %ax,%dx movl $0, %eax popl %ecx popl %ebp leal -4(%ecx), %esp ret .size main, .-main .ident "GCC: (GNU) 4.1.1" .section .note.GNU-stack,"",@progbits --------------------- とやればいいと思います。 で、 hoge.s ができるので gcc -g hoge.s して gdb でステップ実行して下さい。 gdb でレジスタ見たい場合は info r です。 どこにコード挿入すればいいかは、 いろいろ関数作って試していけば分かるかもしれません。

  • osamuy
  • ベストアンサー率42% (1231/2878)
回答No.1

なります。