`movl(%eax)、%eax`のブラケットは何を意味しますか?
質問
私は十分にグーグルで検索しましたが、ブラケットが何であるかを理解できませんでした ()
意味。また、いくつかの構文が表示されます movl 8(%ebp), %eax
誰かが私に良い参照を提案することができますか? Googleの上位20の結果を見つけることができませんでした。
解決
%eax
登録eaxです。 (%eax)
アドレスがレジスタEAXに含まれているメモリの場所です。 8(%eax)
アドレスがEAXプラス8の値であるメモリの場所です。
他のヒント
http://web.archive.org/web/20080215230650/http://sig9.com/articles/att-syntax UNIX(AT&T)ASM構文をすばやく紹介します。 byでグーグル at&t asm syntax
.
投稿はVivekによる「AT&Tアセンブリ構文」です。http://web.archive.org/web/20080228052132/http://sig9.com/blog/vivek)、2003-09-01。 AT&Tについての主な情報があります:
たとえば、Intel-Syntaxの基本的なデータ移動命令の一般的な形式は、
mnemonic destination, source
一方、AT&Tの場合、一般的な形式は
mnemonic source, destination
(私はこの注文を覚えていますAT&T ASMを本物のUNIX ASMとして呼ぶので、それはそうです 右 1つと、データを右に流します。 Intelの構文はいくつかの誤ったMASMSドキュメントに基づいていましたが、これは明らかにUNIXの世界には適切ではありませんが、 左 とデータが左に流れます)
IA-32アーキテクチャのすべての登録名は、例えば「%」サインが付いている必要があります。 %al、%bx、%ds、%cr0など。
すべてのリテラル値は、「$」の記号で前に付けなければなりません。例えば、
mov $100, %bx mov $A, %al
最初の命令は、値100をレジスタAxに移動し、2番目の命令はASCII Aの数値値をALレジスタに移動します。
AT&T構文では、メモリは次の方法で参照されます。
segment-override:signed-offset(base,index,scale)
必要なアドレスに応じてその一部を省略できます。>%ES:100(%EAX、%EBX、2)
オフセットとスケールには「$」で付けられないでください。同等のnasm-syntaxを使用したいくつかの例は、物事をより明確にする必要があります。
GAS memory operand NASM memory operand ------------------ ------------------- 100 [100] %es:100 [es:100] (%eax) [eax] (%eax,%ebx) [eax+ebx] (%ecx,%ebx,2) [ecx+ebx*2] (,%ebx,2) [ebx*2] -10(%eax) [eax-10] %ds:-10(%ebp) [ds:ebp-10] Example instructions, mov %ax, 100 mov %eax, -100(%eax)
オペランドサイズ。時には、特にリテラル値をメモリに移動する場合、移動のサイズまたはオペランドサイズを指定することが必要になります。たとえば、指示、
mov $10, 100
値10がメモリオフセット100に移動することをスペックフィーのみが、転送サイズではありません。 NASMでは、これはキャストキーワードバイト/ワード/Dワードなどをオペランドのいずれかに追加することで行われます。 AT&T構文では、これは命令に接尾辞-B/W/L-を追加することによって行われます。例えば、
movb $10, %es:(%eax)
バイト値10をメモリの位置[EA:EAX]に移動しますが、
movl $10, %es:(%eax)
長い値(DWORD)10を同じ場所に移動します。
JMP、Call、Retなどは、プログラムのある部分から別の部分にコントロールを転送します。それらは、同じコードセグメント(近く)または異なるコードセグメント(FAR)への制御転送として分類できます。ブランチアドレス指定の可能なタイプは、相対オフセット(ラベル)、レジスタ、メモリオペランド、およびセグメントオフセットポインターです。
相対オフセットは、以下に示すように、ラベルを使用して指定されています。
label1: . . jmp label1
レジスタまたはメモリオペランドを使用したブランチアドレス指定には、 '*'が付いている必要があります。 「ljmp」、 'lcall'などのように、「遠い」コントロールトランファーを指定するには、「l」をプレフィックスする必要があります。たとえば
GAS syntax NASM syntax ========== =========== jmp *100 jmp near [100] call *100 call near [100] jmp *%eax jmp near eax jmp *%ecx call near ecx jmp *(%eax) jmp near [eax] call *(%ebx) call near [ebx] ljmp *100 jmp far [100] lcall *100 call far [100] ljmp *(%eax) jmp far [eax] lcall *(%ebx) call far [ebx] ret retn lret retf lret $0x100 retf 0x100
セグメントオフセットポインターは、次の形式を使用して指定されています。
jmp $segment, $offset
彼はまた、GNUを(ガス)ドキュメントとして推奨しています: http://web.archive.org/web/20080313132324/http://sourceware.org/binutils/docs-2.16/as/index.html
彼らはそうです 動く 指示、データをある場所から別の場所に移動する - これらの場合、メモリからレジスタへ:
register_eax = *(unsigned long *)register_eax;
あなたの他の例は次のようなものです:
register_eax = *(unsigned long *)(register_ebp + 8);