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

下載本文檔

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

文檔簡介

2023/11/1680x86匯編語言程序設(shè)計第1章基礎(chǔ)知識講授要點

認識匯編語言數(shù)據(jù)表示基本位操作2023/11/1680x86匯編語言程序設(shè)計1.1認識匯編語言1.程序設(shè)計語言機器語言匯編語言:機器語言的符號化,與機器密切相關(guān)。高級語言2.匯編語言的意義速度:對于同一個問題,用匯編語言設(shè)計出的程序能達到“運行速度最快”??臻g:對于同一個問題,用匯編語言設(shè)計出的程序能達到“占用空間最少”。功能:匯編語言可以實現(xiàn)高級語言難以勝任甚至不能完成的任務(wù)。知識:學習匯編語言,有助于對計算機系統(tǒng)的理解、寫出更好的程序。2023/11/1680x86匯編語言程序設(shè)計1.2數(shù)據(jù)表示

數(shù)制的基本知識

10進制

2進制

16進制說明:前導0可以忽略,不影響取值。結(jié)尾用D(10進制數(shù))、B(2進制數(shù))、H(16進制數(shù))。缺省為十進制數(shù)。2023/11/1680x86匯編語言程序設(shè)計1.2.1數(shù)據(jù)組織

位(Bit):1個二進制位。計算機是在特定位數(shù)下工作的,如8位、16位、32位等。

字節(jié)(Byte):8位。位編號從右到左為0~7,第0位為最低位,第7位為最高位。

字(Word):16位。位編號從右到左為0~15,第0位為最低位,第15位為最高位。位0~7為低字節(jié),位8~15為高字節(jié)。

雙字(DoubleWord):32位。位編號從右到左為0~31,第0位為最低位,第31位為最高位。位0~15為低字,位16~31為高字。2023/11/1680x86匯編語言程序設(shè)計1.2.2無符號數(shù)與帶符號數(shù)1.無符號數(shù)

N位二進制數(shù)可以表示的無符號數(shù)范圍為0~2N-1。例如,8位二進制數(shù)00H~0FFH表示0~255,16位二進制數(shù)0000H~0FFFFH表示0~65535。

2.帶符號數(shù)的補碼表示補碼的表示規(guī)則:以最高位作為符號位(0表示正數(shù),1表示負數(shù))。正數(shù)的補碼是其本身。負數(shù)的補碼是對其正數(shù)“各位求反、末位加1”后形成的。把“各位求反、末位加1”的操作稱作求補。求補就是求相反數(shù)。

N位二進制補碼數(shù)可以表示的帶符號數(shù)范圍為-2N-1~2N-1-1。例如,8位二進制數(shù)可以表示-128~127,16位二進制數(shù)可以表示-32768~32767。2023/11/1680x86匯編語言程序設(shè)計3.補碼的特性

求補

[x]補

[-x]補

[x+y]補=[x]補+

[y]補

[x-y]補=[x]補+

[-y]補

說明:在計算機內(nèi)部,補碼減法是通過對減數(shù)求補后將減法轉(zhuǎn)換為加法進行的。一個帶符號數(shù)在不同位數(shù)下,其二進制補碼表示可能是不同的。例如,8位數(shù)-1的補碼表示是0FFH,16位數(shù)-1的補碼表示是0FFFFH。2023/11/1680x86匯編語言程序設(shè)計4.補碼的物理意義考慮8位二進制數(shù),其表示范圍為0~255,即256=0。若將其想象為一個環(huán),以0為基點,向順時針方向移246個單位,則得246。然而,若按逆時針方向移動,則該位置就是-10。即

-10=0F6H=246

因此,在8位二進制表示下,對于負數(shù)x(-128~-1)來說,存在下列等式:

-x=256-∣x∣

5.符號擴展與零擴展符號擴展是將原符號位填入擴展的每一位,使得在帶符號數(shù)意義下取值不變。零擴展是將0填入擴展的每一位,使得在無符號數(shù)意義下取值不變。2023/11/1680x86匯編語言程序設(shè)計1.2.3字符的ASCII碼表示ASCII碼字符集采用一個字節(jié)表示字符。常用字符的ASCII碼。數(shù)字'0'~'9':30H~39H

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

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

