為什么是匯編語言
本文關(guān)鍵詞:匯編語言,由筆耕文化傳播整理發(fā)布。
為什么是匯編語言 Posted on
語言的編譯過程就是把高級語言轉(zhuǎn)換成計算機(jī)能夠理解的二進(jìn)制機(jī)器指令的過程。這種轉(zhuǎn)換會產(chǎn)生一些效率不是很高的代碼。所以對一些效率要求高,或者對性能影響大的代碼都會直接用低級的匯編語言來編寫。
匯編器是專門用來把低級匯編語言編譯成機(jī)器碼的二進(jìn)制程序或者目標(biāo)文件。
基于每個體系設(shè)計的cpu都會有其對應(yīng)的匯編語言,比如x86,arm
C語言的編譯過程
預(yù)處理->編譯(得到.s)->匯編(得到.o)->鏈接 (得到二進(jìn)制)
每一個c源文件都會得到一個目標(biāo)文件(.o),然后會把這些相關(guān)的目標(biāo)文件鏈接成一個二進(jìn)制文件。
其實每一種高級語言都會被編譯成匯編語言,最后得到二進(jìn)制文件,所以了解匯編語言是很重要的。
AT&T匯編用GNU GAS編譯,intel 匯編用NASM編譯
數(shù)據(jù)在內(nèi)存中存放的一個重要特點(diǎn):高位對應(yīng)高地址,低位對應(yīng)低地址
立即數(shù)
立即數(shù)相當(dāng)于高級語言中的常量,不用存儲在寄存器中,可以在表達(dá)是中直接使用
比如
movl $0x04,%ebx ;就相當(dāng)于把0x04這個值放入寄存器ebx
movl 0x04,%ebx ;就相當(dāng)于把從內(nèi)存地址0x04開始的4個字節(jié)的內(nèi)容放入寄存器ebx
而在intel匯編中,立即數(shù)是不需要任何符號的,取內(nèi)存里面的值要加[ ]
movl %ebp,%eax #把ebp里面的內(nèi)容放到eax里面
movl -4(%ebp),%eax #從(ebp-4)這個地址開始的4個字節(jié)的內(nèi)容放到eax里面,注意section:disp(base, index, scale)這種寫法本身就表示地址,不是立即數(shù),就只能取值
間接操作數(shù)含有實際操作數(shù)的地址值,AT&T語法通過在一個操作數(shù)前添加*來指定一個間接操作數(shù)。只有在間接跳轉(zhuǎn)/調(diào)用指令時才使用間接操作數(shù)。
jmp *%ebx #ebx的值是跳轉(zhuǎn)的目標(biāo)位置
jmp *(%ebx) #從ebx值的指定的地址處讀取跳轉(zhuǎn)的目標(biāo)位置
在一個目標(biāo)文件中text區(qū)從地址0開始,,隨后是data區(qū),然后是bss區(qū)
每個區(qū)都有意個位置計數(shù)器,它會對每個匯編進(jìn)該區(qū)的字節(jié)進(jìn)行計數(shù);.align可以改變位置計數(shù)器的值
bss區(qū)用于存放未被初始化的變量或者作為局部公共變量存儲空間
.lcomm用于在bss區(qū)定義一個符號
.comm用于在bss區(qū)定義一個公共符號
在程序運(yùn)行之前不能在bss區(qū)放置數(shù)據(jù),因為程序開始之前,所有bss區(qū)的內(nèi)容都會被清零
absolute區(qū)在重定位后地址保持不變,兩個目標(biāo)文件中absolute區(qū)中地址相同的數(shù)據(jù)會因為重疊而被一個覆蓋
特殊符號'.'表示as匯編的當(dāng)前地址因此 mylab: .long . 表示把mylab它自己所處地址的值,給'.'賦值如同‘.org'的作用,因此 .=.+4和 .space 4一樣
語句
可以是只含空格 制表符 換行符的空行,也可以是1)賦值語句 2)偽操作符語句3)機(jī)器指令語句
1)賦值語句
BOOTSEG = 0x70C0
2)偽操作符語句
以一個點(diǎn)開始的匯編語句叫做,匯編命令(偽指令,指示符)。偽指令的地址是點(diǎn)符號出現(xiàn)處,機(jī)器指令第一個字節(jié)的位置。它本身不產(chǎn)生任何代碼。
.globl begtext, begdata, begbss, endtext, enddata, endbss
3)機(jī)器指令
每個機(jī)器指令前面都可以有一個標(biāo)號。機(jī)器指令可以由 標(biāo)號 + 指令助記符 + 操作數(shù) 三個字段組成。
任何標(biāo)號定義都會取用位置計數(shù)器的當(dāng)前值。標(biāo)號本身不占內(nèi)存,它的地址是后面的機(jī)器指令的第一個字節(jié)的位置,我通過gdb的info line查看了。(位置計數(shù)器我還是不太清楚到底是干什么的)
AT&T匯編語句以換行符或者;結(jié)束,最后的一個語句必須以換行符結(jié)束
PS:intel匯編都是以換行符結(jié)束的,所以intel匯編可以用;來注釋
注釋
intel 匯編的注釋是!或者;
AT&T的注釋是shell 風(fēng)格的#或者c風(fēng)格/* */或者c++風(fēng)格的//
匯編語言的一個突出優(yōu)點(diǎn)就是可以使用符號(symbol),正是因為有了符號匯編語言才變得容易理解,便于記憶(相對于機(jī)器指令而言)
標(biāo)號是符號的一種
movz: 零擴(kuò)展,高位用0補(bǔ)齊
movb $0x80,%bl
movzbw %bl,%ax
ax就變成了0x0080
movs: 符號擴(kuò)展,高位用原最高位補(bǔ)齊
movb $0x80,%bl
movsbl %bl,%ax
ax就變成了0xFF80
本文關(guān)鍵詞:匯編語言,由筆耕文化傳播整理發(fā)布。
本文編號:510348
本文鏈接:http://www.sikaile.net/wenshubaike/dxkc/510348.html