2011-07-25 5 views
4

movl (%eax), %eaxの意味は?GNU AS:movl(%eax)、%eax

私は十分に探知しましたが、ブラケット()が何を意味するのか把握できませんでした。また、私はいくつかの構文を参照してくださいmovl 8(%ebp), %eax

私はいくつかの良い参照をお勧めしますか?私はGoogleのトップ20の検索結果の中には何も見つかりませんでした。

+0

おそらく検索を妨げるが事実であることAT&T Intelは独自のバージョンのアセンブリを持っています。これはAT&Tの構文です。 –

+0

私はそれを理解していましたが、すべてのGNU AS構文を説明するまともな参照を見つけることができませんでした。 –

答えて

9

%eaxはEAXです。 (%eax)は、アドレスがレジスタEAXに含まれるメモリ位置です。 8(%eax)は、アドレスがEAX + 8の値であるメモリ位置です。

3

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

+0

リンクが亡くなった:( – steel

+1

@steel、私はそれを修正する – osgx

4

彼らは移動していますある場所から別の場所へデータを移動命令 - これらの例では、メモリからレジスタへ:

register_eax = *(unsigned long *)register_eax; 

あなたの他の例では、何かのようである:

register_eax = *(unsigned long *)(register_ebp + 8); 
関連する問題