空格:20H

回車CR:0DH

換行LF:0AH

空字符:0

注意回車與換行的差別:

CR用來控制光標回到當前行的最左端;LF用來移動光標到下一行,而所在列不變。2023/11/1680x86匯編語言程序設(shè)計1.2.4BCD碼

壓縮BCD碼

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

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

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

xxxx0110xxxx0100xxxx0010xxxx1001B

有時,要求非壓縮BCD碼的高4位為0,這時,6429的非壓縮BCD碼為06040209H??梢钥闯?,數(shù)字字符'0'~'9'的ASCII碼恰好是0~9的非壓縮BCD碼。2023/11/1680x86匯編語言程序設(shè)計1.2.5注解

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

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

XOR操作可以使某些位取反。2.移位與循環(huán)移位左移:最低位移入0。在不溢出的情況下,左移1位相當于乘以2。邏輯右移:最高位移入0。邏輯右移1位約等于無符號數(shù)除以2。算術(shù)右移:最高位不變。算術(shù)右移1位約等于帶符號數(shù)除以2。循環(huán)左移與循環(huán)右移:從一端移出的位要移入到另一端。2023/11/1680x86匯編語言程序設(shè)計2.180x86計算機的基本結(jié)構(gòu)80x86計算機的組成:

CPU

內(nèi)存

I/O子系統(tǒng)各部分以系統(tǒng)總線相連2023/11/1680x86匯編語言程序設(shè)計2.1.1CPU

計算機執(zhí)行程序時,首先要將其裝入內(nèi)存,然后由CPU執(zhí)行程序指令。

CPU的作用:執(zhí)行算術(shù)與邏輯運算。控制指令的執(zhí)行。通常,將Intel公司生產(chǎn)的8086/8088、80286、80386、80486、Pentium、PentiumPro、PentiumII、PentiumIII、Pentium4及其兼容的CPU,統(tǒng)稱為80x86CPU或x86CPU,將基于這些CPU的計算機,稱為80x86計算機或x86計算機。2023/11/1680x86匯編語言程序設(shè)計2.1.2系統(tǒng)總線

總線是部件之間進行數(shù)據(jù)(電信號)交換的通道。

80x86計算機的系統(tǒng)總線分為3類:數(shù)據(jù)總線地址總線控制總線1.數(shù)據(jù)總線數(shù)據(jù)總線是用來傳遞數(shù)據(jù)的,定義了CPU在每個內(nèi)存周期所能存取數(shù)據(jù)的位數(shù)。

80x86系列CPU的數(shù)據(jù)總線為8位、16位、32位或64位。這就是“為什么通常的數(shù)據(jù)存取是以8位、16位、32位或64位進行的”。數(shù)據(jù)總線越寬,處理能力越強。具有N位數(shù)據(jù)總線并不意味著CPU只能處理N位數(shù)據(jù)。

2023/11/1680x86匯編語言程序設(shè)計2.地址總線地址總線用來指出數(shù)據(jù)的地址(內(nèi)存或I/O)。地址總線的位數(shù)決定了最大可編址的內(nèi)存與I/O空間。對于N位地址總線,CPU可以提供2N個不同地址:0~2N-1。地址總線由內(nèi)存與I/O子系統(tǒng)共享使用(I/O只用低16位)。

3.控制總線控制總線用來控制CPU與內(nèi)存和I/O設(shè)備之間的數(shù)據(jù)傳送方式(如傳送方向)。

2023/11/1680x86匯編語言程序設(shè)計2.1.3內(nèi)存

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

80x86的內(nèi)存以字節(jié)編址:每個內(nèi)存單元有唯一的地址,可存放1個字節(jié)。要正確理解內(nèi)存單元的2個要素:地址(編號)與值(內(nèi)容)。

