匯編語(yǔ)言(assembly language)是一種用于電子計(jì)算機(jī)般婆、微處理器已卷、微控制器或其他可編程器件的低級(jí)語(yǔ)言,亦稱(chēng)為符號(hào)語(yǔ)言雁比。在匯編語(yǔ)言中稚虎,用助記符(Mnemonics)代替機(jī)器指令的操作碼,用地址符號(hào)(Symbol)或標(biāo)號(hào)(Label)代替指令或操作數(shù)的地址偎捎。在不同的設(shè)備中蠢终,匯編語(yǔ)言對(duì)應(yīng)著不同的機(jī)器語(yǔ)言指令集非洲,通過(guò)匯編過(guò)程轉(zhuǎn)換成機(jī)器指令。普遍地說(shuō)蜕径,特定的匯編語(yǔ)言和特定的機(jī)器語(yǔ)言指令集是一一對(duì)應(yīng)的,不同平臺(tái)之間不可直接移植两踏。
許多匯編程序?yàn)槌绦蜷_(kāi)發(fā)、匯編控制兜喻、輔助調(diào)試提供了額外的支持機(jī)制梦染。有的匯編語(yǔ)言編程工具經(jīng)常會(huì)提供宏,它們也被稱(chēng)為宏匯編器朴皆。
匯編語(yǔ)言不像其他大多數(shù)的程序設(shè)計(jì)語(yǔ)言一樣被廣泛用于程序設(shè)計(jì)帕识。在今天的實(shí)際應(yīng)用中,它通常被應(yīng)用在底層遂铡,硬件操作和高要求的程序優(yōu)化的場(chǎng)合肮疗。驅(qū)動(dòng)程序、嵌入式操作系統(tǒng)和實(shí)時(shí)運(yùn)行程序都需要匯編語(yǔ)言扒接。
匯編語(yǔ)言的主體是匯編指令伪货。匯編指令和機(jī)器指令的差別在于指令的表示方法上。匯編指令是機(jī)器指令便于記憶的書(shū)寫(xiě)格式钾怔。
匯編指令編寫(xiě)的程序通過(guò)編譯器轉(zhuǎn)換成計(jì)算機(jī)能讀懂的機(jī)器指令碱呼,再進(jìn)行執(zhí)行。
CPU寄存器
8086 CPU 寄存器總共為 14 個(gè)宗侦,且均為 16 位 愚臀。
即 AX,BX矾利,CX姑裂,DX,SP男旗,BP舶斧,SI,DI剑肯,IP捧毛,F(xiàn)LAG,CS让网,DS呀忧,SS,ES 共 14 個(gè)溃睹。
- 通用寄存器
通用寄存器可用于傳送和暫存數(shù)據(jù)而账,也可參與算術(shù)邏輯運(yùn)算,并保存運(yùn)算結(jié)果因篇。除此之外泞辐,它們還各自具有一些特殊功能笔横。通用寄存器的長(zhǎng)度取決于機(jī)器字長(zhǎng),匯編語(yǔ)言程序員必須熟悉每個(gè)寄存器的一般用途和特殊用途咐吼,只有這樣吹缔,才能在程序中做到正確、合理地使用它們锯茄。
- 數(shù)據(jù)存儲(chǔ)器
數(shù)據(jù)寄存器主要用來(lái)保存操作數(shù)和運(yùn)算結(jié)果等信息厢塘,從而節(jié)省讀取操作數(shù)所需占用總線和訪問(wèn)存儲(chǔ)器的時(shí)間。
* AX(Accumulator):累加寄存器肌幽,也稱(chēng)之為累加器晚碾;
* BX(Base):基地址寄存器;
* CX(Count):計(jì)數(shù)器寄存器喂急;
* DX(Data):數(shù)據(jù)寄存器格嘁;
由于在 8086 之前的 CPU 為 8 位 CPU,所以為了兼容以前的 8 位程序廊移,在 8086 CPU 中糕簿,每一個(gè)數(shù)據(jù)寄存器都可以當(dāng)做兩個(gè)單獨(dú)的寄存器來(lái)使用,由此画机,每一個(gè) 16 位寄存器就可以當(dāng)做 2 個(gè)獨(dú)立的 8 位寄存器來(lái)使用了 冶伞。
- AX 寄存器可以分為兩個(gè)獨(dú)立的 8 位的 AH 和 AL 寄存器;
- BX 寄存器可以分為兩個(gè)獨(dú)立的 8 位的 BH 和 BL 寄存器步氏;
- CX 寄存器可以分為兩個(gè)獨(dú)立的 8 位的 CH 和 CL 寄存器腰耙;
- DX 寄存器可以分為兩個(gè)獨(dú)立的 8 位的 DH 和 DL 寄存器与斤;
-
指針寄存器
- SP(Stack Pointer):堆棧指針寄存器;
- BP(Base Pointer):基指針寄存器霜旧;
-
變址寄存器
- SI(Source Index):源變址寄存器隆嗅;
- DI(Destination Index):目的變址寄存器界阁;
-
控制寄存器
- IP(Instruction Pointer):指令指針寄存器,是一個(gè)16位專(zhuān)用寄存器胖喳,它指向當(dāng)前需要取出的指令字節(jié)泡躯,當(dāng)BIU從內(nèi)存中取出一個(gè)指令字節(jié)后,IP就自動(dòng)加(取出該字節(jié)的長(zhǎng)度丽焊,如:BIU從內(nèi)存中取出的是1個(gè)字節(jié)较剃,IP就會(huì)自動(dòng)加1,如果BIU從內(nèi)存中取出的字節(jié)數(shù)長(zhǎng)度為3技健,IP就自動(dòng)加3)写穴,指向下一個(gè)指令字節(jié)。注意雌贱,IP指向的是指令地址的段內(nèi)地址偏移量啊送,又稱(chēng)偏移地址(Offset Address)或有效地址(EA偿短,Effective Address)。
- FLAG:標(biāo)志寄存器馋没,又稱(chēng)程序狀態(tài)字(Program Status Word,PSW)昔逗。這是一個(gè)存放條件標(biāo)志、控制標(biāo)志寄存器篷朵,主要用于反映處理器的狀態(tài)和運(yùn)算結(jié)果的某些特征及控制指令的執(zhí)行纤子。
段寄存器
段寄存器是因?yàn)閷?duì)內(nèi)存的分段管理而設(shè)置的。計(jì)算機(jī)需要對(duì)內(nèi)存分段款票,以分配給不同的程序使用(類(lèi)似于硬盤(pán)分頁(yè))控硼。在描述內(nèi)存分段時(shí),需要有如下段的信息:1.段的大邪佟卡乾;2.段的起始地址;3.段的管理屬性(禁止寫(xiě)入/禁止執(zhí)行/系統(tǒng)專(zhuān)用等)缚够。需要用8個(gè)字節(jié)(64位)存儲(chǔ)這些信息幔妨,但段寄存器只有16位,因此段寄存器中只能存儲(chǔ)段號(hào)(segment selector谍椅,也譯作“段選擇符”)误堡,再由段號(hào)映射到存在內(nèi)存中的GDT(global (segment) descriptor table,全局段號(hào)記錄表)雏吭,讀取段的信息锁施。16位CPU有四個(gè)16位段寄存器,所以杖们,其程序可同時(shí)訪問(wèn)四個(gè)不同含義的段悉抵。8086CPU有20根地址線,最大可尋址內(nèi)存空間為1MB摘完。而8086的寄存器只有16位姥饰,指令指針(IP)和變址寄存器(SI、DI)也是16位的孝治。用16位的地址尋址1MB空間是不可能的列粪。所以就要把內(nèi)存分段,也就是把1MB空間分為24谈飒,即16個(gè)段岂座,每段不超過(guò)64KB(216,16位數(shù)據(jù)線就可以尋址)。在8086中設(shè)置4個(gè)16位的段寄存器步绸,用于管理4種段:CS是代碼段掺逼,DS是數(shù)據(jù)段,SS是堆棧段瓤介,ES是附加段吕喘。把內(nèi)存分段后赘那,每一個(gè)段就有一個(gè)段基址,段寄存器保存的就是這個(gè)段基址的高16位氯质,這個(gè)16位的地址左移四位(后面加上4個(gè)0)就可構(gòu)成20位的段基址募舟。
- CS(Code Segment):代碼段寄存器,放當(dāng)前正在運(yùn)行的程序代碼所在段的段基址闻察,表示當(dāng)前使用的指令代碼可以從該段寄存器指定的存儲(chǔ)器段中取得拱礁,相應(yīng)的偏移量則由IP提供。
- DS(Data Segment):數(shù)據(jù)段寄存器辕漂,指出當(dāng)前程序使用的數(shù)據(jù)所存放段的最低地址呢灶,即存放數(shù)據(jù)段的段基址。
- SS(Stack Segment):堆棧段寄存器钉嘹,指出當(dāng)前堆棧的底部地址鸯乃,即存放堆棧段的段基址。
- ES(Extra Segment):附加段寄存器跋涣,指出當(dāng)前程序使用附加數(shù)據(jù)段的段基址缨睡,該段是串操作指令中目的串所在的段。
SP 寄存器實(shí)質(zhì)上必須和 SS 段寄存器一起使用
編譯工具
-
Emu8086
工具圖
語(yǔ)法