add -0x4(%r12), %eax
cmp %eax, %r12
アセンブリでこれらの2行が指定されています。アセンブラで16進数と複数の引数を加算して比較します。
私の推測では、r12の値から4を引いて、それをeaxに追加すると思います。
r12は元の値から-4のままですか、値は元の値に保たれますか?
たとえば、r12 = 5で、eax = 3の場合、add関数はeax = 4となります。
r12はまだ5か、それとも1になりますか?
add -0x4(%r12), %eax
cmp %eax, %r12
アセンブリでこれらの2行が指定されています。アセンブラで16進数と複数の引数を加算して比較します。
私の推測では、r12の値から4を引いて、それをeaxに追加すると思います。
r12は元の値から-4のままですか、値は元の値に保たれますか?
たとえば、r12 = 5で、eax = 3の場合、add関数はeax = 4となります。
r12はまだ5か、それとも1になりますか?
これは変更されません。r12
;単にアドレスを計算するために使用します。
gdbでこれを単独で実行して、その処理を確認できます。最後のシングルステップで変更された登録を表示するようにgdbを設定します(layout reg
、x86tag wikiの下部を参照)。 %r12
は、ADDのためのソースオペランドのための有効なポインタである必要があるので
、foo.S
でこれを置く:
.globl _start
_start:
mov %rsp, %r12 # added this instruction: r12 is now a valid pointer to stack memory, since we copy the stack pointer into it
add -0x4(%r12), %eax
# cmp %eax, %r12 # operand-size mismatch is an error
cmp %eax, %r12d # 32-bit compare
cmp %rax, %r12 # 64-bit compare. upper 32 of RAX is zero from writing EAX in the add instruction
# your program will segfault here because we don't make an exit() system call, and instead keep executing whatever bytes are next in memory.
は静的なバイナリを作るためにgcc -g -nostdlib foo.S
でそれを組み立てます。 _start is the default entry point。
実行gdb ./a.out
:
(gdb) layout reg
(gdb) b _start
(gdb) r
(gdb) si # step instruction,
# repeat as necessary and watch gdb highlight changed registers.
私が代わりに& T構文ATのset disassembly-flavor intel
好きですが、あなたが好きな(または& T構文で学習する必要があります/したい)場合は、それをしないでください。
ヒントCMP doesn't modify either of its operands ADDは、ソースデータの4バイトをロードするアドレッシングモードとしてR12のみを使用します。
EAXの最終値は、メモリ内の値によって異なります。
タイトルを一般的なものに編集したいと思っています。これで、任意のコードフラグメントをテストする方法を示す回答が投稿されました。 Hrm。それは、通常、良いタイトルがあるべきものの反対です。 –