80x86匯編語(yǔ)言程序設(shè)計(jì)課件_第1頁(yè)
80x86匯編語(yǔ)言程序設(shè)計(jì)課件_第2頁(yè)
80x86匯編語(yǔ)言程序設(shè)計(jì)課件_第3頁(yè)
80x86匯編語(yǔ)言程序設(shè)計(jì)課件_第4頁(yè)
80x86匯編語(yǔ)言程序設(shè)計(jì)課件_第5頁(yè)
已閱讀5頁(yè),還剩163頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

2023-11-1680x86組合語(yǔ)言程式設(shè)計(jì)第1章基礎(chǔ)知識(shí)講授要點(diǎn)

認(rèn)識(shí)組合語(yǔ)言數(shù)據(jù)表示基本位操作2023-11-1680x86組合語(yǔ)言程式設(shè)計(jì)1.1認(rèn)識(shí)組合語(yǔ)言1.程式設(shè)計(jì)語(yǔ)言機(jī)器語(yǔ)言組合語(yǔ)言:機(jī)器語(yǔ)言的符號(hào)化,與機(jī)器密切相關(guān)。高級(jí)語(yǔ)言2.組合語(yǔ)言的意義速度:對(duì)於同一個(gè)問(wèn)題,用組合語(yǔ)言設(shè)計(jì)出的程式能達(dá)到“運(yùn)行速度最快”??臻g:對(duì)於同一個(gè)問(wèn)題,用組合語(yǔ)言設(shè)計(jì)出的程式能達(dá)到“佔(zhàn)用空間最少”。功能:組合語(yǔ)言可以實(shí)現(xiàn)高級(jí)語(yǔ)言難以勝任甚至不能完成的任務(wù)。知識(shí):學(xué)習(xí)組合語(yǔ)言,有助於對(duì)電腦系統(tǒng)的理解、寫(xiě)出更好的程式。2023-11-1680x86組合語(yǔ)言程式設(shè)計(jì)1.2數(shù)據(jù)表示

數(shù)制的基本知識(shí)

10進(jìn)制

2進(jìn)制

16進(jìn)制說(shuō)明:前導(dǎo)0可以忽略,不影響取值。結(jié)尾用D(10進(jìn)制數(shù))、B(2進(jìn)制數(shù))、H(16進(jìn)制數(shù))。缺省為十進(jìn)位數(shù)。2023-11-1680x86組合語(yǔ)言程式設(shè)計(jì)1.2.1數(shù)據(jù)組織

位(Bit):1個(gè)二進(jìn)位位。電腦是在特定位數(shù)下工作的,如8位、16位、32位等。

位元組(Byte):8位。位編號(hào)從右到左為0~7,第0位為最低位,第7位為最高位。

字(Word):16位。位編號(hào)從右到左為0~15,第0位為最低位,第15位為最高位。位0~7為低位元組,位8~15為高位元組。

雙字(DoubleWord):32位。位編號(hào)從右到左為0~31,第0位為最低位,第31位為最高位。位0~15為低字,位16~31為高字。2023-11-1680x86組合語(yǔ)言程式設(shè)計(jì)1.2.2無(wú)符號(hào)數(shù)與帶符號(hào)數(shù)1.無(wú)符號(hào)數(shù)

N位二進(jìn)位數(shù)可以表示的無(wú)符號(hào)數(shù)範(fàn)圍為0~2N-1。例如,8位二進(jìn)位數(shù)00H~0FFH表示0~255,16位二進(jìn)位數(shù)0000H~0FFFFH表示0~65535。

2.帶符號(hào)數(shù)的補(bǔ)數(shù)表示補(bǔ)數(shù)的表示規(guī)則:以最高位作為符號(hào)位(0表示正數(shù),1表示負(fù)數(shù))。正數(shù)的補(bǔ)數(shù)是其本身。負(fù)數(shù)的補(bǔ)數(shù)是對(duì)其正數(shù)“各位求反、末位加1”後形成的。把“各位求反、末位加1”的操作稱(chēng)作求補(bǔ)。求補(bǔ)就是求相反數(shù)。

N位二進(jìn)位補(bǔ)數(shù)數(shù)可以表示的帶符號(hào)數(shù)範(fàn)圍為-2N-1~2N-1-1。例如,8位二進(jìn)位數(shù)可以表示-128~127,16位二進(jìn)位數(shù)可以表示-32768~32767。2023-11-1680x86組合語(yǔ)言程式設(shè)計(jì)3.補(bǔ)數(shù)的特性

求補(bǔ)

[x]補(bǔ)

[-x]補(bǔ)

[x+y]補(bǔ)=[x]補(bǔ)+

[y]補(bǔ)

[x-y]補(bǔ)=[x]補(bǔ)+

[-y]補(bǔ)

說(shuō)明:在電腦內(nèi)部,補(bǔ)數(shù)減法是通過(guò)對(duì)減數(shù)求補(bǔ)後將減法轉(zhuǎn)換為加法進(jìn)行的。一個(gè)帶符號(hào)數(shù)在不同位數(shù)下,其二進(jìn)制補(bǔ)數(shù)表示可能是不同的。例如,8位數(shù)-1的補(bǔ)數(shù)表示是0FFH,16位數(shù)-1的補(bǔ)數(shù)表示是0FFFFH。2023-11-1680x86組合語(yǔ)言程式設(shè)計(jì)4.補(bǔ)數(shù)的物理意義考慮8位二進(jìn)位數(shù),其表示範(fàn)圍為0~255,即256=0。若將其想像為一個(gè)環(huán),以0為基點(diǎn),向順時(shí)針?lè)较蛞?46個(gè)單位,則得246。然而,若按逆時(shí)針?lè)较蛞苿?dòng),則該位置就是-10。即

-10=0F6H=246

因此,在8位二進(jìn)位表示下,對(duì)於負(fù)數(shù)x(-128~-1)來(lái)說(shuō),存在下列等式:

-x=256-∣x∣

5.符號(hào)擴(kuò)展與零擴(kuò)展符號(hào)擴(kuò)展是將原符號(hào)位填入擴(kuò)展的每一位,使得在帶符號(hào)數(shù)意義下取值不變。零擴(kuò)展是將0填入擴(kuò)展的每一位,使得在無(wú)符號(hào)數(shù)意義下取值不變。2023-11-1680x86組合語(yǔ)言程式設(shè)計(jì)1.2.3字元的ASCII碼表示ASCII碼字元集採(cǎi)用一個(gè)位元組表示字元。常用字符的ASCII碼。數(shù)字'0'~'9':30H~39H

字母'A'~'Z':41H~5AH

字母'a'~'z':61H~7AH

空格:20H

回車(chē)CR:0DH

換行LF:0AH

空字元:0

注意回車(chē)與換行的差別:

CR用來(lái)控制游標(biāo)回到當(dāng)前行的最左端;LF用來(lái)移動(dòng)游標(biāo)到下一行,而所在列不變。2023-11-1680x86組合語(yǔ)言程式設(shè)計(jì)1.2.4BCD碼

壓縮BCD碼

以4個(gè)二進(jìn)位位表示1個(gè)十進(jìn)位位,用0000B~1001B表示0~9。例如,十進(jìn)位數(shù)6429的壓縮BCD碼表示為

0110010000101001B(即6429H)非壓縮BCD碼

以8個(gè)二進(jìn)位位表示1個(gè)十進(jìn)位位,低4位與壓縮BCD碼相同,高4位無(wú)意義。例如,十進(jìn)位數(shù)6429的非壓縮BCD碼表示為

xxxx0110xxxx0100xxxx0010xxxx1001B

有時(shí),要求非壓縮BCD碼的高4位為0,這時(shí),6429的非壓縮BCD碼為06040209H。可以看出,數(shù)字字元'0'~'9'的ASCII碼恰好是0~9的非壓縮BCD碼。2023-11-1680x86組合語(yǔ)言程式設(shè)計(jì)1.2.5注解

