天堂国产午夜亚洲专区-少妇人妻综合久久蜜臀-国产成人户外露出视频在线-国产91传媒一区二区三区

當(dāng)前位置:主頁 > 論文百科 > 大學(xué)課程 >

為什么是匯編語言

發(fā)布時間:2017-07-02 15:02

  本文關(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

資料下載
論文發(fā)表

本文鏈接:http://www.sikaile.net/wenshubaike/dxkc/510348.html


Copyright(c)文論論文網(wǎng)All Rights Reserved | 網(wǎng)站地圖 |

版權(quán)申明:資料由用戶50b8c***提供,本站僅收錄摘要或目錄,作者需要刪除請E-mail郵箱bigeng88@qq.com