




版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 健康養(yǎng)老展服務(wù)博覽會(huì)方案
- 項(xiàng)鏈說(shuō)課課件2017
- 《旅行社經(jīng)營(yíng)管理》課件-第三章 旅行社產(chǎn)品開(kāi)發(fā)設(shè)計(jì)
- 音標(biāo)教學(xué)課件
- 人民警察法制教育
- 城鎮(zhèn)污水管網(wǎng)建設(shè)工程建設(shè)管理方案(模板范文)
- 健康飲食產(chǎn)業(yè)園項(xiàng)目投標(biāo)書(shū)(參考)
- xx河流排水防澇設(shè)施建設(shè)項(xiàng)目可行性研究報(bào)告
- 先鋒問(wèn)答知識(shí):政治建設(shè)題庫(kù)考點(diǎn)(題庫(kù)版)
- 2025年鋰電池正極材料合作協(xié)議書(shū)
- 建筑學(xué)專(zhuān)業(yè)創(chuàng)新型人才培養(yǎng)模式的構(gòu)建與實(shí)踐研究
- 國(guó)家開(kāi)放大學(xué)漢語(yǔ)言文學(xué)本科《古代詩(shī)歌散文專(zhuān)題》期末紙質(zhì)考試第一大題選擇題庫(kù)2025春期版
- 工程造價(jià)司法鑒定實(shí)施方案
- 煤礦崗位作業(yè)流程培訓(xùn)
- 2024年紹興市鏡湖開(kāi)發(fā)集團(tuán)有限公司下屬?lài)?guó)企招聘筆試真題
- 眼科院感培訓(xùn)
- 混凝土工培訓(xùn)
- “三新”背景下高中語(yǔ)文大單元教學(xué)的策略研究
- 2025年中國(guó)體外培育牛黃行業(yè)發(fā)展監(jiān)測(cè)及投資戰(zhàn)略咨詢(xún)報(bào)告
- 設(shè)備廠(chǎng)房租賃合同
- 華師大版七年級(jí)上冊(cè)初一數(shù)學(xué)(基礎(chǔ)版)(全冊(cè)知識(shí)點(diǎn)考點(diǎn)梳理、重點(diǎn)題型分類(lèi)鞏固練習(xí))(家教、補(bǔ)習(xí)、復(fù)習(xí)用)
評(píng)論
0/150
提交評(píng)論