1個字占據(jù)2個相鄰的內(nèi)存單元;低字節(jié)在低地址單元,高字節(jié)在高地址單元;字的地址由其低地址來表示。雙字也類似。同一地址可以看作是字節(jié)、字或雙字單元的地址,取決于具體的使用方式。2023/11/1680x86匯編語言程序設(shè)計2.1.4I/O子系統(tǒng)

每個I/O設(shè)備必須通過專門的I/O接口電路與主機(CPU和內(nèi)存)相連。

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

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

I/O端口類似于內(nèi)存單元,只是對應(yīng)于I/O設(shè)備。大多數(shù)設(shè)備使用多個I/O端口(數(shù)據(jù)端口、狀態(tài)端口等)。

CPU是通過端口與I/O設(shè)備通信的。2023/11/1680x86匯編語言程序設(shè)計2.280x86CPU的寄存器組1.通用寄存器

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

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

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

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

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

FS、GS以及所有32位寄存器是從80386CPU開始引入的。2023/11/1680x86匯編語言程序設(shè)計2.380x86CPU的工作模式2.3.180x86CPU的3種工作模式1.實模式與8086兼容的工作模式,只有低20位地址線起作用,僅能尋址第一個1MB的內(nèi)存空間。MSDOS運行在實模式下。2.保護模式

32位80x86CPU的主要工作模式,提供對程序和數(shù)據(jù)進行安全檢查的保護機制。Windows9x/NT/2000運行在保護模式下。3.虛擬8086模式在Windows9x下,若打開一個MSDOS窗口,運行一個DOS應(yīng)用程序,那么該程序就運行在虛擬8086模式下。2023/11/1680x86匯編語言程序設(shè)計2.3.2實模式1.內(nèi)存分段

80x86采用分段內(nèi)存管理機制,主要包括下列幾種類型的段:代碼段:用來存放程序的指令序列。數(shù)據(jù)段:用來存放程序的數(shù)據(jù)。堆棧段:作為堆棧使用的內(nèi)存區(qū)域,用來存放過程返回地址、過程參數(shù)等。一個程序可以擁有多個代碼段、多個數(shù)據(jù)段甚至多個堆棧段。

2023/11/1680x86匯編語言程序設(shè)計

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

2023/11/1680x86匯編語言程序設(shè)計

3.實模式的編程要點采用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位寄存器表示偏移地址時,只使用低16位,高16位為0。2023/11/1680x86匯編語言程序設(shè)計2.4標志位2.4.1狀態(tài)標志

狀態(tài)標志通常由CPU根據(jù)指令執(zhí)行結(jié)果自動設(shè)置,以反映指令執(zhí)行結(jié)果的特征。

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

ZF(ZeroFlag):零標志。若運算結(jié)果為0,則ZF=1,否則ZF=0。

SF(SignFlag):符號標志。若運算結(jié)果為負數(shù),則SF=1,否則SF=0。

CF(CarryFlag):進位標志。若加法時結(jié)果最高位向前有進位或減法時最高位向前有借位,則CF=1,否則CF=0。

OF(OverflowFlag):溢出標志。若帶符號數(shù)的運算結(jié)果超出了補碼表示的范圍,則OF=1,否則OF=0。

AF(AuxiliaryCarryFlag):輔助進位標志。若加法時結(jié)果低4位向前有進位或減法時結(jié)果低4位向前有借位,則AF=1,否則AF=0。

PF(ParityFlag):奇偶標志。若結(jié)果最低字節(jié)中1的個數(shù)為偶數(shù),則PF=1,否則PF=0。2023/11/1680x86匯編語言程序設(shè)計2.深入認識CF和OF

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

CF表示無符號溢出,即運算結(jié)果超出了無符號數(shù)的表示范圍。對于n位二進制數(shù)來說,無符號數(shù)表示范圍為0~2n-1,例如,n=8和16時分別為0~255和0~65535。

OF表示帶符號溢出,即運算結(jié)果超出了帶符號數(shù)的表示范圍。對于n位二進制數(shù)來說,帶符號數(shù)表示范圍為-2n-1~2n-1-1,例如,n=8和16時,分別為-128~127和-32768~32767。2023/11/1680x86匯編語言程序設(shè)計2.4.2控制標志

