movl (%eax), %eax
の意味は?GNU AS:movl(%eax)、%eax
私は十分に探知しましたが、ブラケット()が何を意味するのか把握できませんでした。また、私はいくつかの構文を参照してくださいmovl 8(%ebp), %eax
私はいくつかの良い参照をお勧めしますか?私はGoogleのトップ20の検索結果の中には何も見つかりませんでした。
movl (%eax), %eax
の意味は?GNU AS: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(&t)のasm構文への簡単な紹介です。 googledによってat&t asm syntax
。
投稿は、 "AT & Tアセンブリ構文" by vivek(http://web.archive.org/web/20080228052132/http://sig9.com/blog/vivek)、2003-09-01です。一方
例えば、インテルの構文での基本的なデータ移動命令の一般的な形式は、
mnemonic destination, source
で、:それから& T ATについての主な情報がありますAT & Tの場合、一般的な形式は
mnemonic source, destination
あります
(この注文を本物のunix asmとしてAT & T asmと呼んでいるので、右です。データは右に流れます。インテルの構文はUnixの世界のために明確に権利はない、いくつかの間違ったmasmsドキュメント、に基づいていたが、それらははを残しているとのデータが左に流れる)
すべてのIA-32アーキテクチャーの名前を登録する接頭辞として付ける必要があり'%'記号で、例えば、。 %al、%bx、%ds、%cr0など
すべてのリテラル値の前に '$'記号を付ける必要があります。例えば、
mov $100, %bx
mov $A, %al
最初の命令は、レジスタAXに値100を移動させ、第二の一方がALレジスタにASCII文字Aの数値を移動させます。 AT & T構文で
、メモリは、次のようにしたいアドレスに応じて省略することができたの
segment-override:signed-offset(base,index,scale)
部分を参照されます。
%es:100(%eax,%ebx,2)
オフセットとスケールは「$」で始まるべきではないことに注意してください。それらと同等NASM-構文でより多くのいくつかの例では、物事が明確
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
は、100ではなく、転送サイズをオフセット値10は、メモリに移動されることをspecfies。 NASMでは、キャストキーワードbyte/word/dwordなどをオペランドのいずれかに追加することでこれを行います。 AT & T構文では、これは接尾辞-b/w/l-を命令に追加することによって行われます。例えば、
movb $10, %es:(%eax)
は[EA:EAX]メモリ位置にバイト値10を移動させ、
movl $10, %es:(%eax)
が長い値(DWORD)を移動させ、一方、10同じ場所に。
jmp、call、retなどの命令は、コントロールをプログラムの一部から別の部分に転送します。これらは、同じコードセグメント(近く)または異なるコードセグメント(遠い)への制御転送として分類できます。可能なタイプの分岐アドレッシングは、相対オフセット(ラベル)、レジスタ、メモリオペランド、およびセグメントオフセットポインタです。
相対オフセットは、次のようにラベルを使用して指定します。レジスタまたはメモリのオペランドを使用して対処する
label1:
.
.
jmp label1
支店は、 '*' を前置する必要があります。 「LJMP」、「LCALL」などで例えば、
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
セグメントオフセットポインタを使用して指定されているように、「遠い」コントロールtranfersを指定するために、「L」は、前置されなければなりません次の形式:
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);
おそらく検索を妨げるが事実であることAT&T Intelは独自のバージョンのアセンブリを持っています。これはAT&Tの構文です。 –
私はそれを理解していましたが、すべてのGNU AS構文を説明するまともな参照を見つけることができませんでした。 –