同一個(gè)二進(jìn)位數(shù)可以表示多種含義,其具體含義由使用者解釋。例如,二進(jìn)位數(shù)00110000B,即30H,可以當(dāng)作十進(jìn)位數(shù)48的二進(jìn)位表示,字元'0'的ASCII碼,30的壓縮BCD碼,0的非壓縮BCD碼,等等。甚至將其當(dāng)作現(xiàn)實(shí)世界的任一物理對(duì)象也未嘗不可。帶符號(hào)數(shù)的二進(jìn)位補(bǔ)數(shù)表示與位數(shù)密切相關(guān)。例如0FFH,若作為8位帶符號(hào)數(shù),則表示-1;若作為16位帶符號(hào)數(shù),則表示255。再如0FFFFH,若作為16位帶符號(hào)數(shù),則表示-1;若作為32位帶符號(hào)數(shù),則表示65535。2023-11-1680x86組合語(yǔ)言程式設(shè)計(jì)1.3基本位操作1.邏輯操作:AND、OR、XOR、NOTAND操作可以使某些位清0。

OR操作可以使某些位置1。

XOR操作可以使某些位取反。2.移位與迴圈移位左移:最低位移入0。在不溢出的情況下,左移1位相當(dāng)於乘以2。邏輯右移:最高位移入0。邏輯右移1位約等於無(wú)符號(hào)數(shù)除以2。算術(shù)右移:最高位不變。算術(shù)右移1位約等於帶符號(hào)數(shù)除以2。迴圈左移與迴圈右移:從一端移出的位要移入到另一端。2023-11-1680x86組合語(yǔ)言程式設(shè)計(jì)2.180x86電腦的基本結(jié)構(gòu)80x86電腦的組成:

CPU

記憶體

I/O子系統(tǒng)各部分以系統(tǒng)匯流排相連2023-11-1680x86組合語(yǔ)言程式設(shè)計(jì)2.1.1CPU

電腦執(zhí)行程式時(shí),首先要將其裝入記憶體,然後由CPU執(zhí)行程式指令。

CPU的作用:執(zhí)行算術(shù)與邏輯運(yùn)算??刂浦噶畹膱?zhí)行。通常,將Intel公司生產(chǎn)的8086/8088、80286、80386、80486、Pentium、PentiumPro、PentiumII、PentiumIII、Pentium4及其相容的CPU,統(tǒng)稱(chēng)為80x86CPU或x86CPU,將基於這些CPU的電腦,稱(chēng)為80x86電腦或x86電腦。2023-11-1680x86組合語(yǔ)言程式設(shè)計(jì)2.1.2系統(tǒng)匯流排

匯流排是部件之間進(jìn)行數(shù)據(jù)(電信號(hào))交換的通道。

80x86電腦的系統(tǒng)匯流排分為3類(lèi):數(shù)據(jù)匯流排地址匯流排控制匯流排1.數(shù)據(jù)匯流排數(shù)據(jù)匯流排是用來(lái)傳遞數(shù)據(jù)的,定義了CPU在每個(gè)記憶體週期所能存取數(shù)據(jù)的位數(shù)。

80x86系列CPU的數(shù)據(jù)匯流排為8位、16位、32位或64位。這就是“為什麼通常的數(shù)據(jù)存取是以8位、16位、32位或64位進(jìn)行的”。數(shù)據(jù)匯流排越寬,處理能力越強(qiáng)。具有N位數(shù)據(jù)匯流排並不意味著CPU只能處理N位數(shù)據(jù)。

2023-11-1680x86組合語(yǔ)言程式設(shè)計(jì)2.地址匯流排地址匯流排用來(lái)指出數(shù)據(jù)的地址(記憶體或I/O)。地址匯流排的位數(shù)決定了最大可編址的記憶體與I/O空間。對(duì)於N位地址匯流排,CPU可以提供2N個(gè)不同地址:0~2N-1。地址匯流排由記憶體與I/O子系統(tǒng)共用使用(I/O只用低16位)。

3.控制匯流排控制匯流排用來(lái)控制CPU與記憶體和I/O設(shè)備之間的數(shù)據(jù)傳送方式(如傳送方向)。

2023-11-1680x86組合語(yǔ)言程式設(shè)計(jì)2.1.3記憶體

記憶體是存放指令和數(shù)據(jù)的部件,由若干記憶體單元構(gòu)成。

80x86的記憶體以位元組編址:每個(gè)記憶體單元有唯一的地址,可存放1個(gè)位元組。要正確理解記憶體單元的2個(gè)要素:地址(編號(hào))與值(內(nèi)容)。

1個(gè)字佔(zhàn)據(jù)2個(gè)相鄰的記憶體單元;低位元組在低地址單元,高位元組在高地址單元;字的地址由其低地址來(lái)表示。雙字也類(lèi)似。同一地址可以看作是位元組、字或雙字單元的地址,取決於具體的使用方式。2023-11-1680x86組合語(yǔ)言程式設(shè)計(jì)2.1.4I/O子系統(tǒng)

每個(gè)I/O設(shè)備必須通過(guò)專(zhuān)門(mén)的I/O介面電路與主機(jī)(CPU和記憶體)相連。

I/O端口:即I/O地址,是區(qū)分I/O設(shè)備及其寄存器的編號(hào)。

80x86的I/O端口為16位。

I/O端口類(lèi)似於記憶體單元,只是對(duì)應(yīng)於I/O設(shè)備。大多數(shù)設(shè)備使用多個(gè)I/O端口(數(shù)據(jù)端口、狀態(tài)端口等)。

CPU是通過(guò)端口與I/O設(shè)備通信的。2023-11-1680x86組合語(yǔ)言程式設(shè)計(jì)2.280x86CPU的寄存器組1.通用寄存器

8位通用寄存器8個(gè):AL、AH、BL、BH、CL、CH、DL、DH。

16位通用寄存器8個(gè):AX、BX、CX、DX、SI、DI、BP、SP。

32位通用寄存器8個(gè):EAX、EBX、ECX、EDX、ESI、EDI、EBP、ESP。

AL與AH、BL與BH、CL與CH、DL與DH分別對(duì)應(yīng)於AX、BX、CX和DX的低8位與高8位。AX、BX、CX、DX、SI、DI、BP和SP分別對(duì)應(yīng)於EAX、EBX、ECX、EDX、ESI、EDI、EBP和ESP的低16位。2.專(zhuān)用寄存器指令指針:EIP(32位)、IP(16位)。IP是EIP的低16位。標(biāo)誌寄存器:EFLAGS(32位)、FLAGS(16位)。FLAGS是EFLAGS的低16位。3.段寄存器

6個(gè)16位的段寄存器:CS、DS、ES、SS、FS和GS。

FS、GS以及所有32位寄存器是從80386CPU開(kāi)始引入的。2023-11-1680x86組合語(yǔ)言程式設(shè)計(jì)2.380x86CPU的工作模式2.3.180x86CPU的3種工作模式1.實(shí)模式與8086相容的工作模式,只有低20位地址線(xiàn)起作用,僅能尋址第一個(gè)1MB的記憶體空間。MSDOS運(yùn)行在實(shí)模式下。2.保護(hù)模式

32位80x86CPU的主要工作模式,提供對(duì)程式和數(shù)據(jù)進(jìn)行安全檢查的保護(hù)機(jī)制。Windows9x/NT/2000運(yùn)行在保護(hù)模式下。3.虛擬8086模式在Windows9x下,若打開(kāi)一個(gè)MSDOS窗口,運(yùn)行一個(gè)DOS應(yīng)用程式,那麼該程式就運(yùn)行在虛擬8086模式下。2023-11-1680x86組合語(yǔ)言程式設(shè)計(jì)2.3.2實(shí)模式1.記憶體分段

80x86採(cǎi)用分段記憶體管理機(jī)制,主要包括下列幾種類(lèi)型的段:代碼段:用來(lái)存放程式的指令序列。數(shù)據(jù)段:用來(lái)存放程式的數(shù)據(jù)。堆疊段:作為堆疊使用的記憶體區(qū)域,用來(lái)存放過(guò)程返回地址、過(guò)程參數(shù)等。一個(gè)程式可以擁有多個(gè)代碼段、多個(gè)數(shù)據(jù)段甚至多個(gè)堆疊段。

2023-11-1680x86組合語(yǔ)言程式設(shè)計(jì)