控制標志是由程序根據(jù)需要用指令來設(shè)置的,以控制某些指令的執(zhí)行方式??刂茦酥景ǎ?/p>

DF(DirectionFlag):方向標志

IF(InterruptFlag):中斷標志

TF(TraceFlag):跟蹤標志2023/11/1680x86匯編語言程序設(shè)計本章小結(jié)80x86計算機由CPU、內(nèi)存和I/O子系統(tǒng)三部分組成,各部分之間由系統(tǒng)總線相連。數(shù)據(jù)總線決定了CPU每次存取數(shù)據(jù)的最大寬度(位數(shù));地址總線決定了最大可編址空間;控制總線用來控制CPU與內(nèi)存和I/O設(shè)備之間的數(shù)據(jù)傳送方式。

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

80x86程序可以存取的最小數(shù)據(jù)單位是字節(jié)。例如,若要讀取的位數(shù)不足8位,則只能先讀出一個完整字節(jié),再屏蔽掉其它位。字的存儲采取“低字節(jié)在低地址,高字節(jié)在高地址,字的地址由低地址表示”的小端方式,雙字也類似。要正確理解內(nèi)存單元的地址和值,地址表示位置,值是相應(yīng)位置處的內(nèi)容。同一地址既可以看作字節(jié)單元地址,也可以看作字甚至雙字單元地址,取決于具體的使用方式。2023/11/1680x86匯編語言程序設(shè)計80x86CPU具有8位、16位和32位寄存器,主要包括:

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

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

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

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

32位/16位指令指針1個:EIP/IP。

32位/16位標志寄存器1個:EFLAGS/FLAGS。其中,32位寄存器是80386CPU開始引入的。2023/11/1680x86匯編語言程序設(shè)計3.1指令格式1.指令的書寫格式 標號: 指令助記符 操作數(shù) ;注釋2.操作數(shù)的3種形式:立即操作數(shù):指令的操作數(shù)是立即數(shù),并直接出現(xiàn)在指令中。寄存器操作數(shù):操作數(shù)是寄存器的值,指令中使用寄存器名。內(nèi)存操作數(shù):操作數(shù)是某個內(nèi)存單元的值,指令中給出有效地址EA,段地址在某個段寄存器中。2023/11/1680x86匯編語言程序設(shè)計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]

說明:

Variable是變量名或變量名±整數(shù)表達式。

reg為BX、BP、SI、DI。

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

base為BX或BP,index為SI或DI。有效地址為各項之和。如disp[base][index]形式,EA=base+index+disp。若使用了BP,則隱含段地址在SS,否則在DS。當段地址不在隱含的段寄存器時,可使用段超越前綴,形式為: 段寄存器名:2023/11/1680x86匯編語言程序設(shè)計3.2.232位CPU擴展的操作數(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]說明:

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

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

