版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(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è)問題,用匯編語(yǔ)言設(shè)計(jì)出的程序能達(dá)到“運(yùn)行速度最快”??臻g:對(duì)于同一個(gè)問題,用匯編語(yǔ)言設(shè)計(jì)出的程序能達(dá)到“占用空間最少”。功能:匯編語(yǔ)言可以實(shí)現(xiàn)高級(jí)語(yǔ)言難以勝任甚至不能完成的任務(wù)。知識(shí):學(xué)習(xí)匯編語(yǔ)言,有助于對(duì)計(jì)算機(jī)系統(tǒng)的理解、寫出更好的程序。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)制位。計(jì)算機(jī)是在特定位數(shù)下工作的,如8位、16位、32位等。
字節(jié)(Byte):8位。位編號(hào)從右到左為0~7,第0位為最低位,第7位為最高位。
字(Word):16位。位編號(hào)從右到左為0~15,第0位為最低位,第15位為最高位。位0~7為低字節(jié),位8~15為高字節(jié)。
雙字(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ù)范圍為0~2N-1。例如,8位二進(jìn)制數(shù)00H~0FFH表示0~255,16位二進(jìn)制數(shù)0000H~0FFFFH表示0~65535。
2.帶符號(hào)數(shù)的補(bǔ)碼表示補(bǔ)碼的表示規(guī)則:以最高位作為符號(hào)位(0表示正數(shù),1表示負(fù)數(shù))。正數(shù)的補(bǔ)碼是其本身。負(fù)數(shù)的補(bǔ)碼是對(duì)其正數(shù)“各位求反、末位加1”后形成的。把“各位求反、末位加1”的操作稱作求補(bǔ)。求補(bǔ)就是求相反數(shù)。
N位二進(jìn)制補(bǔ)碼數(shù)可以表示的帶符號(hào)數(shù)范圍為-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ǔ)碼的特性
求補(bǔ)
[x]補(bǔ)
[-x]補(bǔ)
[x+y]補(bǔ)=[x]補(bǔ)+
[y]補(bǔ)
[x-y]補(bǔ)=[x]補(bǔ)+
[-y]補(bǔ)
說(shuō)明:在計(jì)算機(jī)內(nèi)部,補(bǔ)碼減法是通過(guò)對(duì)減數(shù)求補(bǔ)后將減法轉(zhuǎn)換為加法進(jìn)行的。一個(gè)帶符號(hào)數(shù)在不同位數(shù)下,其二進(jìn)制補(bǔ)碼表示可能是不同的。例如,8位數(shù)-1的補(bǔ)碼表示是0FFH,16位數(shù)-1的補(bǔ)碼表示是0FFFFH。2023/11/1680x86匯編語(yǔ)言程序設(shè)計(jì)4.補(bǔ)碼的物理意義考慮8位二進(jìn)制數(shù),其表示范圍為0~255,即256=0。若將其想象為一個(gè)環(huán),以0為基點(diǎn),向順時(shí)針方向移246個(gè)單位,則得246。然而,若按逆時(shí)針方向移動(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碼字符集采用一個(gè)字節(jié)表示字符。常用字符的ASCII碼。數(shù)字'0'~'9':30H~39H
字母'A'~'Z':41H~5AH
字母'a'~'z':61H~7AH
空格:20H
回車CR:0DH
換行LF:0AH
空字符:0
注意回車與換行的差別:
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ù)密切相關(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.移位與循環(huán)移位左移:最低位移入0。在不溢出的情況下,左移1位相當(dāng)于乘以2。邏輯右移:最高位移入0。邏輯右移1位約等于無(wú)符號(hào)數(shù)除以2。算術(shù)右移:最高位不變。算術(shù)右移1位約等于帶符號(hào)數(shù)除以2。循環(huán)左移與循環(huán)右移:從一端移出的位要移入到另一端。2023/11/1680x86匯編語(yǔ)言程序設(shè)計(jì)2.180x86計(jì)算機(jī)的基本結(jié)構(gòu)80x86計(jì)算機(jī)的組成:
CPU
內(nèi)存
I/O子系統(tǒng)各部分以系統(tǒng)總線相連2023/11/1680x86匯編語(yǔ)言程序設(shè)計(jì)2.1.1CPU
計(jì)算機(jī)執(zhí)行程序時(shí),首先要將其裝入內(nèi)存,然后由CPU執(zhí)行程序指令。
CPU的作用:執(zhí)行算術(shù)與邏輯運(yùn)算??刂浦噶畹膱?zhí)行。通常,將Intel公司生產(chǎn)的8086/8088、80286、80386、80486、Pentium、PentiumPro、PentiumII、PentiumIII、Pentium4及其兼容的CPU,統(tǒng)稱為80x86CPU或x86CPU,將基于這些CPU的計(jì)算機(jī),稱為80x86計(jì)算機(jī)或x86計(jì)算機(jī)。2023/11/1680x86匯編語(yǔ)言程序設(shè)計(jì)2.1.2系統(tǒng)總線
總線是部件之間進(jìn)行數(shù)據(jù)(電信號(hào))交換的通道。
80x86計(jì)算機(jī)的系統(tǒng)總線分為3類:數(shù)據(jù)總線地址總線控制總線1.數(shù)據(jù)總線數(shù)據(jù)總線是用來(lái)傳遞數(shù)據(jù)的,定義了CPU在每個(gè)內(nèi)存周期所能存取數(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ù)的地址(內(nèi)存或I/O)。地址總線的位數(shù)決定了最大可編址的內(nèi)存與I/O空間。對(duì)于N位地址總線,CPU可以提供2N個(gè)不同地址:0~2N-1。地址總線由內(nèi)存與I/O子系統(tǒng)共享使用(I/O只用低16位)。
3.控制總線控制總線用來(lái)控制CPU與內(nèi)存和I/O設(shè)備之間的數(shù)據(jù)傳送方式(如傳送方向)。
2023/11/1680x86匯編語(yǔ)言程序設(shè)計(jì)2.1.3內(nèi)存
內(nèi)存是存放指令和數(shù)據(jù)的部件,由若干內(nèi)存單元構(gòu)成。
80x86的內(nèi)存以字節(jié)編址:每個(gè)內(nèi)存單元有唯一的地址,可存放1個(gè)字節(jié)。要正確理解內(nèi)存單元的2個(gè)要素:地址(編號(hào))與值(內(nèi)容)。
1個(gè)字占據(jù)2個(gè)相鄰的內(nèi)存單元;低字節(jié)在低地址單元,高字節(jié)在高地址單元;字的地址由其低地址來(lái)表示。雙字也類似。同一地址可以看作是字節(jié)、字或雙字單元的地址,取決于具體的使用方式。2023/11/1680x86匯編語(yǔ)言程序設(shè)計(jì)2.1.4I/O子系統(tǒng)
每個(gè)I/O設(shè)備必須通過(guò)專門的I/O接口電路與主機(jī)(CPU和內(nèi)存)相連。
I/O端口:即I/O地址,是區(qū)分I/O設(shè)備及其寄存器的編號(hào)。
80x86的I/O端口為16位。
I/O端口類似于內(nè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.專用寄存器指令指針: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開始引入的。2023/11/1680x86匯編語(yǔ)言程序設(shè)計(jì)2.380x86CPU的工作模式2.3.180x86CPU的3種工作模式1.實(shí)模式與8086兼容的工作模式,只有低20位地址線起作用,僅能尋址第一個(gè)1MB的內(nèi)存空間。MSDOS運(yùn)行在實(shí)模式下。2.保護(hù)模式
32位80x86CPU的主要工作模式,提供對(duì)程序和數(shù)據(jù)進(jìn)行安全檢查的保護(hù)機(jī)制。Windows9x/NT/2000運(yùn)行在保護(hù)模式下。3.虛擬8086模式在Windows9x下,若打開一個(gè)MSDOS窗口,運(yùn)行一個(gè)DOS應(yīng)用程序,那么該程序就運(yùn)行在虛擬8086模式下。2023/11/1680x86匯編語(yǔ)言程序設(shè)計(jì)2.3.2實(shí)模式1.內(nèi)存分段
80x86采用分段內(nèi)存管理機(jī)制,主要包括下列幾種類型的段:代碼段:用來(lái)存放程序的指令序列。數(shù)據(jù)段:用來(lái)存放程序的數(shù)據(jù)。堆棧段:作為堆棧使用的內(nèi)存區(qū)域,用來(lái)存放過(guò)程返回地址、過(guò)程參數(shù)等。一個(gè)程序可以擁有多個(gè)代碼段、多個(gè)數(shù)據(jù)段甚至多個(gè)堆棧段。
2023/11/1680x86匯編語(yǔ)言程序設(shè)計(jì)
2.物理地址與邏輯地址物理地址:內(nèi)存單元的實(shí)際地址,也就是出現(xiàn)在地址總線上的地址。邏輯地址:或稱分段地址,記作 段地址:段內(nèi)偏移地址 段地址表示段在內(nèi)存中的起始位置,通常被保存在某個(gè)段寄存器中。段內(nèi)偏移地址表示內(nèi)存單元相對(duì)于段起始位置的位移,簡(jiǎn)稱偏移地址,也叫有效地址EA。段地址與偏移地址都是16位。系統(tǒng)采用下列方法將邏輯地址自動(dòng)轉(zhuǎn)換為20位的物理地址: 物理地址=段地址×16+偏移地址每個(gè)內(nèi)存單元具有唯一的物理地址,但可由不同的邏輯地址描述。
2023/11/1680x86匯編語(yǔ)言程序設(shè)計(jì)
3.實(shí)模式的編程要點(diǎn)采用16位段,段地址與偏移地址均為16位,即使32位80x86CPU(80386及更高)也只能尋址1MB的內(nèi)存空間。
CPU總是從地址CS:IP處取指令,EIP的高16位為0。
SS:SP指向堆棧段的棧頂?shù)刂?,ESP的高16位為0。在32位80x86CPU下,程序可以使用32位寄存器和32位操作數(shù),但采用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ǔ)碼表示的范圍,則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é)果最低字節(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ù)的表示范圍。對(duì)于n位二進(jìn)制數(shù)來(lái)說(shuō),無(wú)符號(hào)數(shù)表示范圍為0~2n-1,例如,n=8和16時(shí)分別為0~255和0~65535。
OF表示帶符號(hào)溢出,即運(yùn)算結(jié)果超出了帶符號(hào)數(shù)的表示范圍。對(duì)于n位二進(jìn)制數(shù)來(lái)說(shuō),帶符號(hào)數(shù)表示范圍為-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計(jì)算機(jī)由CPU、內(nèi)存和I/O子系統(tǒng)三部分組成,各部分之間由系統(tǒng)總線相連。數(shù)據(jù)總線決定了CPU每次存取數(shù)據(jù)的最大寬度(位數(shù));地址總線決定了最大可編址空間;控制總線用來(lái)控制CPU與內(nèi)存和I/O設(shè)備之間的數(shù)據(jù)傳送方式。
80x86系統(tǒng)的I/O地址為16位,可尋址65536個(gè)不同的I/O端口。
80x86程序可以存取的最小數(shù)據(jù)單位是字節(jié)。例如,若要讀取的位數(shù)不足8位,則只能先讀出一個(gè)完整字節(jié),再屏蔽掉其它位。字的存儲(chǔ)采取“低字節(jié)在低地址,高字節(jié)在高地址,字的地址由低地址表示”的小端方式,雙字也類似。要正確理解內(nèi)存單元的地址和值,地址表示位置,值是相應(yīng)位置處的內(nèi)容。同一地址既可以看作字節(jié)單元地址,也可以看作字甚至雙字單元地址,取決于具體的使用方式。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開始引入的。2023/11/1680x86匯編語(yǔ)言程序設(shè)計(jì)3.1指令格式1.指令的書寫格式 標(biāo)號(hào): 指令助記符 操作數(shù) ;注釋2.操作數(shù)的3種形式:立即操作數(shù):指令的操作數(shù)是立即數(shù),并直接出現(xiàn)在指令中。寄存器操作數(shù):操作數(shù)是寄存器的值,指令中使用寄存器名。內(nèi)存操作數(shù):操作數(shù)是某個(gè)內(nèi)存單元的值,指令中給出有效地址EA,段地址在某個(gè)段寄存器中。2023/11/1680x86匯編語(yǔ)言程序設(shè)計(jì)3.2操作數(shù)的形式3.2.18086指令的操作數(shù)形式1.立即數(shù):8位或16位立即數(shù)。2.寄存器操作數(shù):
8位/16位通用寄存器和段寄存器(除了FS和GS)。3.內(nèi)存操作數(shù)包括下列幾種形式。
Variable 或[Variable] [reg] disp[reg] [base][index] disp[base][index]
說(shuō)明:
Variable是變量名或變量名±整數(shù)表達(dá)式。
reg為BX、BP、SI、DI。
disp可以是常量或變量,匯編后為一個(gè)常數(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ò)展的操作數(shù)形式1.立即數(shù):32位立即數(shù)。2.寄存器操作數(shù):32位通用寄存器以及FS和GS。3.內(nèi)存操作數(shù)包括下列幾種形式。
[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為比例因子,取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ì)為了描述方便,采用下列符號(hào)約定:dest —目的操作數(shù)src —源操作數(shù)oprdn —第n個(gè)操作數(shù),如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位內(nèi)存操作數(shù)mem16 —16位內(nèi)存操作數(shù)mem32 —32位內(nèi)存操作數(shù)mem —mem8/mem16/mem32mem64 —64位內(nèi)存操作數(shù)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。將源操作數(shù)src復(fù)制到目的操作數(shù)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必須類型匹配,即同時(shí)是字節(jié)、字或雙字類型。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類型必須匹配。、【例】
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í),棧頂和棧底指向同一內(nèi)存單元。堆棧有兩個(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 ;操作數(shù)不能是CS PUSH imm ;286新增功能描述:
PUSH指令(16位):
SP=SP-2 SS:[SP]=16位操作數(shù)
POP指令(16位):
16位操作數(shù)=SS:[SP] SP=SP+2 PUSH指令(32位):
SP=SP-4 SS:[SP]=32位操作數(shù)
POP指令(32位):
32位操作數(shù)=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所指內(nèi)存區(qū)中、由AL指定位移處的一個(gè)字節(jié)賦給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è)操作數(shù)必須類型匹配,且不能同時(shí)是內(nèi)存操作數(shù)。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è)操作數(shù)必須類型匹配,且不能同時(shí)是內(nèi)存操作數(shù)。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位,因此,若操作數(shù)是8位,則結(jié)果為16位;同樣,16位操作數(shù)相乘結(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位,因此,若操作數(shù)是8位,則結(jié)果為16位;同樣,16位操作數(shù)相乘結(jié)果為32位,32位數(shù)相乘結(jié)果為64位。【例】對(duì)于同一個(gè)二進(jìn)制數(shù),采用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)算的操作數(shù)應(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為目的操作數(shù),將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為目的操作數(shù),將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字節(jié)非壓縮BCD碼,將其轉(zhuǎn)換為1字節(jié)壓縮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.循環(huán)移位循環(huán)移位指令包括:
ROL(RotateLeft):循環(huán)左移
ROR(RotateRight):循環(huán)右移
RCL(RotatethroughCarryLeft):帶進(jìn)位循環(huán)左移
RCR(RotatethroughCarryRight):帶進(jìn)位循環(huán)右移一般形式:
ROL dest,count ;dest循環(huán)左移。其中,count為移位次數(shù)(下同)
ROR dest,count ;dest循環(huán)右移
RCL dest,count ;dest帶CF循環(huán)左移
RCR dest,count ;dest帶CF循環(huán)右移語(yǔ)法格式:
ROL reg/mem,1/CL ROL reg/mem,imm8 ;286新增
ROR、RCL、RCR格式同ROL2023/11/1680x86匯編語(yǔ)言程序設(shè)計(jì)3.3.3位操作指令功能描述:
ROL:循環(huán)左移。最高位移出到CF,并同時(shí)移入最低位。
RCL:帶進(jìn)位循環(huán)左移。最高位移出到CF,原CF移入最低位。
ROR:循環(huán)右移。最低位移出到CF,并同時(shí)移入最高位。
RCR:帶進(jìn)位循環(huán)右移。最低位移出到CF,原CF移入最高位。對(duì)標(biāo)志位的影響:若移位后符號(hào)位發(fā)生了變化,則OF=1,否則OF=0;CF為最后移入位;不影響ZF與SF。然而,若移位次數(shù)為0,則不影響標(biāo)志位;若移位次數(shù)>1,則OF無(wú)定義?!纠繉X: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è)試并復(fù)位
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指令可分為下列兩類:段內(nèi)轉(zhuǎn)移:在同一代碼段內(nèi)進(jìn)行,又稱近(Near)轉(zhuǎn)移,只要修改IP的值即可實(shí)現(xiàn)。段間轉(zhuǎn)移:可在不同代碼段之間進(jìn)行,又稱遠(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)地址是寄存器或內(nèi)存操作數(shù)的值,只有執(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類:(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.循環(huán)指令循環(huán)指令包括:
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ì)介紹參見第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,開中斷)。語(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指令不做任何事情,只占用1個(gè)字節(jié),耗費(fèi)1個(gè)指令執(zhí)行周期。說(shuō)明:程序員經(jīng)常使用NOP作為占位符(PlaceHolder),以預(yù)留內(nèi)存空間。當(dāng)然,可以使用其它指令實(shí)現(xiàn)類似功能,如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ù)位或發(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.操作數(shù)類型不匹配例如,將BL的值送AX。錯(cuò)誤方法:
mov ax,bl ;類型不匹配正確方法:(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的操作數(shù)不能是立即數(shù)(2)將內(nèi)存單元(段地址在DS,偏移地址在AX)的一個(gè)字節(jié)送BL。錯(cuò)誤方法:
mov bl,[ax] ;內(nèi)存操作數(shù)不能用[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開始。例如,下列指令序列:0: mov bl,al ;機(jī)器碼為2字節(jié)2: and bl,0fh ;機(jī)器碼為3字節(jié)5: mov bh,al ;機(jī)器碼為2字節(jié)7: shr bh,4 ;機(jī)器碼為3字節(jié)A:
若該指令序列出現(xiàn)在段的開始,那么,在匯編相應(yīng)指令時(shí),地址計(jì)數(shù)器的值如左側(cè)所示。例如,第1條MOV指令始于偏移地址0,由于該MOV指令是2字節(jié),故下一條指令始于偏移地址2,等等。
2023/11/1680x86匯編語(yǔ)言程序設(shè)計(jì)4.2匯編語(yǔ)言語(yǔ)句1.語(yǔ)句格式(1)語(yǔ)句的書寫形式: 名字 助記符 操作數(shù) ;注釋(2)MASM對(duì)語(yǔ)句格式的要求:大小寫無(wú)關(guān)。每條語(yǔ)句必須占1行,但可以使用續(xù)行符“\”。為了提高可讀性,應(yīng)該使各個(gè)域?qū)R。2.常數(shù)與數(shù)值表達(dá)式整數(shù)。包括二進(jìn)制、十進(jìn)制、八進(jìn)制或十六進(jìn)制表示的整數(shù)。字符與字符串。必須用單引號(hào)或雙引號(hào)括起來(lái)。數(shù)值表達(dá)式。2023/11/1680x86匯編語(yǔ)言程序設(shè)計(jì)3.變量、標(biāo)號(hào)與地址表達(dá)式變量與標(biāo)號(hào)的3種屬性:段地址、偏移地址、類型。變量的類型包括BYTE(字節(jié))、WORD(字)、DWORD(雙字)等。標(biāo)號(hào)的類型包括NEAR和FAR。地址表達(dá)式。 地址表達(dá)式的基本形式為: 變量名或標(biāo)號(hào)名±常數(shù)其類型由相應(yīng)的變量或標(biāo)號(hào)確定。兩個(gè)地址表達(dá)式的差表示兩個(gè)地址之間的距離(字節(jié)數(shù)),兩個(gè)地址必須在同一個(gè)段內(nèi)。注意,不能將兩個(gè)地址表達(dá)式相加。
$是一個(gè)特殊的地址表達(dá)式,表示當(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新增指令以及寄存器或內(nèi)存尋址方式,則至少要用.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。段名作為操作數(shù)出現(xiàn)在指令中時(shí),MASM將其視為立即數(shù),表示段地址。
2023/11/1680x86匯編語(yǔ)言程序設(shè)計(jì)4.3基本偽指令3.符號(hào)定義偽指令基本形式: 符號(hào)名 EQU 表達(dá)式 符號(hào)名 = 常數(shù)表達(dá)式功能:給表達(dá)式指定一個(gè)等價(jià)的符號(hào)名。說(shuō)明:(1)=后的表達(dá)式只能是常數(shù),對(duì)于字符或字符串,匯編時(shí)按整數(shù)處理。例如:
COUNT = 20 MOV CX,COUNT ;等價(jià)于MOVCX,20(2)EQU后的表達(dá)式可以是數(shù)值、字符串、寄存器名、指令助記符等。(3)EQU不能重復(fù)定義,而=可重復(fù)定義,其作用域從定義點(diǎn)到重新定義之前。2023/11/1680x86匯編語(yǔ)言程序設(shè)計(jì)4.3基本偽指令4.變量定義偽指令變量定義偽指令用來(lái)為數(shù)據(jù)分配內(nèi)存空間,并設(shè)置相應(yīng)內(nèi)存單元的初始值。形式: 變量名 變量定義符操作數(shù),,...,操作數(shù)其中,變量名是一個(gè)符號(hào)地址,表示其后操作數(shù)的首地址,變量名為可選項(xiàng),給出變量名只是為了按名存取其對(duì)應(yīng)的內(nèi)存單元。變量定義符主要包括下列幾種:
DB(DefineByte):定義字節(jié),后面的每個(gè)操作數(shù)占1個(gè)字節(jié)。
DW(DefineWord):定義字,后面的每個(gè)操作數(shù)占1個(gè)
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2023八年級(jí)數(shù)學(xué)上冊(cè) 第13章 全等三角形13.2三角形全等的判定 4角邊角說(shuō)課稿 (新版)華東師大版
- 2024年四年級(jí)品社下冊(cè)《怎樣到達(dá)目的地》說(shuō)課稿2 蘇教版
- 2025鋼質(zhì)門小型鋼結(jié)構(gòu)制作及安裝合同
- 2025個(gè)人電路出租合同書
- 2025公司經(jīng)理勞動(dòng)合同
- 道路邊坡加固維修施工方案
- 交通圍欄銷售合同范本
- 農(nóng)業(yè)營(yíng)銷合作合同范本
- 保溫鋼結(jié)構(gòu)合同范本
- Sara's Medicine(說(shuō)課稿)-2023-2024學(xué)年麗聲北極星分級(jí)繪本四年級(jí)上(江蘇版)
- ptmeg生產(chǎn)工藝技術(shù)
- 食堂餐廳服務(wù)方案投標(biāo)方案(技術(shù)標(biāo))
- Creo-7.0基礎(chǔ)教程-配套課件
- 六年級(jí)人教版上冊(cè)數(shù)學(xué)計(jì)算題練習(xí)題(及答案)100解析
- 化療藥物分類及不良反應(yīng)的處理課件
- 超聲科質(zhì)量控制制度及超聲科圖像質(zhì)量評(píng)價(jià)細(xì)則
- 初中物理滬粵版八年級(jí)下冊(cè)《第六章 力和機(jī)械》章節(jié)練習(xí)(含答案)
- 金礦管理制度
- 橋梁樁基礎(chǔ)施工概述及施工控制要點(diǎn)
- SB/T 10415-2007雞粉調(diào)味料
- JB/T 20036-2016提取濃縮罐
評(píng)論
0/150
提交評(píng)論