2.物理地址與邏輯地址物理地址:記憶體單元的實(shí)際地址,也就是出現(xiàn)在地址匯流排上的地址。邏輯地址:或稱(chēng)分段地址,記作 段地址:段內(nèi)偏移地址 段地址表示段在內(nèi)存中的起始位置,通常被保存在某個(gè)段寄存器中。段內(nèi)偏移地址表示記憶體單元相對(duì)於段起始位置的位移,簡(jiǎn)稱(chēng)偏移地址,也叫有效地址EA。段地址與偏移地址都是16位。系統(tǒng)採(cǎi)用下列方法將邏輯地址自動(dòng)轉(zhuǎn)換為20位的物理地址: 物理地址=段地址×16+偏移地址每個(gè)記憶體單元具有唯一的物理地址,但可由不同的邏輯地址描述。

2023-11-1680x86組合語(yǔ)言程式設(shè)計(jì)

3.實(shí)模式的編程要點(diǎn)採(cǎi)用16位段,段地址與偏移地址均為16位,即使32位80x86CPU(80386及更高)也只能尋址1MB的記憶體空間。

CPU總是從地址CS:IP處取指令,EIP的高16位為0。

SS:SP指向堆疊段的棧頂?shù)刂?,ESP的高16位為0。在32位80x86CPU下,程式可以使用32位寄存器和32位運(yùn)算元,但採(cǎi)用32位寄存器表示偏移地址時(shí),只使用低16位,高16位為0。2023-11-1680x86組合語(yǔ)言程式設(shè)計(jì)2.4標(biāo)誌位2.4.1狀態(tài)標(biāo)誌

狀態(tài)標(biāo)誌通常由CPU根據(jù)指令執(zhí)行結(jié)果自動(dòng)設(shè)置,以反映指令執(zhí)行結(jié)果的特徵。

80x86CPU將狀態(tài)標(biāo)誌作為條件判斷的依據(jù),以控制程式的執(zhí)行流程。最常用的狀態(tài)標(biāo)誌是CF、OF、SF和ZF,應(yīng)熟練掌握。2023-11-1680x86組合語(yǔ)言程式設(shè)計(jì)1.狀態(tài)標(biāo)誌取值的一般規(guī)則

ZF(ZeroFlag):零標(biāo)誌。若運(yùn)算結(jié)果為0,則ZF=1,否則ZF=0。

SF(SignFlag):符號(hào)標(biāo)誌。若運(yùn)算結(jié)果為負(fù)數(shù),則SF=1,否則SF=0。

CF(CarryFlag):進(jìn)位標(biāo)誌。若加法時(shí)結(jié)果最高位向前有進(jìn)位或減法時(shí)最高位向前有借位,則CF=1,否則CF=0。

OF(OverflowFlag):溢出標(biāo)誌。若帶符號(hào)數(shù)的運(yùn)算結(jié)果超出了補(bǔ)數(shù)表示的範(fàn)圍,則OF=1,否則OF=0。

AF(AuxiliaryCarryFlag):輔助進(jìn)位標(biāo)誌。若加法時(shí)結(jié)果低4位向前有進(jìn)位或減法時(shí)結(jié)果低4位向前有借位,則AF=1,否則AF=0。

PF(ParityFlag):奇偶標(biāo)誌。若結(jié)果最低位元組中1的個(gè)數(shù)為偶數(shù),則PF=1,否則PF=0。2023-11-1680x86組合語(yǔ)言程式設(shè)計(jì)2.深入認(rèn)識(shí)CF和OF

CF和OF本質(zhì)上均表示溢出。

CF表示無(wú)符號(hào)溢出,即運(yùn)算結(jié)果超出了無(wú)符號(hào)數(shù)的表示範(fàn)圍。對(duì)於n位二進(jìn)位數(shù)來(lái)說(shuō),無(wú)符號(hào)數(shù)表示範(fàn)圍為0~2n-1,例如,n=8和16時(shí)分別為0~255和0~65535。

OF表示帶符號(hào)溢出,即運(yùn)算結(jié)果超出了帶符號(hào)數(shù)的表示範(fàn)圍。對(duì)於n位二進(jìn)位數(shù)來(lái)說(shuō),帶符號(hào)數(shù)表示範(fàn)圍為-2n-1~2n-1-1,例如,n=8和16時(shí),分別為-128~127和-32768~32767。2023-11-1680x86組合語(yǔ)言程式設(shè)計(jì)2.4.2控制標(biāo)誌

控制標(biāo)誌是由程式根據(jù)需要用指令來(lái)設(shè)置的,以控制某些指令的執(zhí)行方式。控制標(biāo)誌包括:

DF(DirectionFlag):方向標(biāo)誌

IF(InterruptFlag):中斷標(biāo)誌

TF(TraceFlag):跟蹤標(biāo)誌2023-11-1680x86組合語(yǔ)言程式設(shè)計(jì)本章小結(jié)80x86電腦由CPU、記憶體和I/O子系統(tǒng)三部分組成,各部分之間由系統(tǒng)匯流排相連。數(shù)據(jù)匯流排決定了CPU每次存取數(shù)據(jù)的最大寬度(位數(shù));地址匯流排決定了最大可編址空間;控制匯流排用來(lái)控制CPU與記憶體和I/O設(shè)備之間的數(shù)據(jù)傳送方式。

80x86系統(tǒng)的I/O地址為16位,可尋址65536個(gè)不同的I/O端口。

80x86程式可以存取的最小數(shù)據(jù)單位是位元組。例如,若要讀取的位數(shù)不足8位,則只能先讀出一個(gè)完整位元組,再遮罩掉其他位。字的存儲(chǔ)採(cǎi)取“低位元組在低地址,高位元組在高地址,字的地址由低地址表示”的小端方式,雙字也類(lèi)似。要正確理解記憶體單元的地址和值,地址表示位置,值是相應(yīng)位置處的內(nèi)容。同一地址既可以看作位元組單元地址,也可以看作字甚至雙字單元地址,取決於具體的使用方式。2023-11-1680x86組合語(yǔ)言程式設(shè)計(jì)80x86CPU具有8位、16位和32位寄存器,主要包括:

8位通用寄存器8個(gè):AH、AL、BH、BL、CH、CL、DH、DL。

16位通用寄存器8個(gè):AX、BX、CX、DX、SI、DI、BP、SP。

32位通用寄存器8個(gè):EAX、EBX、ECX、EDX、ESI、EDI、EBP、ESP。

16位段寄存器6個(gè):CS、DS、SS、ES、FS、GS。

32位/16位指令指針1個(gè):EIP/IP。

32位/16位標(biāo)誌寄存器1個(gè):EFLAGS/FLAGS。其中,32位寄存器是80386CPU開(kāi)始引入的。2023-11-1680x86組合語(yǔ)言程式設(shè)計(jì)3.1指令格式1.指令的書(shū)寫(xiě)格式 標(biāo)號(hào): 指令助記符 運(yùn)算元 ;注釋2.運(yùn)算元的3種形式:立即運(yùn)算元:指令的運(yùn)算元是立即數(shù),並直接出現(xiàn)在指令中。寄存器運(yùn)算元:運(yùn)算元是寄存器的值,指令中使用寄存器名。記憶體運(yùn)算元:運(yùn)算元是某個(gè)記憶體單元的值,指令中給出有效地址EA,段地址在某個(gè)段寄存器中。2023-11-1680x86組合語(yǔ)言程式設(shè)計(jì)3.2運(yùn)算元的形式3.2.18086指令的運(yùn)算元形式1.立即數(shù):8位或16位立即數(shù)。2.寄存器運(yùn)算元:

8位/16位通用寄存器和段寄存器(除了FS和GS)。3.記憶體運(yùn)算元包括下列幾種形式。

Variable 或[Variable] [reg] disp[reg] [base][index] disp[base][index]

說(shuō)明:

Variable是變數(shù)名或變數(shù)名±整數(shù)運(yùn)算式。

reg為BX、BP、SI、DI。

disp可以是常量或變數(shù),彙編後為一個(gè)常數(shù),若是變數(shù),則取其偏移地址。