介紹設(shè)計完整程序所需的常用指令,對于其余指令,一部分在后續(xù)章節(jié)中講授,一部分自學。介紹常用指令的格式、功能以及對CF、OF、SF、ZF的影響。2023/11/1680x86匯編語言程序設(shè)計為了描述方便,采用下列符號約定:dest —目的操作數(shù)src —源操作數(shù)oprdn —第n個操作數(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匯編語言程序設(shè)計3.3.1數(shù)據(jù)傳送指令1.MOV(Move):傳送一般形式:

MOV dest,src ;dest=src。將源操作數(shù)src復制到目的操作數(shù)dest,src不變。語法格式:

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

對標志位的影響:無。說明:

dest與src不能作如下搭配:

MOV mem,mem ;錯誤

MOV seg,seg ;錯誤

MOV seg,imm ;錯誤

dest不能是CS。

dest與src必須類型匹配,即同時是字節(jié)、字或雙字類型。2023/11/1680x86匯編語言程序設(shè)計3.3.1數(shù)據(jù)傳送指令2.XCHG(Exchange):交換一般形式:

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

XCHG reg/mem,reg/mem

對標志位的影響:無。說明:oprd1與oprd2不能作如下搭配:

XCHG mem,mem ;錯誤oprd1與oprd2類型必須匹配。、【例】

xchg ebx,edx xchg [ebp][eax*4],edx2023/11/1680x86匯編語言程序設(shè)計3.3.1數(shù)據(jù)傳送指令3.LEA(LoadEffectiveAddress):裝入有效地址

語法格式:

LEA reg16,mem ;reg16=mem的有效地址 對標志位的影響:無。【例】設(shè)BX=5678H,EAX=1,EDX=2。

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

語法格式:

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

LES reg16,mem32 ;reg16=mem32的低字,ES=mem32的高字 對標志位的影響:無。2023/11/1680x86匯編語言程序設(shè)計3.3.1數(shù)據(jù)傳送指令5.堆棧操作指令

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

語法格式:

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

對標志位的影響:無。2023/11/1680x86匯編語言程序設(shè)計3.3.1數(shù)據(jù)傳送指令(2)PUSHF與POPF:標志寄存器進棧和出棧語法格式:

PUSHF ;FLAGS進棧

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

【例】設(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匯編語言程序設(shè)計3.3.1數(shù)據(jù)傳送指令6.標志寄存器傳送指令(1)LAHF(LoadAHfromFlags) 語法格式:

LAHF ;AH=FLAGS的低8位 對標志位的影響:無。

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

SAHF ;FLAGS的低8位=AH

對標志位的影響:由新裝入值確定。

2023/11/1680x86匯編語言程序設(shè)計3.3.1數(shù)據(jù)傳送指令符號擴展與零擴展指令 對標志位的影響:無。(1)CBW、CWD、CWDE與CDQ

語法格式:

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

CDQ ;EAX符號擴展為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匯編語言程序設(shè)計3.3.1數(shù)據(jù)傳送指令(2)MOVSX

一般形式:

MOVSX dest,src ;src符號擴展為dest;386新增語法格式:

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

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

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

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

2023/11/1680x86匯編語言程序設(shè)計3.3.1數(shù)據(jù)傳送指令(3)MOVZX

一般形式:

MOVZX dest,src ;src零擴展為dest;386新增語法格式:

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

2023/11/1680x86匯編語言程序設(shè)計3.3.1數(shù)據(jù)傳送指令8.XLAT(Translate):換碼語法格式:

XLAT ;AL=DS:[BX+AL]

功能描述:將DS:BX所指內(nèi)存區(qū)中、由AL指定位移處的一個字節(jié)賦給AL。對標志位的影響:無。

2023/11/1680x86匯編語言程序設(shè)計3.3.2算術(shù)指令1.加法一般形式:

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

語法格式:

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

對標志位的影響:

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

INC:不影響CF,其它同ADD。說明:ADD與ADC的2個操作數(shù)必須類型匹配,且不能同時是內(nèi)存操作數(shù)。2023/11/1680x86匯編語言程序設(shè)計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

語法格式:

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

對標志位的影響:

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

DEC:不影響CF,其它同SUB。說明:2個操作數(shù)必須類型匹配,且不能同時是內(nèi)存操作數(shù)。2023/11/1680x86匯編語言程序設(shè)計3.3.2算術(shù)指令3.乘法(1)MUL(UnsignedMultiplication):無符號乘法一般形式:

MUL src 語法格式:

MUL reg8/mem8 ;AX=AL×src MUL reg16/mem16 ;DX:AX=AX×src MUL reg32/mem32 :EDX:EAX=EAX×src對標志位的影響:若8位×8位、16位×16位或32位×32位的結(jié)果分別能由8、16或32位容納(即結(jié)果的高一半為0),則CF=OF=0,否則,CF=OF=1;其余標志無定義。說明:由于2個n位數(shù)的乘積可能需要2n位,因此,若操作數(shù)是8位,則結(jié)果為16位;同樣,16位操作數(shù)相乘結(jié)果為32位,32位數(shù)相乘結(jié)果為64位。2023/11/1680x86匯編語言程序設(shè)計3.3.2算術(shù)指令(2)IMUL(IntegerMultiplication):帶符號乘法一般形式:

IMUL src 語法格式:

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

IMUL reg16/mem16 ;DX:AX=AX×src IMUL reg32/mem32 :EDX:EAX=EAX×src對標志位的影響:若結(jié)果的高一半為低一半的符號擴展,則CF=OF=0,否則,CF=OF=1;其余標志無定義。說明:由于2個n位數(shù)的乘積可能需要2n位,因此,若操作數(shù)是8位,則結(jié)果為16位;同樣,16位操作數(shù)相乘結(jié)果為32位,32位數(shù)相乘結(jié)果為64位?!纠繉τ谕粋€二進制數(shù),采用MUL與IMUL執(zhí)行的結(jié)果可能不同。設(shè)AL=0FFH,BL=1,分別執(zhí)行下列指令,會得出不同結(jié)果。

mul bl ;ax=0ffh(255)

imul bl ;ax=0ffffh(-1)2023/11/1680x86匯編語言程序設(shè)計3.3.2算術(shù)指令4.除法一般形式:

DIV src ;無符號數(shù)除法

IDIV src ;帶符號數(shù)除法語法格式:

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。對標志位的影響:無定義。2023/11/1680x86匯編語言程序設(shè)計3.3.2算術(shù)指令5.十進制調(diào)整指令

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

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

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

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

DAS:通常先執(zhí)行SUB/SBB指令,將2個壓縮BCD碼相減,結(jié)果存放在AL中。然后使用該指令將AL調(diào)整為壓縮BCD碼格式。對標志位的影響:OF不確定;CF反映壓縮BCD碼相加/相減的進位/借位狀態(tài);按一般規(guī)則影響SF和ZF。說明:若使用DAA/DAS指令,則參加加法/減法運算的操作數(shù)應(yīng)該是壓縮BCD碼。如果將任意2個二進制數(shù)相加/減,然后調(diào)整,將得不到正確結(jié)果。2023/11/1680x86匯編語言程序設(shè)計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匯編語言程序設(shè)計3.3.2算術(shù)指令(2)非壓縮BCD碼調(diào)整指令語法格式:

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個非壓縮BCD碼(高4位無關(guān))相加。然后使用AAA將AL調(diào)整為非壓縮BCD碼格式,且高4位=0,同時將調(diào)整產(chǎn)生的進位加到AH中。

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

AAM與AAD:略。對標志位的影響:

AAA與AAS:CF反映非壓縮BCD碼加/減的進位/借位;OF、SF和ZF不確定。2023/11/1680x86匯編語言程序設(shè)計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匯編語言程序設(shè)計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操作但不存儲結(jié)果到dest語法格式:

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 對標志位的影響:

NOT:無。其它指令:CF=OF=0,按一般規(guī)則影響SF和ZF。2023/11/1680x86匯編語言程序設(shè)計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ù)右移語法格式:

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

SAL、SHR與SAR格式同SHL2023/11/1680x86匯編語言程序設(shè)計3.3.3位操作指令功能描述:

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

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

SHR:邏輯右移。最低位移入CF,最高位移入0。對標志位的影響:若移位后符號位發(fā)生了變化,則OF=1,否則OF=0;CF為最后移入位;按一般規(guī)則影響ZF與SF。然而,若移位次數(shù)為0,則不影響標志位;若移位次數(shù)>1,則OF無定義。【例】設(shè)AX的值為一個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匯編語言程序設(shè)計3.3.3位操作指令2.循環(huán)移位循環(huán)移位指令包括:

ROL(RotateLeft):循環(huán)左移

ROR(RotateRight):循環(huán)右移

RCL(RotatethroughCarryLeft):帶進位循環(huán)左移

RCR(RotatethroughCarryRight):帶進位循環(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)右移語法格式:

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

ROR、RCL、RCR格式同ROL2023/11/1680x86匯編語言程序設(shè)計3.3.3位操作指令功能描述:

ROL:循環(huán)左移。最高位移出到CF,并同時移入最低位。

RCL:帶進位循環(huán)左移。最高位移出到CF,原CF移入最低位。

ROR:循環(huán)右移。最低位移出到CF,并同時移入最高位。

RCR:帶進位循環(huán)右移。最低位移出到CF,原CF移入最高位。對標志位的影響:若移位后符號位發(fā)生了變化,則OF=1,否則OF=0;CF為最后移入位;不影響ZF與SF。然而,若移位次數(shù)為0,則不影響標志位;若移位次數(shù)>1,則OF無定義?!纠繉X:AX中的32位數(shù)左移1位。

shl ax,1 rcl dx,12023/11/1680x86匯編語言程序設(shè)計3.3.3位操作指令3.位測試指令

位測試指令包括;

BT(BitTest):位測試

BTS(BitTestandSet):位測試并置位

BTR(BitTestandReset):位測試并復位

BTC(BitTestandComplement):位測試并取反)這些指令均為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匯編語言程序設(shè)計3.3.3位操作指令語法格式:

