Linux下的匯編語言之語法格式介紹
作為最基本的編程語言之一,匯編語言雖然應(yīng)用的范圍不算很廣,但重要性卻勿庸置疑,因?yàn)樗軌蛲瓿稍S多其它語言所無法完成的功能。就拿 Linux 內(nèi)核來講,雖然絕大部分代碼是用 C 語言編寫的,但仍然不可避免地在某些關(guān)鍵地方使用了匯編代碼,其中主要是在 Linux 的啟動(dòng)部分。由于這部分代碼與硬件的關(guān)系非常密切,即使是 C 語言也會(huì)有些力不從心,而匯編語言則能夠很好揚(yáng)長(zhǎng)避短,***限度地發(fā)揮硬件的性能。
***課時(shí):Linux 匯編語法格式:
絕大多數(shù) Linux 程序員以前只接觸過DOS/Windows 下的匯編語言,這些匯編代碼都是 Intel 風(fēng)格的。但在 Unix 和 Linux 系統(tǒng)中,更多采用的還是 AT&T 格式,兩者在語法格式上有著很大的不同:
在 AT&T 匯編格式中,寄存器名要加上 '%' 作為前綴;而在 Intel 匯編格式中,寄存器名不需要加前綴。例如:
AT&T 格式pushl %ex
Intel 格式push eax
在 AT&T 匯編格式中,用 '$' 前綴表示一個(gè)立即操作數(shù);而在 Intel 匯編格式中,立即數(shù)的表示不用帶任何前綴。例如:
AT&T 格式 pushl $1
Intel 格式push 1
AT&T 和 Intel 格式中的源操作數(shù)和目標(biāo)操作數(shù)的位置正好相反。在 Intel 匯編格式中,目標(biāo)操作數(shù)在源操作數(shù)的左邊;而在 AT&T 匯編格式中,目標(biāo)操作數(shù)在源操作數(shù)的右邊。例如:
AT&T 格式addl $1, %eax
Intel 格式add eax, 1
在 AT&T 匯編格式中,操作數(shù)的字長(zhǎng)由操作符的***一個(gè)字母決定,后綴'b'、'w'、'l'分別表示操作數(shù)為字節(jié)(byte,8 比特)、字(word,16 比特)和長(zhǎng)字(long,32比特);而在 Intel 匯編格式中,操作數(shù)的字長(zhǎng)是用 "byte ptr" 和 "word ptr" 等前綴來表示的。例如:
AT&T 格式movb val, %al
Intel 格式mov al, byte ptr val
在 AT&T 匯編格式中,絕對(duì)轉(zhuǎn)移和調(diào)用指令(jump/call)的操作數(shù)前要加上'*'作為前綴,而在 Intel 格式中則不需要。
遠(yuǎn)程轉(zhuǎn)移指令和遠(yuǎn)程子調(diào)用指令的操作碼,在 AT&T 匯編格式中為 "ljump" 和 "lcall",而在 Intel 匯編格式中則為 "jmp far" 和 "call far",即:
AT&T 格式 ljump $section, $offset lcall $section, $offset
Intel 格式j(luò)mp far section:offset call far section:offset
與之相應(yīng)的遠(yuǎn)程返回指令則為:
AT&T 格式 lret $stack_adjustret
Intel 格式far stack_adjust
在 AT&T 匯編格式中,內(nèi)存操作數(shù)的尋址方式是:section:disp(base, index, scale)
而在 Intel 匯編格式中,內(nèi)存操作數(shù)的尋址方式為:section:[base + index*scale + disp]
由于 Linux 工作在保護(hù)模式下,用的是 32 位線性地址,所以在計(jì)算地址時(shí)不用考慮段基址和偏移量,而是采用如下的地址計(jì)算方法:
disp + base + index * scale
下面是一些內(nèi)存操作數(shù)的例子:
AT&T 格式movl -4(%ebp), %eax movl array(, %eax, 4), %eax movw array(%ebx, %eax, 4), %cx movb $4, %fs:(%eax)
Intel 格式mov eax, [ebp - 4] mov eax, [eax*4 + array] mov cx, [ebx + 4*eax + array] mov fs:eax, 4
【編輯推薦】
- 2.3 用匯編語言編寫程序
- 術(shù)語匯編 基本CSS濾鏡概述
- 琢石成器—Windows環(huán)境下32位匯編語言程序設(shè)計(jì)
- 3.1.3 as86匯編語言程序的編譯和鏈接
- 3.1.2 as86匯編語言程序
- 3.1.1 as86匯編語言語法
- 3.2.6 as匯編命令