base為BX或BP,index為SI或DI。有效地址為各項(xiàng)之和。如disp[base][index]形式,EA=base+index+disp。若使用了BP,則隱含段地址在SS,否則在DS。當(dāng)段地址不在隱含的段寄存器時(shí),可使用段超越首碼,形式為: 段寄存器名:2023-11-1680x86組合語(yǔ)言程式設(shè)計(jì)3.2.232位CPU擴(kuò)展的運(yùn)算元形式1.立即數(shù):32位立即數(shù)。2.寄存器運(yùn)算元:32位通用寄存器以及FS和GS。3.記憶體運(yùn)算元包括下列幾種形式。

[base] disp[base] [base][index] disp[base][index] [index*n] disp[index*n] [base][index*n] disp[base][index*n]說(shuō)明:

base、index為任一32位通用寄存器(index不能取ESP)。

n為比例因數(shù),取1、2、4或8。若包含base且base為EBP或ESP,則隱含段地址在SS;否則,隱含段地址在DS。若在16位CPU上編程,則不能使用這些尋址方式。2023-11-1680x86組合語(yǔ)言程式設(shè)計(jì)3.3指令系統(tǒng)

介紹設(shè)計(jì)完整程式所需的常用指令,對(duì)於其餘指令,一部分在後續(xù)章節(jié)中講授,一部分自學(xué)。介紹常用指令的格式、功能以及對(duì)CF、OF、SF、ZF的影響。2023-11-1680x86組合語(yǔ)言程式設(shè)計(jì)為了描述方便,採(cǎi)用下列符號(hào)約定:dest —目的運(yùn)算元src —源運(yùn)算元oprdn —第n個(gè)運(yùn)算元,如oprd1,oprd2,oprd3= —賦值 —或者reg8 —8位通用寄存器AH/AL/BH/BL/CH/CL/DH/DLreg16 —16位通用寄存器AX/BX/CX/DX/SI/DI/BP/SPreg32 —32位通用寄存器EAX/EBX/ECX/EDX/ESI/EDI/EBP/ESPreg —reg8/reg16/reg32seg —段寄存器CS/DS/SS/ES/FS/GSmem8 —8位記憶體運(yùn)算元mem16 —16位記憶體運(yùn)算元mem32 —32位記憶體運(yùn)算元mem —mem8/mem16/mem32mem64 —64位記憶體運(yùn)算元imm8 —8位立即數(shù)imm16 —16位立即數(shù)imm32 —32位立即數(shù)imm —imm8/imm16/imm322023-11-1680x86組合語(yǔ)言程式設(shè)計(jì)3.3.1數(shù)據(jù)傳送指令1.MOV(Move):傳送一般形式:

MOV dest,src ;dest=src。將源運(yùn)算元src複製到目的運(yùn)算元dest,src不變。語(yǔ)法格式:

MOV reg/mem/seg,reg/mem/seg/imm

對(duì)標(biāo)誌位的影響:無(wú)。說(shuō)明:

dest與src不能作如下搭配:

MOV mem,mem ;錯(cuò)誤

MOV seg,seg ;錯(cuò)誤

MOV seg,imm ;錯(cuò)誤

dest不能是CS。

dest與src必須類(lèi)型匹配,即同時(shí)是位元組、字或雙字類(lèi)型。2023-11-1680x86組合語(yǔ)言程式設(shè)計(jì)3.3.1數(shù)據(jù)傳送指令2.XCHG(Exchange):交換一般形式:

XCHG oprd1,oprd2 ;交換oprd1與oprd2的內(nèi)容語(yǔ)法格式:

XCHG reg/mem,reg/mem

對(duì)標(biāo)誌位的影響:無(wú)。說(shuō)明:oprd1與oprd2不能作如下搭配:

XCHG mem,mem ;錯(cuò)誤oprd1與oprd2類(lèi)型必須匹配。、【例】

xchg ebx,edx xchg [ebp][eax*4],edx2023-11-1680x86組合語(yǔ)言程式設(shè)計(jì)3.3.1數(shù)據(jù)傳送指令3.LEA(LoadEffectiveAddress):裝入有效地址

語(yǔ)法格式:

LEA reg16,mem ;reg16=mem的有效地址 對(duì)標(biāo)誌位的影響:無(wú)?!纠吭O(shè)BX=5678H,EAX=1,EDX=2。

lea si,2[bx] ;執(zhí)行後,SI=567AH lea si,2[eax][edx] ;執(zhí)行後,SI=54.LDS、LES

語(yǔ)法格式:

LDS reg16,mem32 ;reg16=mem32的低字,DS=mem32的高字

LES reg16,mem32 ;reg16=mem32的低字,ES=mem32的高字 對(duì)標(biāo)誌位的影響:無(wú)。2023-11-1680x86組合語(yǔ)言程式設(shè)計(jì)3.3.1數(shù)據(jù)傳送指令5.堆疊操作指令

80x86系統(tǒng)的堆疊具有如下特點(diǎn):堆疊是在內(nèi)存的堆疊段中,具有“先進(jìn)後出”的特點(diǎn)。堆疊只有一個(gè)出入口,即當(dāng)前棧頂。當(dāng)堆疊為空時(shí),棧頂和棧底指向同一記憶體單元。堆疊有兩個(gè)基本操作:PUSH(進(jìn)棧)和POP(出棧)。PUSH操作使棧頂向低地址方向移動(dòng),而POP操作則剛好相反。堆疊操作只能以字或雙字為單位。SS:SP指向棧頂。2023-11-1680x86組合語(yǔ)言程式設(shè)計(jì)3.3.1數(shù)據(jù)傳送指令(1)PUSH與POP:進(jìn)棧與出棧

語(yǔ)法格式:

PUSH reg16/seg/mem16/reg32/mem32 POP reg16/seg/mem16/reg32/mem32 ;運(yùn)算元不能是CS PUSH imm ;286新增功能描述:

PUSH指令(16位):

SP=SP-2 SS:[SP]=16位運(yùn)算元

POP指令(16位):

16位運(yùn)算元=SS:[SP] SP=SP+2 PUSH指令(32位):

SP=SP-4 SS:[SP]=32位運(yùn)算元

POP指令(32位):

32位運(yùn)算元=SS:[SP] SP=SP+4

對(duì)標(biāo)誌位的影響:無(wú)。2023-11-1680x86組合語(yǔ)言程式設(shè)計(jì)3.3.1數(shù)據(jù)傳送指令(2)PUSHF與POPF:標(biāo)誌寄存器進(jìn)棧和出棧語(yǔ)法格式:

PUSHF ;FLAGS進(jìn)棧

POPF ;棧頂字出棧到FLAGS對(duì)標(biāo)誌位的影響:只有POPF指令會(huì)以彈出值設(shè)置標(biāo)誌寄存器。

【例】設(shè)SP=100H,EBX=12345678H,給出下列指令依次執(zhí)行後的結(jié)果。

push bx ;ss:[00ffh]=56h,ss:[00feh]=78h,sp=0feh pop ax ;ax=5678h,sp=100h push ebx ;ss:[00feh]=1234h,ss:[00fch]=5678h,sp=0fch pop ax ;ax=5678h,sp=0feh pop ax ;ax=1234h,sp=100h

【例】交換AX與CX的值。

push ax push cx pop ax pop cx2023-11-1680x86組合語(yǔ)言程式設(shè)計(jì)3.3.1數(shù)據(jù)傳送指令6.標(biāo)誌寄存器傳送指令(1)LAHF(LoadAHfromFlags) 語(yǔ)法格式:

LAHF ;AH=FLAGS的低8位 對(duì)標(biāo)誌位的影響:無(wú)。

(2)SAHF(StoreAHintoFlags) 語(yǔ)法格式:

SAHF ;FLAGS的低8位=AH

對(duì)標(biāo)誌位的影響:由新裝入值確定。

2023-11-1680x86組合語(yǔ)言程式設(shè)計(jì)3.3.1數(shù)據(jù)傳送指令符號(hào)擴(kuò)展與零擴(kuò)展指令 對(duì)標(biāo)誌位的影響:無(wú)。(1)CBW、CWD、CWDE與CDQ