BT reg16/mem16,reg16/imm8 BT reg32/mem32,reg32/imm8 BTR、BTS、BTC格式同BT對標志位的影響:影響CF;其余標志無定義?!纠课粶y試。

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匯編語言程序設(shè)計3.3.4控制轉(zhuǎn)移指令1.JMP(Jump):無條件轉(zhuǎn)移

一般形式:

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

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)移

;目標地址:標號label處

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

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

;目標地址:段地址=mem32高字,偏移地址=mem32低字對標志位的影響:無。2023/11/1680x86匯編語言程序設(shè)計3.3.4控制轉(zhuǎn)移指令2.條件轉(zhuǎn)移指令

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

Jcc label ;若條件成立,則IP=label的偏移地址。其中,label是標號功能描述:若條件成立,則轉(zhuǎn)移到目標地址label;否則,CPU忽略該條件轉(zhuǎn)移,繼續(xù)執(zhí)行下一條指令。對標志位的影響:無。Jcc指令包括下列3類:(1)測試單個標志位的Jcc指令。(2)用于帶符號數(shù)比較的Jcc指令。常用在CMP指令之后,以判斷帶符號數(shù)的大小。(3)用于無符號數(shù)比較的Jcc指令。常用在CMP指令之后,以判斷無符號數(shù)的大小。2023/11/1680x86匯編語言程序設(shè)計3.3.4控制轉(zhuǎn)移指令3.JCXZ/JECXZ(JumpifCX/ECXisZero)

