'$'後跟標識符是什麼意思?
x86彙編,AT & T語法。
'$'後跟標識符是什麼意思?
x86彙編,AT & T語法。
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字節地址。
通常它意味着一個「立即」值,即一個數字,而不是另一個寄存器值,從內存中檢索出來的東西等等。因此,在這種情況下,它將與符號_start
相關聯的數字移動到eax寄存器。
這個確切的問題是[從頭開始編程](http://programminggroundup.blogspot.ca/2007/01/programming-from-ground-up.html)的練習之一。 – user240515 2012-06-06 06:50:36