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語法的快速介紹。用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
他們舉動指令,移動從一個地方到另一個數據 - 在這種情況下,從內存到寄存器:
register_eax = *(unsigned long *)register_eax;
你的另一個例子是這樣的:
register_eax = *(unsigned long *)(register_ebp + 8);
可能阻礙了搜索的事實是,AT&T和英特爾有他們自己的彙編版本 - 這是AT&T語法。 –
我已經想通了,但我無法找到一個體面的參考來解釋所有的GNU AS語法。 –