語法格式:

JCXZ label ;若CX=0,則轉(zhuǎn)移到label JECXZ label ;若ECX=0,則轉(zhuǎn)移到label;386新增對標志位的影響:無說明:

label相對位移量必須在-128~127之間,所有80x86CPU都一樣。2023/11/1680x86匯編語言程序設(shè)計3.3.4控制轉(zhuǎn)移指令4.循環(huán)指令循環(huán)指令包括:

LOOPLOOPE/LOOPZ(LoopwhileEqual/Zero)

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

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對標志位的影響:無。2023/11/1680x86匯編語言程序設(shè)計3.3.4控制轉(zhuǎn)移指令5.中斷指令I(lǐng)NT

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

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

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

mov ah,4ch int 21h2023/11/1680x86匯編語言程序設(shè)計3.3.5標志處理指令

標志處理指令包括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,開中斷)。語法格式:

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

對標志位的影響:只影響指定標志。注意,在程序中應(yīng)慎重使用CLI指令,錯誤的使用會導致系統(tǒng)無法正常工作。2023/11/1680x86匯編語言程序設(shè)計3.3.6處理器控制指令1.NOP(NoOperation):無操作語法格式:

NOP功能描述:NOP指令不做任何事情,只占用1個字節(jié),耗費1個指令執(zhí)行周期。說明:程序員經(jīng)常使用NOP作為占位符(PlaceHolder),以預(yù)留內(nèi)存空間。當然,可以使用其它指令實現(xiàn)類似功能,如XCHGAX,AX指令。事實上,NOP與XCHGAX,AX的機器碼完全一樣,都是90H。對標志位的影響:無。

2023/11/1680x86匯編語言程序設(shè)計3.3.6處理器控制指令2.HLT(Halt):暫停語法格式:

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

