2016-09-20 17 views
0
add -0x4(%r12), %eax 
cmp %eax, %r12 

アセンブリでこれらの2行が指定されています。アセンブラで16進数と複数の引数を加算して比較します。

私の推測では、r12の値から4を引いて、それをeaxに追加すると思います。

r12は元の値から-4のままですか、値は元の値に保たれますか?

たとえば、r12 = 5で、eax = 3の場合、add関数はeax = 4となります。
r12はまだ5か、それとも1になりますか?

+0

タイトルを一般的なものに編集したいと思っています。これで、任意のコードフラグメントをテストする方法を示す回答が投稿されました。 Hrm。それは、通常、良いタイトルがあるべきものの反対です。 –

答えて

0

これは変更されません。r12;単にアドレスを計算するために使用します。

1

gdbでこれを単独で実行して、その処理を確認できます。最後のシングルステップで変更された登録を表示するようにgdbを設定します(layout regtag 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の最終値は、メモリ内の値によって異なります。

関連する問題