2011-07-25 119 views
4

movl (%eax), %eax是什麼意思?GNU AS:movl(%eax),%eax

我已經搜索了足夠多,但無法弄清楚括號()的含義。此外,我看到一些語法如movl 8(%ebp), %eax

有人可能會建議我一些很好的參考嗎?我無法在Google的前20個搜索結果中找到任何內容。

+0

可能阻礙了搜索的事實是,AT&T和英特爾有他們自己的彙編版本 - 這是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語法的快速介紹。用at&t asm syntax搜索。

該帖子是「AT & T Assembly Syntax」by vivek(http://web.archive.org/web/20080228052132/http://sig9.com/blog/vivek),2003-09-01。有一個關於主要信息AT &牛逼從中:

例如,一個基本的數據移動指令在INTEL語法的一般格式是,

mnemonic destination, source 

然而,在的AT & T箱體內,一般格式是

mnemonic source, destination 

(我記得這個命令是因爲調用AT & T asm作爲真正的unix asm,所以它是正確的之一,並且它將數據流向右側;而英特爾的語法是基於一些不正確的masms文檔,這顯然不適合Unix世界中,他們離開和數據流向左)

的IA-32架構的所有寄存器名必須前綴由'%'符號表示,例如。 %al,%bx,%ds,%cr0等

所有文字值必須以'$'爲前綴。例如,

mov $100, %bx 
mov $A, %al 

第一指令將值100到寄存器AX和第二個移動ASCII A的數值到AL寄存器中。

在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 

僅specfies該值10將被移動到存儲器100的偏移,而不是傳輸大小。在NASM中,這是通過將鑄造關鍵字字節/字/雙字等添加到任何操作數來完成的。在AT & T語法中,這是通過向指令添加後綴-b/w/l來完成的。例如,

movb $10, %es:(%eax) 

一個字節值10移動到存儲位置[EA:EAX],反之,

movl $10, %es:(%eax) 

移動的長值(DWORD)10到同一個地方。

jmp,call,ret等指令將控件從程序的一個部分轉移到另一部分。它們可以分類爲控制轉移到相同的代碼段(近)或不同的代碼段(遠)。分支尋址的可能類型是 - 相對偏移量(標籤),寄存器,內存操作數和段偏移量指針。

相對偏移量,使用標籤指定,如下所示。

label1: 
    . 
    . 
    jmp label1 

分公司使用的寄存器或存儲器的操作數尋址必須由 '*' 作爲前綴。要指定「遠」控制tranfers,一個「L」必須被前綴,如在「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 

段偏移指針指定使用格式如下:

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);