HLT不能用來終止程序。通常,應(yīng)用程序不使用該指令。對標志位的影響:無。2023/11/1680x86匯編語言程序設(shè)計3.4容易犯的錯誤1.操作數(shù)類型不匹配例如,將BL的值送AX。錯誤方法:

mov ax,bl ;類型不匹配正確方法:(1)作為無符號數(shù)。

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

mov al,bl cbw

2023/11/1680x86匯編語言程序設(shè)計3.4容易犯的錯誤2.憑空構(gòu)造指令例如:(1)實現(xiàn)AX=AL*5。錯誤方法:

mul 5 ;MUL的操作數(shù)不能是立即數(shù)(2)將內(nèi)存單元(段地址在DS,偏移地址在AX)的一個字節(jié)送BL。錯誤方法:

mov bl,[ax] ;內(nèi)存操作數(shù)不能用[AX]正確方法:

mov si,ax mov bl,[si]2023/11/1680x86匯編語言程序設(shè)計3.4容易犯的錯誤3.對標志位的錯誤使用例如:判斷AX的值,若AX=0FFFFH,則轉(zhuǎn)移到標號L。錯誤方法:

not ax ;NOT不影響標志位

jz l正確方法:

xor ax,0ffffh jz l或

cmp ax,0ffffh je l2023/11/1680x86匯編語言程序設(shè)計3.5實例舉例說明指令的使用方法。如例3.41、3.42、3.43、3.46等。2023/11/1680x86匯編語言程序設(shè)計4.1地址計數(shù)器

匯編器在將源程序轉(zhuǎn)換為目標程序的過程中,每匯編一個段,都需要跟蹤其中代碼或數(shù)據(jù)的偏移地址,這就是地址計數(shù)器。地址計數(shù)器的值表示當前偏移地址。在缺省情況下,段的偏移地址從0開始。例如,下列指令序列:0: mov bl,al ;機器碼為2字節(jié)2: and bl,0fh ;機器碼為3字節(jié)5: mov bh,al ;機器碼為2字節(jié)7: shr bh,4 ;機器碼為3字節(jié)A:

若該指令序列出現(xiàn)在段的開始,那么,在匯編相應(yīng)指令時,地址計數(shù)器的值如左側(cè)所示。例如,第1條MOV指令始于偏移地址0,由于該MOV指令是2字節(jié),故下一條指令始于偏移地址2,等等。

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

$是一個特殊的地址表達式,表示當前地址,即地址計數(shù)器的當前值。2023/11/1680x86匯編語言程序設(shè)計4.3基本偽指令1.處理器選擇偽指令在缺省方式下,MASM只承認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匯編語言程序設(shè)計4.3基本偽指令2.段定義偽指令

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

段名 ENDS

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

2023/11/1680x86匯編語言程序設(shè)計4.3基本偽指令3.符號定義偽指令基本形式: 符號名 EQU 表達式 符號名 = 常數(shù)表達式功能:給表達式指定一個等價的符號名。說明:(1)=后的表達式只能是常數(shù),對于字符或字符串,匯編時按整數(shù)處理。例如:

COUNT = 20 MOV CX,COUNT ;等價于MOVCX,20(2)EQU后的表達式可以是數(shù)值、字符串、寄存器名、指令助記符等。(3)EQU不能重復定義,而=可重復定義,其作用域從定義點到重新定義之前。2023/11/1680x86匯編語言程序設(shè)計4.3基本偽指令4.變量定義偽指令變量定義偽指令用來為數(shù)據(jù)分配內(nèi)存空間,并設(shè)置相應(yīng)內(nèi)存單元的初始值。形式: 變量名 變量定義符操作數(shù),,...,操作數(shù)其中,變量名是一個符號地址,表示其后操作數(shù)的首地址,變量名為可選項,給出變量名只是為了按名存取其對應(yīng)的內(nèi)存單元。變量定義符主要包括下列幾種:

DB(DefineByte):定義字節(jié),后面的每個操作數(shù)占1個字節(jié)。

DW(DefineWord):定義字,后面的每個操作數(shù)占1個

溫馨提示

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

評論

0/150

提交評論