語(yǔ)法格式:

CBW ;AL符號(hào)擴(kuò)展為AX CWD ;AX符號(hào)擴(kuò)展為32位數(shù)DX:AX CWDE ;AX符號(hào)擴(kuò)展為EAX;386新增

CDQ ;EAX符號(hào)擴(kuò)展為64位數(shù)EDX:EAX;386新增【例】設(shè)AL=0FEH,給出依次執(zhí)行下列指令後的結(jié)果。

cbw ;ax=0fffeh cwd ;dx=0ffffh,ax不變,即dx:ax=-2 cwde ;eax=0fffffffeh(-2)

cdq ;edx=0ffffffffh,eax不變,即edx:eax=-2

2023-11-1680x86組合語(yǔ)言程式設(shè)計(jì)3.3.1數(shù)據(jù)傳送指令(2)MOVSX

一般形式:

MOVSX dest,src ;src符號(hào)擴(kuò)展為dest;386新增語(yǔ)法格式:

MOVSX reg16,reg8/mem8 MOVSX reg32,reg8/mem8/reg16/mem16

功能描述:MOVSX是CBW、CWD和CWDE的一般形式,用來(lái)將8位數(shù)符號(hào)擴(kuò)展為16位或32位數(shù),或者將16位數(shù)符號(hào)擴(kuò)展為32位數(shù)。

【例】CBW和CWDE的功能可由MOVSX指令實(shí)現(xiàn)。

movsx ax,al ;等價(jià)於cbw movsx eax,ax ;等價(jià)於cwde movsx eax,al ;等價(jià)於順序執(zhí)行cbw與cwde

2023-11-1680x86組合語(yǔ)言程式設(shè)計(jì)3.3.1數(shù)據(jù)傳送指令(3)MOVZX

一般形式:

MOVZX dest,src ;src零擴(kuò)展為dest;386新增語(yǔ)法格式:

MOVZX reg16,reg8/mem8 MOVZX reg32,reg8/mem8/reg16/mem16

2023-11-1680x86組合語(yǔ)言程式設(shè)計(jì)3.3.1數(shù)據(jù)傳送指令8.XLAT(Translate):換碼語(yǔ)法格式:

XLAT ;AL=DS:[BX+AL]

功能描述:將DS:BX所指記憶體區(qū)中、由AL指定位移處的一個(gè)位元組賦給AL。對(duì)標(biāo)誌位的影響:無(wú)。

2023-11-1680x86組合語(yǔ)言程式設(shè)計(jì)3.3.2算術(shù)指令1.加法一般形式:

ADD dest,src ;dest=dest+src ADC dest,src ;dest=dest+src+CF INC dest ;dest=dest+1

語(yǔ)法格式:

ADD reg/mem,reg/mem/imm ADC reg/mem,reg/mem/imm INC reg/mem

對(duì)標(biāo)誌位的影響:

ADD、ADC:按一般規(guī)則影響CF、OF、SF和ZF。

INC:不影響CF,其他同ADD。說(shuō)明:ADD與ADC的2個(gè)運(yùn)算元必須類(lèi)型匹配,且不能同時(shí)是記憶體運(yùn)算元。2023-11-1680x86組合語(yǔ)言程式設(shè)計(jì)3.3.2算術(shù)指令2.減法一般形式:

SUB dest,src ;dest=dest–src SBB dest,src ;dest=dest-src–CF CMP dest,src ;dest–src。與SUB的區(qū)別在於,不將減法結(jié)果存入dest。

DEC dest ;dest=dest-1 NEG dest ;dest=0–dest

語(yǔ)法格式:

SUB reg/mem,reg/mem/imm SBB reg/mem,reg/mem/imm CMP reg/mem,reg/mem/imm DEC reg/mem NEG reg/mem

對(duì)標(biāo)誌位的影響:

SUB、SBB、CMP、NEG:按一般規(guī)則影響CF、OF、SF和ZF。CF表示借位。

DEC:不影響CF,其他同SUB。說(shuō)明:2個(gè)運(yùn)算元必須類(lèi)型匹配,且不能同時(shí)是記憶體運(yùn)算元。2023-11-1680x86組合語(yǔ)言程式設(shè)計(jì)3.3.2算術(shù)指令3.乘法(1)MUL(UnsignedMultiplication):無(wú)符號(hào)乘法一般形式:

MUL src 語(yǔ)法格式:

MUL reg8/mem8 ;AX=AL×src MUL reg16/mem16 ;DX:AX=AX×src MUL reg32/mem32 :EDX:EAX=EAX×src對(duì)標(biāo)誌位的影響:若8位×8位、16位×16位或32位×32位的結(jié)果分別能由8、16或32位容納(即結(jié)果的高一半為0),則CF=OF=0,否則,CF=OF=1;其餘標(biāo)誌無(wú)定義。說(shuō)明:由於2個(gè)n位數(shù)的乘積可能需要2n位,因此,若運(yùn)算元是8位,則結(jié)果為16位;同樣,16位運(yùn)算元相乘結(jié)果為32位,32位數(shù)相乘結(jié)果為64位。2023-11-1680x86組合語(yǔ)言程式設(shè)計(jì)3.3.2算術(shù)指令(2)IMUL(IntegerMultiplication):帶符號(hào)乘法一般形式:

IMUL src 語(yǔ)法格式:

IMUL reg8/mem8 ;AX=AL×src。執(zhí)行帶符號(hào)乘法,下同。

IMUL reg16/mem16 ;DX:AX=AX×src IMUL reg32/mem32 :EDX:EAX=EAX×src對(duì)標(biāo)誌位的影響:若結(jié)果的高一半為低一半的符號(hào)擴(kuò)展,則CF=OF=0,否則,CF=OF=1;其餘標(biāo)誌無(wú)定義。說(shuō)明:由於2個(gè)n位數(shù)的乘積可能需要2n位,因此,若運(yùn)算元是8位,則結(jié)果為16位;同樣,16位運(yùn)算元相乘結(jié)果為32位,32位數(shù)相乘結(jié)果為64位。【例】對(duì)於同一個(gè)二進(jìn)位數(shù),採(cǎi)用MUL與IMUL執(zhí)行的結(jié)果可能不同。設(shè)AL=0FFH,BL=1,分別執(zhí)行下列指令,會(huì)得出不同結(jié)果。

mul bl ;ax=0ffh(255)

imul bl ;ax=0ffffh(-1)2023-11-1680x86組合語(yǔ)言程式設(shè)計(jì)3.3.2算術(shù)指令4.除法一般形式:

DIV src ;無(wú)符號(hào)數(shù)除法

IDIV src ;帶符號(hào)數(shù)除法語(yǔ)法格式:

DIV reg/mem IDIV reg/mem 功能描述:

src是8位:AX÷src,結(jié)果商在AL、餘數(shù)在AH。

src是16位:DX:AX÷src,結(jié)果商在AX、餘數(shù)在DX。

src是32位:EDX:EAX÷src,結(jié)果商在EAX、餘數(shù)在EDX。對(duì)標(biāo)誌位的影響:無(wú)定義。2023-11-1680x86組合語(yǔ)言程式設(shè)計(jì)3.3.2算術(shù)指令5.十進(jìn)位調(diào)整指令

(1)壓縮BCD碼調(diào)整指令語(yǔ)法格式:

DAA ;調(diào)整AL中的和為壓縮BCD碼

DAS ;調(diào)整AL中的差為壓縮BCD碼功能描述:

DAA:通常先執(zhí)行ADD/ADC指令,將2個(gè)壓縮BCD碼相加,結(jié)果存放在AL中。然後使用該指令將AL調(diào)整為壓縮BCD碼格式。

