2011-02-03 88 views
6

'$'後跟標識符是什麼意思?

x86彙編,AT & T語法。

+0

這個確切的問題是[從頭開始編程](http://programminggroundup.blogspot.ca/2007/01/programming-from-ground-up.html)的練習之一。 – user240515 2012-06-06 06:50:36

回答

11

AT AT & T語法$表示將隨後的內容視爲立即數而非內存地址。換句話說,

movl $_start, %eax 

將符號_start的地址加載到%eax;

movl _start, %eax 

從內存中的地址_start中讀取4個字節到%eax中。如果你看一下兩者的反彙編:

0: b8 00 00 00 00   mov $0x0,%eax 
     1: R_386_32 _start 
5: a1 00 00 00 00   mov 0x0,%eax 
     6: R_386_32 _start 

你可以看到,唯一的區別是操作碼。易於使用的名稱爲Intel® 64 and IA-32 Architectures Software Developer's Manual(您希望第2卷是指令集引用)表示操作碼B8至BF編碼爲「將即時16/32位常量加載到寄存器中」(這是代碼註定爲加載到一個32位的代碼段,所以它是一個32位的加載;對於一個16位的加載,你會有一個「操作數大小覆蓋」前綴字節,66)和操作代碼A1編碼「加載32位數量在指定從DS(或任何其他段,具有適當的前綴字節)的32位偏移到EAX中。「使用典型的「平坦」內存模型,這是「在指定的32位絕對地址加載32位數量」的道德等價物,但您可以看到x86如何在機器級別獲得其可信度非常高的聲譽。

在你想知道的情況下,這是它會是什麼樣子,如果我們使用EBX改爲:

a: bb 00 00 00 00   mov $0x0,%ebx 
     b: R_386_32 _start 
f: 8b 1d 00 00 00 00  mov 0x0,%ebx 
     11: R_386_32 _start 

負載立即仍然可以用一個字節指令不計算操作完成(這是因爲內部寄存器順序是AX,CX,DX,BX,SP,BP,SI,DI - 嚴重),但絕對地址的負載現在有兩個字節指令,8B 1D;第二個字節是英特爾所稱的「ModRM」字節,它指定了EBX和隨後的絕對4字節地址。

2

通常它意味着一個「立即」值,即一個數字,而不是另一個寄存器值,從內存中檢索出來的東西等等。因此,在這種情況下,它將與符號_start相關聯的數字移動到eax寄存器。