at&t彙編與intel彙編的一些區別
前些天在看kernel的i386的bootsect.s檔案,該檔案在1.11版本的時候還是用intel彙編的格式寫的,不過我又讀了2.4.20的 bootsect.s,裡頭卻是at&t的格式,不知道這個改動是在哪個版本發生的。由於很久沒有接觸過彙編,再加上bootsect.s中的內 容涉及很多的底層,例如硬碟的讀取,int中斷等等;讓我花了非常多的時間才搞清楚了bootsect.s的工作原理。
at&t的彙編和intel的彙編主要是語法格式的區別,然後是指令的區別。at&t的彙編指令和intel的彙編指令大體相同,但是在 一些地方有些微的區別。我們先來看at&t和intel的格式差別,這些在網上很容易搜到,就當整理記錄吧。
at&t與intle的彙編格式區別:
1)at&t組合語言中源運算元和目的運算元的位置與intel的語法正好相反。
原本我沒有太在意這個,因為在遇到mov指令的時候,at&t的格式反而更符合閱讀習慣,但是在遇到subw %bx,%ax這個語句的時候,曾經讓我困惑了很久,最後才反應過來,源運算元和目的運算元位置相反了;剛開始很不適應,因為sub這些指令我覺得 intel的格式更符合習慣(還有其他的cmp等等)。
2)字首。at&t中所有立即數字首$:$ 7,暫存器前要加%:%eax(據說後者是gnu的as的特性,而不是at&t的)
3)字尾。at&t中所有的操作碼多有字尾:」b」 「w」 「l」,intel使用的是」byte ptr」、」word ptr」。如movb,movw,movl。分別進行8位(byte)、16位(word)和32位(long)的資料傳送。順道提一下,如果mov後面 沒有加字尾,gnu的as程式將根據運算元中的暫存器補上相應的字尾。
4)間接定址的表示:intel的間接定址用」」,而at&t用」()」。
at&t: movw 4(%bp), %dx
intel: mov dx,[bp+4]
你還有可能見到以下兩種:
at&t: _var( , %ebx , 4)
intel: [_var + ebx * 4]
at&t: _array(%eax, %ebx, 8 )
intel: [%eax + %ebx * 8 + _array]
上面的兩種其實是一樣的,只是前者省略了第乙個引數而已。
在清楚上面幾個差別清楚之後,只要你能看的懂intel的彙編,看at&t的基本也沒什麼問題了。事實上,我是intel的和at&t匯 編對照著看的,尤其是在看at&t的某個地方被「一葉障目」的時候,再看看intel的彙編很有可能會恍然大悟。
然後就是指令上的一些差別了。at&t的彙編指令和intel的基本一致,但是在以下地方需要注意一下:
1)在at&t彙編指令中,直接遠跳轉/呼叫的指令格式是
lcall/ljmp $section,$offset」
同樣,遠端返回的指令是「lret $stack-adjust」;而在intel格式中,相應的指令分別為
call/jmp far section:offset
和ret far stack-adjust
。其實和mov這些指令的字尾差不多,只是lcall是字首。
2)一些型別轉換指令。轉換關係如下(均用符號位擴充套件):
a. cbw cbtw :%al->%ax
b. cwde cwtl :%ax->%eax
c. cwd cwtd :%ax->%dx : %ax
d. cdq cltd :%eax->%edx : %eax
整個bootsect.s並不難看懂,網上有很多的資料。主要是你可能得了解一些關於硬碟的知識,例如硬碟參數列的存放位置、硬碟的讀取順序等;然後是 intel提供的中斷向量:int xxh ;還有就是你的彙編功底了,只要你對微機原理還有稍許印象,再找乙個彙編指令手冊就行,通常你的微機原理課本就可以勝任了。
發表於 @ 2023年05月19日 01:03:00
AT T彙編格式與Intel彙編格式的比較
gcc採用的是at t的彙編格式,也叫gas格式 gnu asembler gnu彙編器 而微軟採用intel的彙編格式.一 基本語法 語法上主要有以下幾個不同.1 暫存器命名原則 at t intel 說明 eax eaxintel的不帶百分號 2 源 目的運算元順序 at t intel 說明m...
AT T彙編格式與Intel彙編格式的比較
gcc採用的是at t的彙編格式,也叫gas格式 gnu asembler gnu彙編器 而微軟採用intel的彙編格式.一 基本語法 語法上主要有以下幾個不同.1 暫存器命名原則 at t intel 說明 eax eaxintel的不帶百分號 2 源 目的運算元順序 at t intel 說明m...
AT T彙編格式與Intel彙編格式的比較
gcc採用的是at t的彙編格式,也叫gas格式 gnu asembler gnu彙編器 而微軟採用intel的彙編格式.一 基本語法 語法上主要有以下幾個不同.1 暫存器命名原則 at t intel 說明 eax eaxintel的不帶百分號 2 源 目的運算元順序 at t intel 說明m...