DAS:通常先執(zhí)行SUB/SBB指令,將2個(gè)壓縮BCD碼相減,結(jié)果存放在AL中。然後使用該指令將AL調(diào)整為壓縮BCD碼格式。對(duì)標(biāo)誌位的影響:OF不確定;CF反映壓縮BCD碼相加/相減的進(jìn)位/借位狀態(tài);按一般規(guī)則影響SF和ZF。說(shuō)明:若使用DAA/DAS指令,則參加加法/減法運(yùn)算的運(yùn)算元應(yīng)該是壓縮BCD碼。如果將任意2個(gè)二進(jìn)位數(shù)相加/減,然後調(diào)整,將得不到正確結(jié)果。2023-11-1680x86組合語(yǔ)言程式設(shè)計(jì)3.3.2算術(shù)指令DAA的調(diào)整演算法如下:if(AL低4位>9或AF=1)then AL=AL+6; AF=1;endifif(AL高4位>9或CF=1)then AL=AL+60H; CF=1;endifDAS的調(diào)整演算法如下:if(AL低4位>9或AF=1)then AL=AL–6; AF=1;endifif(AL高4位>9或CF=1)then AL=AL-60h; CF=1;endif2023-11-1680x86組合語(yǔ)言程式設(shè)計(jì)3.3.2算術(shù)指令(2)非壓縮BCD碼調(diào)整指令語(yǔ)法格式:

AAA ;調(diào)整AL中的和為非壓縮BCD碼

;調(diào)整後,AL高4位=0,AH=AH+產(chǎn)生的CF AAS ;調(diào)整AL中的差為非壓縮BCD碼

;調(diào)整後,AL高4位=0,AH=AH-產(chǎn)生的CF AAM ;AH=AXdiv10,AL=AXmod10 AAD ;AL=AH×10+AL,AH=0功能描述:

AAA:通常先執(zhí)行ADD/ADC指令,以AL為目的運(yùn)算元,將2個(gè)非壓縮BCD碼(高4位無(wú)關(guān))相加。然後使用AAA將AL調(diào)整為非壓縮BCD碼格式,且高4位=0,同時(shí)將調(diào)整產(chǎn)生的進(jìn)位加到AH中。

AAS:通常先執(zhí)行SUB/SBB指令,以AL為目的運(yùn)算元,將2個(gè)非壓縮BCD碼(高4位無(wú)關(guān))相減。然後使用AAS將AL調(diào)整為非壓縮BCD碼格式,且高4位=0,同時(shí)將調(diào)整產(chǎn)生的借位從AH中減去。

AAM與AAD:略。對(duì)標(biāo)誌位的影響:

AAA與AAS:CF反映非壓縮BCD碼加/減的進(jìn)位/借位;OF、SF和ZF不確定。2023-11-1680x86組合語(yǔ)言程式設(shè)計(jì)3.3.2算術(shù)指令A(yù)AA的調(diào)整演算法如下:if(AL低4位>9或AF=1)then AL=AL+6; AH=AH+1; AF=1; CF=1;else AF=0; CF=0;endifAL=ALAND0FH;AL高4位清0AAS的調(diào)整演算法如下:if(AL低4位>9或AF=1)thenAL=AL–6;AH=AH–1;AF=1;CF=1;elseAF=0;CF=0;endifAL=ALAND0FH;AL高4位清02023-11-1680x86組合語(yǔ)言程式設(shè)計(jì)3.3.3位操作指令1.邏輯指令一般形式:

AND dest,src ;dest=destandsrc OR dest,src ;dest=destorsrc XOR dest,src ;dest=destxorsrc NOT dest ;dest=notdest TEST dest,src ;destandsrc,執(zhí)行AND操作但不存儲(chǔ)結(jié)果到dest語(yǔ)法格式:

AND reg/mem,reg/mem/imm OR reg/mem,reg/mem/imm XOR reg/mem,reg/mem/imm NOT reg/mem TEST reg/mem,reg/mem/imm 對(duì)標(biāo)誌位的影響:

NOT:無(wú)。其他指令:CF=OF=0,按一般規(guī)則影響SF和ZF。2023-11-1680x86組合語(yǔ)言程式設(shè)計(jì)3.3.3位操作指令1.移位指令

移位指令包括:

SHL(ShiftLeft):邏輯左移

SAL(ShiftArithmeticLeft):算術(shù)左移

SHR(ShiftRight):邏輯右移

SAR(ShiftArithmeticRight):算術(shù)右移其中,SHL與SAL完全相同,只是同一指令的不同助記符而已。一般形式:

SHL dest,count ;dest左移。其中,count為移位次數(shù)(下同)

SAL dest,count ;同SHL SHR dest,count ;dest邏輯右移

SAR dest,count ;dest算術(shù)右移語(yǔ)法格式:

SHL reg/mem,1/CL SHL reg/mem,imm8 ;286新增

SAL、SHR與SAR格式同SHL2023-11-1680x86組合語(yǔ)言程式設(shè)計(jì)3.3.3位操作指令功能描述:

SHL/SAL:左移。最高位移出到CF,最低位移入0。

SAR:算術(shù)右移。最低位移入CF,最高位不變。

SHR:邏輯右移。最低位移入CF,最高位移入0。對(duì)標(biāo)誌位的影響:若移位後符號(hào)位發(fā)生了變化,則OF=1,否則OF=0;CF為最後移入位;按一般規(guī)則影響ZF與SF。然而,若移位次數(shù)為0,則不影響標(biāo)誌位;若移位次數(shù)>1,則OF無(wú)定義?!纠吭O(shè)AX的值為一個(gè)2位元組非壓縮BCD碼,將其轉(zhuǎn)換為1位元組壓縮BCD碼存入AL。

mov cl,4 shl ah,cl ;ah低4位移到高4位

and al,0fh ;al高4位清0 or al,ah 2023-11-1680x86組合語(yǔ)言程式設(shè)計(jì)3.3.3位操作指令2.迴圈移位迴圈移位指令包括:

ROL(RotateLeft):迴圈左移

ROR(RotateRight):迴圈右移

RCL(RotatethroughCarryLeft):帶進(jìn)位迴圈左移

RCR(RotatethroughCarryRight):帶進(jìn)位迴圈右移一般形式:

ROL dest,count ;dest迴圈左移。其中,count為移位次數(shù)(下同)

ROR dest,count ;dest迴圈右移

RCL dest,count ;dest帶CF迴圈左移

RCR dest,count ;dest帶CF迴圈右移語(yǔ)法格式:

ROL reg/mem,1/CL ROL reg/mem,imm8 ;286新增

ROR、RCL、RCR格式同ROL2023-11-1680x86組合語(yǔ)言程式設(shè)計(jì)3.3.3位操作指令功能描述:

ROL:迴圈左移。最高位移出到CF,並同時(shí)移入最低位。

RCL:帶進(jìn)位迴圈左移。最高位移出到CF,原CF移入最低位。

ROR:迴圈右移。最低位移出到CF,並同時(shí)移入最高位。

RCR:帶進(jìn)位迴圈右移。最低位移出到CF,原CF移入最高位。對(duì)標(biāo)誌位的影響:若移位後符號(hào)位發(fā)生了變化,則OF=1,否則OF=0;CF為最後移入位;不影響ZF與SF。然而,若移位次數(shù)為0,則不影響標(biāo)誌位;若移位次數(shù)>1,則OF無(wú)定義。【例】將DX:AX中的32位數(shù)左移1位。

shl ax,1 rcl dx,12023-11-1680x86組合語(yǔ)言程式設(shè)計(jì)3.3.3位操作指令3.位測(cè)試指令

位測(cè)試指令包括;

BT(BitTest):位測(cè)試

BTS(BitTestandSet):位測(cè)試並置位

BTR(BitTestandReset):位測(cè)試並複位

BTC(BitTestandComplement):位測(cè)試並取反)這些指令均為386新增指令。一般形式:

BT dest,index ;CF=dest的第index位,dest不變

BTS dest,index ;CF=dest的第index位,dest的第index位=1 BTR dest,index ;CF=dest的第index位,dest的第index位=0 BTC dest,index ;CF=dest的第index位,dest的第index位取反2023-11-1680x86組合語(yǔ)言程式設(shè)計(jì)3.3.3位操作指令語(yǔ)法格式:

BT reg16/mem16,reg16/imm8 BT reg32/mem32,reg32/imm8 BTR、BTS、BTC格式同BT對(duì)標(biāo)誌位的影響:影響CF;其餘標(biāo)誌無(wú)定義?!纠课粶y(cè)試。

