翻譯自:-
intel
at&t
注釋;
//
指令不帶字尾add
帶有長度字尾的addq
暫存器使用
eax, ebx
%eax,%ebx
立即數使用
0x100
$0x100
暫存器值引用
[eax]
`(%eax)
間接定址
[base + reg + reg * scale + displacement]
`displacement(reg, reg, scale)``
在通常間接引用時,intel語法將會計算基址+偏移
,而且操作碼允許乙個單獨的立即數偏移,而在at&t語法中,你必須自己做,把相加的結果當做括號中第三個值。
主要的區別是intel不需要明確指出使用了指令運算元的長度,而at&t需要顯式地指明他們並且通過在指令操作碼後面跟上相應的長度字尾,下面是乙個兩個值相加的示例:
add eax, ebx;
這是intel語法,將兩個32bit的暫存器相加(因為eax和ebx都是32位暫存器),並且把結果放在了eax
,其中intel語法中目的暫存器放在前面,源暫存器放在後面。因為源和目標都是32bit,彙編器就知道他只需要轉換成32位的加指令
.而在at&t語法中,相同的指令需要寫成這樣:
addq %ebx, %eax ;
在at&t語法中,暫存器使用都需要帶有%
,並且源暫存器放在前面,目的暫存器放在後面,和intel是相反的,而且最大的區別是指令的q
字尾,q
是quadword
的縮寫,代表32bit值。這個語法明確告訴了彙編器操作碼的長度,不需要通過暫存器的大小來推測出來正確的指令長度。
可能在乙個指令中有兩個不同長度的暫存器,例如,將ebx
的低16位加到eax
中,intel語法只需要寫成這樣:
add eax, bx ;
但是在at&t語法中,你需要這樣寫:
addzqd %bx, %eax ;
其中指令字尾d
代表doubleword
,z
**它是乙個無符號相加(用零填充高位),如果我們是有符號相加,我們需要乙個符號擴充套件s
.
字尾』b』、『w』、'l』分別表示運算元為位元組(byte,8 bit)、字(word,16bit)和長字(long,32bit)
這樣看來intel語法更加簡潔,對程式設計人員更加友好,很可惜在linux上at&t才是主流。
AT T彙編和Intel彙編語法主要區別
at t使用 表示立即運算元,而intel的立即運算元是不需要界定的。因此,使用at t語法引用十進位制值4時,使用 4,使用intel語法時只需使用4。at t在暫存器名稱前加上字首 而intel不這樣做。因此,使用at t語法引用eax暫存器寫為 eax。at t語法處理源和目標運算元時使用相反...
ATT 彙編語法
在研華的pc104上使用看門狗要使用彙編。使用彙編來修改cmos裡面的引數。也就是內聯彙編。linux下gcc只支援att彙編。所以這兒有必要將att語法學習學習。以後需要的時候翻出來溫習溫習。1,運算元的長度 運算元的長度用加在指令後的符號表示 b byte,8 bit w word,16 bit...
彙編基本語法
直接來看一段 section text global start must be declared for linker ld start tells linker entry point mov edx,len message length mov ecx,msg message to write...