bt eax,12 ;CF=eax的第12位

bts eax,12 ;CF=eax的第12位,eax的第12位=1 btr eax,12 ;CF=eax的第12位,eax的第12位=0 btc eax,12 ;CF=eax的第12位,eax的第12位取反2023-11-1680x86組合語(yǔ)言程式設(shè)計(jì)3.3.4控制轉(zhuǎn)移指令1.JMP(Jump):無(wú)條件轉(zhuǎn)移

一般形式:

JMP target ;轉(zhuǎn)移到target指定的目標(biāo)地址處根據(jù)轉(zhuǎn)移的距離,JMP指令可分為下列兩類(lèi):段內(nèi)轉(zhuǎn)移:在同一代碼段內(nèi)進(jìn)行,又稱(chēng)近(Near)轉(zhuǎn)移,只要修改IP的值即可實(shí)現(xiàn)。段間轉(zhuǎn)移:可在不同代碼段之間進(jìn)行,又稱(chēng)遠(yuǎn)(Far)轉(zhuǎn)移,需要同時(shí)修改CS和IP的值。根據(jù)目標(biāo)地址的指定方式,JMP指令又可分為直接轉(zhuǎn)移和間接轉(zhuǎn)移。所謂直接轉(zhuǎn)移,是指轉(zhuǎn)移的目標(biāo)地址直接出現(xiàn)在指令中,在程式執(zhí)行前就已確定。所謂間接轉(zhuǎn)移,指轉(zhuǎn)移的目標(biāo)地址是寄存器或記憶體運(yùn)算元的值,只有執(zhí)行到該條指令時(shí)才能確定。因此,JMP指令共有下列4種轉(zhuǎn)移方式:段內(nèi)直接轉(zhuǎn)移(Intrasegment/DirectJump)段間直接轉(zhuǎn)移(Intersegment/DirectJump)段內(nèi)間接轉(zhuǎn)移(Intrasegment/IndirectJump)段間間接轉(zhuǎn)移(Intersegment/IndirectJump)在組合語(yǔ)言程式中,通常使用標(biāo)號(hào)(Label)來(lái)指定直接轉(zhuǎn)移的目標(biāo)地址。2023-11-1680x86組合語(yǔ)言程式設(shè)計(jì)3.3.4控制轉(zhuǎn)移指令語(yǔ)法格式:

JMPlabel ;若label與該指令位於同一代碼段:IP=label的偏移地址;

;若label與該指令不在同一代碼段:CS:IP=label的分段地址

JMPreg16/mem16 ;IP=reg16/[mem16] JMPmem32 ;CS=[mem32+2],IP=[mem32]功能描述:

JMP label ;段內(nèi)/段間直接轉(zhuǎn)移

;目標(biāo)地址:標(biāo)號(hào)label處

JMP reg16/mem16;段內(nèi)間接轉(zhuǎn)移

;目標(biāo)地址:同一代碼段,偏移地址=reg16/[mem16] JMP mem32 ;段間間接轉(zhuǎn)移

;目標(biāo)地址:段地址=mem32高字,偏移地址=mem32低字對(duì)標(biāo)誌位的影響:無(wú)。2023-11-1680x86組合語(yǔ)言程式設(shè)計(jì)3.3.4控制轉(zhuǎn)移指令2.條件轉(zhuǎn)移指令

為簡(jiǎn)化描述,用Jcc表示所有條件轉(zhuǎn)移指令的助記符。一般形式:

Jcc label ;若條件成立,則IP=label的偏移地址。其中,label是標(biāo)號(hào)功能描述:若條件成立,則轉(zhuǎn)移到目標(biāo)地址label;否則,CPU忽略該條件轉(zhuǎn)移,繼續(xù)執(zhí)行下一條指令。對(duì)標(biāo)誌位的影響:無(wú)。Jcc指令包括下列3類(lèi):(1)測(cè)試單個(gè)標(biāo)誌位的Jcc指令。(2)用於帶符號(hào)數(shù)比較的Jcc指令。常用在CMP指令之後,以判斷帶符號(hào)數(shù)的大小。(3)用於無(wú)符號(hào)數(shù)比較的Jcc指令。常用在CMP指令之後,以判斷無(wú)符號(hào)數(shù)的大小。2023-11-1680x86組合語(yǔ)言程式設(shè)計(jì)3.3.4控制轉(zhuǎn)移指令3.JCXZ/JECXZ(JumpifCX/ECXisZero)

語(yǔ)法格式:

JCXZ label ;若CX=0,則轉(zhuǎn)移到label JECXZ label ;若ECX=0,則轉(zhuǎn)移到label;386新增對(duì)標(biāo)誌位的影響:無(wú)說(shuō)明:

label相對(duì)位移量必須在-128~127之間,所有80x86CPU都一樣。2023-11-1680x86組合語(yǔ)言程式設(shè)計(jì)3.3.4控制轉(zhuǎn)移指令4.迴圈指令迴圈指令包括:

LOOPLOOPE/LOOPZ(LoopwhileEqual/Zero)

LOOPNE/LOOPNZ(LoopwhileNotEqual/NotZero)LOOPZ與LOOPE、LOOPNZ與LOOPNE完全等價(jià),只是同一指令的不同助記符。語(yǔ)法格式:

LOOP label ;CX=CX–1,若CX<>0,則轉(zhuǎn)移到label LOOPZ/LOOPE label ;CX=CX–1,若CX<>0且ZF=1,則轉(zhuǎn)移到label LOOPNZ/LOOPNE label ;CX=CX–1,若CX<>0且ZF=0,則轉(zhuǎn)移到label對(duì)標(biāo)誌位的影響:無(wú)。2023-11-1680x86組合語(yǔ)言程式設(shè)計(jì)3.3.4控制轉(zhuǎn)移指令5.中斷指令I(lǐng)NT

本章只簡(jiǎn)單引入軟體中斷調(diào)用指令I(lǐng)NT。詳細(xì)介紹參見(jiàn)第8章。語(yǔ)法格式:

INT n ;調(diào)用中斷n的中斷服務(wù)程式。n為中斷號(hào),取值0~255。對(duì)標(biāo)誌位的影響:不影響CF、OF、SF、ZF。

MSDOS使用中斷號(hào)21H作為系統(tǒng)調(diào)用,為程式員提供了上百種系統(tǒng)服務(wù)功能,對(duì)這些功能的調(diào)用步驟如下:(1)由AH給出功能號(hào)。(2)根據(jù)相應(yīng)功能的要求,設(shè)置入口參數(shù)。(3)INT21H。(4)分析和使用出口參數(shù)。其中,最常用的是功能號(hào)4CH,用來(lái)實(shí)現(xiàn)程式退出、並返回DOS。使用方法如下:

mov ah,4ch int 21h2023-11-1680x86組合語(yǔ)言程式設(shè)計(jì)3.3.5標(biāo)誌處理指令

標(biāo)誌處理指令包括CLC(ClearCarryFlag,CF清0)、STC(SetCarryFlag,CF置1)、CMC(ComplementCarryFlag,CF取反)、CLD(ClearDirectionFlag,DF清0)、STD(SetDirectionFlag,DF置1)、CLI(ClearInterruptFlag,關(guān)中斷)和STI(SetInterruptFlag,開(kāi)中斷)。語(yǔ)法格式:

CLC ;CF=0 STC ;CF=1 CMC ;CF=NOTCF CLD ;DF=0 STD ;DF=1 CLI ;IF=0 STI ;IF=1

對(duì)標(biāo)誌位的影響:只影響指定標(biāo)誌。注意,在程式中應(yīng)慎重使用CLI指令,錯(cuò)誤的使用會(huì)導(dǎo)致系統(tǒng)無(wú)法正常工作。2023-11-1680x86組合語(yǔ)言程式設(shè)計(jì)3.3.6處理器控制指令1.NOP(NoOperation):無(wú)操作語(yǔ)法格式:

NOP功能描述:NOP指令不做任何事情,只佔(zhàn)用1個(gè)位元組,耗費(fèi)1個(gè)指令執(zhí)行週期。說(shuō)明:程式員經(jīng)常使用NOP作為占位符(PlaceHolder),以預(yù)留記憶體空間。當(dāng)然,可以使用其他指令實(shí)現(xiàn)類(lèi)似功能,如XCHGAX,AX指令。事實(shí)上,NOP與XCHGAX,AX的機(jī)器碼完全一樣,都是90H。對(duì)標(biāo)誌位的影響:無(wú)。

2023-11-1680x86組合語(yǔ)言程式設(shè)計(jì)3.3.6處理器控制指令2.HLT(Halt):暫停語(yǔ)法格式:

HLT功能描述:使CPU進(jìn)入暫停狀態(tài),這時(shí)CPU不執(zhí)行任何操作,直到系統(tǒng)複位或發(fā)生外部中斷為止。中斷使CPU繼續(xù)執(zhí)行HLT後的下一條指令。說(shuō)明:

HLT不能用來(lái)終止程式。通常,應(yīng)用程式不使用該指令。對(duì)標(biāo)誌位的影響:無(wú)。2023-11-1680x86組合語(yǔ)言程式設(shè)計(jì)3.4容易犯的錯(cuò)誤1.運(yùn)算元類(lèi)型不匹配例如,將BL的值送AX。錯(cuò)誤方法:

mov ax,bl ;類(lèi)型不匹配正確方法:(1)作為無(wú)符號(hào)數(shù)。

mov al,bl mov ah,0(2)作為帶符號(hào)數(shù)。

mov al,bl cbw

2023-11-1680x86組合語(yǔ)言程式設(shè)計(jì)3.4容易犯的錯(cuò)誤2.憑空構(gòu)造指令例如:(1)實(shí)現(xiàn)AX=AL*5。錯(cuò)誤方法:

mul 5 ;MUL的運(yùn)算元不能是立即數(shù)(2)將記憶體單元(段地址在DS,偏移地址在AX)的一個(gè)位元組送BL。錯(cuò)誤方法:

mov bl,[ax] ;記憶體運(yùn)算元不能用[AX]正確方法:

mov si,ax mov bl,[si]2023-11-1680x86組合語(yǔ)言程式設(shè)計(jì)3.4容易犯的錯(cuò)誤3.對(duì)標(biāo)誌位的錯(cuò)誤使用例如:判斷AX的值,若AX=0FFFFH,則轉(zhuǎn)移到標(biāo)號(hào)L。錯(cuò)誤方法:

not ax ;NOT不影響標(biāo)誌位

jz l正確方法:

xor ax,0ffffh jz l或

cmp ax,0ffffh je l2023-11-1680x86組合語(yǔ)言程式設(shè)計(jì)3.5實(shí)例舉例說(shuō)明指令的使用方法。如例3.41、3.42、3.43、3.46等。2023-11-1680x86組合語(yǔ)言程式設(shè)計(jì)4.1地址計(jì)數(shù)器

彙編器在將根源程式轉(zhuǎn)換為目標(biāo)程式的過(guò)程中,每彙編一個(gè)段,都需要跟蹤其中代碼或數(shù)據(jù)的偏移地址,這就是地址計(jì)數(shù)器。地址計(jì)數(shù)器的值表示當(dāng)前偏移地址。在缺省情況下,段的偏移地址從0開(kāi)始。例如,下列指令序列:0: mov bl,al ;機(jī)器碼為2位元組2: and bl,0fh ;機(jī)器碼為3位元組5: mov bh,al ;機(jī)器碼為2位元組7: shr bh,4 ;機(jī)器碼為3位元組A:

若該指令序列出現(xiàn)在段的開(kāi)始,那麼,在彙編相應(yīng)指令時(shí),地址計(jì)數(shù)器的值如左側(cè)所示。例如,第1條MOV指令始於偏移地址0,由於該MOV指令是2位元組,故下一條指令始於偏移地址2,等等。

2023-11-1680x86組合語(yǔ)言程式設(shè)計(jì)4.2組合語(yǔ)言語(yǔ)句1.語(yǔ)句格式(1)語(yǔ)句的書(shū)寫(xiě)形式: 名字 助記符 運(yùn)算元 ;注釋?zhuān)?)MASM對(duì)語(yǔ)句格式的要求:大小寫(xiě)無(wú)關(guān)。每條語(yǔ)句必須占1行,但可以使用續(xù)行符“\”。為了提高可讀性,應(yīng)該使各個(gè)域?qū)R。2.常數(shù)與數(shù)值運(yùn)算式整數(shù)。包括二進(jìn)位、十進(jìn)位、八進(jìn)制或十六進(jìn)製錶示的整數(shù)。字元與字串。必須用單引號(hào)或雙引號(hào)括起來(lái)。數(shù)值運(yùn)算式。2023-11-1680x86組合語(yǔ)言程式設(shè)計(jì)3.變數(shù)、標(biāo)號(hào)與地址運(yùn)算式變數(shù)與標(biāo)號(hào)的3種屬性:段地址、偏移地址、類(lèi)型。變數(shù)的類(lèi)型包括BYTE(位元組)、WORD(字)、DWORD(雙字)等。標(biāo)號(hào)的類(lèi)型包括NEAR和FAR。地址運(yùn)算式。 地址運(yùn)算式的基本形式為: 變數(shù)名或標(biāo)號(hào)名±常數(shù)其類(lèi)型由相應(yīng)的變數(shù)或標(biāo)號(hào)確定。兩個(gè)地址運(yùn)算式的差表示兩個(gè)地址之間的距離(位元組數(shù)),兩個(gè)地址必須在同一個(gè)段內(nèi)。注意,不能將兩個(gè)地址運(yùn)算式相加。

$是一個(gè)特殊的地址運(yùn)算式,表示當(dāng)前地址,即地址計(jì)數(shù)器的當(dāng)前值。2023-11-1680x86組合語(yǔ)言程式設(shè)計(jì)4.3基本偽指令1.處理器選擇偽指令在缺省方式下,MASM只承認(rèn)8086指令。為了使用更高的CPU指令,必須使用處理器選擇偽指令,主要包括:

.8086 .286 .286P .386 .386P .486 .486P .586 .586P .686 .686P分別表示其後面的代碼使用相應(yīng)CPU的指令。其中,結(jié)尾的'P'表示使用特權(quán)指令。若使用32位CPU新增指令以及寄存器或記憶體尋址方式,則至少要用.386偽指令。2023-11-1680x86組合語(yǔ)言程式設(shè)計(jì)4.3基本偽指令2.段定義偽指令

段定義由SEGMENT與ENDS偽指令實(shí)現(xiàn),基本形式如下: 段名 SEGMENTSTACKUSE16 <語(yǔ)句序列>

段名 ENDS

其中,STACK僅用於堆疊段。USE16指出使用16位段。在實(shí)模式下,只能使用16位段,而32位段只能用於保護(hù)模式程式。在實(shí)模式下,如果要使用32位指令,還必須在段定義時(shí)給出USE16。段名作為運(yùn)算元出現(xiàn)在指令中時(shí),MASM將其視為立即數(shù),表示段地址。

2023-11-1680x86組合語(yǔ)言程式設(shè)計(jì)4.3基本偽指令3.符號(hào)定義偽指令基本形式: 符號(hào)名 EQU 運(yùn)算式 符號(hào)名 = 常數(shù)運(yùn)算式功能:給運(yùn)算式指定一個(gè)等價(jià)的符號(hào)名。說(shuō)明:(1)=後的運(yùn)算式只能是常數(shù),對(duì)於字元或字串,彙編時(shí)按整數(shù)處理。例如:

COUNT = 20 MOV CX,COUNT ;等價(jià)於MOVCX,20(2)EQU後的運(yùn)算式可以是數(shù)值、字串、寄存器名、指令助記符等。(3)EQU不能重複定義,而=可重複定義,其作用域從定義點(diǎn)到重新定義之前。2023-11-1680x86組合語(yǔ)言程式設(shè)計(jì)4.3基本偽指令4.變數(shù)定義偽指令變數(shù)定義偽指令用來(lái)為數(shù)據(jù)分配記憶體空間,並設(shè)置相應(yīng)記憶體單元的初始值。形式: 變數(shù)名 變數(shù)定義符

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論