版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
2023-11-1680x86組合語言程式設計第1章基礎知識講授要點
認識組合語言數據表示基本位操作2023-11-1680x86組合語言程式設計1.1認識組合語言1.程式設計語言機器語言組合語言:機器語言的符號化,與機器密切相關。高級語言2.組合語言的意義速度:對於同一個問題,用組合語言設計出的程式能達到“運行速度最快”。空間:對於同一個問題,用組合語言設計出的程式能達到“佔用空間最少”。功能:組合語言可以實現高級語言難以勝任甚至不能完成的任務。知識:學習組合語言,有助於對電腦系統的理解、寫出更好的程式。2023-11-1680x86組合語言程式設計1.2數據表示
數制的基本知識
10進制
2進制
16進制說明:前導0可以忽略,不影響取值。結尾用D(10進制數)、B(2進制數)、H(16進制數)。缺省為十進位數。2023-11-1680x86組合語言程式設計1.2.1數據組織
位(Bit):1個二進位位。電腦是在特定位數下工作的,如8位、16位、32位等。
位元組(Byte):8位。位編號從右到左為0~7,第0位為最低位,第7位為最高位。
字(Word):16位。位編號從右到左為0~15,第0位為最低位,第15位為最高位。位0~7為低位元組,位8~15為高位元組。
雙字(DoubleWord):32位。位編號從右到左為0~31,第0位為最低位,第31位為最高位。位0~15為低字,位16~31為高字。2023-11-1680x86組合語言程式設計1.2.2無符號數與帶符號數1.無符號數
N位二進位數可以表示的無符號數範圍為0~2N-1。例如,8位二進位數00H~0FFH表示0~255,16位二進位數0000H~0FFFFH表示0~65535。
2.帶符號數的補數表示補數的表示規則:以最高位作為符號位(0表示正數,1表示負數)。正數的補數是其本身。負數的補數是對其正數“各位求反、末位加1”後形成的。把“各位求反、末位加1”的操作稱作求補。求補就是求相反數。
N位二進位補數數可以表示的帶符號數範圍為-2N-1~2N-1-1。例如,8位二進位數可以表示-128~127,16位二進位數可以表示-32768~32767。2023-11-1680x86組合語言程式設計3.補數的特性
求補
[x]補
[-x]補
[x+y]補=[x]補+
[y]補
[x-y]補=[x]補+
[-y]補
說明:在電腦內部,補數減法是通過對減數求補後將減法轉換為加法進行的。一個帶符號數在不同位數下,其二進制補數表示可能是不同的。例如,8位數-1的補數表示是0FFH,16位數-1的補數表示是0FFFFH。2023-11-1680x86組合語言程式設計4.補數的物理意義考慮8位二進位數,其表示範圍為0~255,即256=0。若將其想像為一個環,以0為基點,向順時針方向移246個單位,則得246。然而,若按逆時針方向移動,則該位置就是-10。即
-10=0F6H=246
因此,在8位二進位表示下,對於負數x(-128~-1)來說,存在下列等式:
-x=256-∣x∣
5.符號擴展與零擴展符號擴展是將原符號位填入擴展的每一位,使得在帶符號數意義下取值不變。零擴展是將0填入擴展的每一位,使得在無符號數意義下取值不變。2023-11-1680x86組合語言程式設計1.2.3字元的ASCII碼表示ASCII碼字元集採用一個位元組表示字元。常用字符的ASCII碼。數字'0'~'9':30H~39H
字母'A'~'Z':41H~5AH
字母'a'~'z':61H~7AH
空格:20H
回車CR:0DH
換行LF:0AH
空字元:0
注意回車與換行的差別:
CR用來控制游標回到當前行的最左端;LF用來移動游標到下一行,而所在列不變。2023-11-1680x86組合語言程式設計1.2.4BCD碼
壓縮BCD碼
以4個二進位位表示1個十進位位,用0000B~1001B表示0~9。例如,十進位數6429的壓縮BCD碼表示為
0110010000101001B(即6429H)非壓縮BCD碼
以8個二進位位表示1個十進位位,低4位與壓縮BCD碼相同,高4位無意義。例如,十進位數6429的非壓縮BCD碼表示為
xxxx0110xxxx0100xxxx0010xxxx1001B
有時,要求非壓縮BCD碼的高4位為0,這時,6429的非壓縮BCD碼為06040209H。可以看出,數字字元'0'~'9'的ASCII碼恰好是0~9的非壓縮BCD碼。2023-11-1680x86組合語言程式設計1.2.5注解
同一個二進位數可以表示多種含義,其具體含義由使用者解釋。例如,二進位數00110000B,即30H,可以當作十進位數48的二進位表示,字元'0'的ASCII碼,30的壓縮BCD碼,0的非壓縮BCD碼,等等。甚至將其當作現實世界的任一物理對象也未嘗不可。帶符號數的二進位補數表示與位數密切相關。例如0FFH,若作為8位帶符號數,則表示-1;若作為16位帶符號數,則表示255。再如0FFFFH,若作為16位帶符號數,則表示-1;若作為32位帶符號數,則表示65535。2023-11-1680x86組合語言程式設計1.3基本位操作1.邏輯操作:AND、OR、XOR、NOTAND操作可以使某些位清0。
OR操作可以使某些位置1。
XOR操作可以使某些位取反。2.移位與迴圈移位左移:最低位移入0。在不溢出的情況下,左移1位相當於乘以2。邏輯右移:最高位移入0。邏輯右移1位約等於無符號數除以2。算術右移:最高位不變。算術右移1位約等於帶符號數除以2。迴圈左移與迴圈右移:從一端移出的位要移入到另一端。2023-11-1680x86組合語言程式設計2.180x86電腦的基本結構80x86電腦的組成:
CPU
記憶體
I/O子系統各部分以系統匯流排相連2023-11-1680x86組合語言程式設計2.1.1CPU
電腦執行程式時,首先要將其裝入記憶體,然後由CPU執行程式指令。
CPU的作用:執行算術與邏輯運算。控制指令的執行。通常,將Intel公司生產的8086/8088、80286、80386、80486、Pentium、PentiumPro、PentiumII、PentiumIII、Pentium4及其相容的CPU,統稱為80x86CPU或x86CPU,將基於這些CPU的電腦,稱為80x86電腦或x86電腦。2023-11-1680x86組合語言程式設計2.1.2系統匯流排
匯流排是部件之間進行數據(電信號)交換的通道。
80x86電腦的系統匯流排分為3類:數據匯流排地址匯流排控制匯流排1.數據匯流排數據匯流排是用來傳遞數據的,定義了CPU在每個記憶體週期所能存取數據的位數。
80x86系列CPU的數據匯流排為8位、16位、32位或64位。這就是“為什麼通常的數據存取是以8位、16位、32位或64位進行的”。數據匯流排越寬,處理能力越強。具有N位數據匯流排並不意味著CPU只能處理N位數據。
2023-11-1680x86組合語言程式設計2.地址匯流排地址匯流排用來指出數據的地址(記憶體或I/O)。地址匯流排的位數決定了最大可編址的記憶體與I/O空間。對於N位地址匯流排,CPU可以提供2N個不同地址:0~2N-1。地址匯流排由記憶體與I/O子系統共用使用(I/O只用低16位)。
3.控制匯流排控制匯流排用來控制CPU與記憶體和I/O設備之間的數據傳送方式(如傳送方向)。
2023-11-1680x86組合語言程式設計2.1.3記憶體
記憶體是存放指令和數據的部件,由若干記憶體單元構成。
80x86的記憶體以位元組編址:每個記憶體單元有唯一的地址,可存放1個位元組。要正確理解記憶體單元的2個要素:地址(編號)與值(內容)。
1個字佔據2個相鄰的記憶體單元;低位元組在低地址單元,高位元組在高地址單元;字的地址由其低地址來表示。雙字也類似。同一地址可以看作是位元組、字或雙字單元的地址,取決於具體的使用方式。2023-11-1680x86組合語言程式設計2.1.4I/O子系統
每個I/O設備必須通過專門的I/O介面電路與主機(CPU和記憶體)相連。
I/O端口:即I/O地址,是區分I/O設備及其寄存器的編號。
80x86的I/O端口為16位。
I/O端口類似於記憶體單元,只是對應於I/O設備。大多數設備使用多個I/O端口(數據端口、狀態端口等)。
CPU是通過端口與I/O設備通信的。2023-11-1680x86組合語言程式設計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分別對應於AX、BX、CX和DX的低8位與高8位。AX、BX、CX、DX、SI、DI、BP和SP分別對應於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組合語言程式設計2.380x86CPU的工作模式2.3.180x86CPU的3種工作模式1.實模式與8086相容的工作模式,只有低20位地址線起作用,僅能尋址第一個1MB的記憶體空間。MSDOS運行在實模式下。2.保護模式
32位80x86CPU的主要工作模式,提供對程式和數據進行安全檢查的保護機制。Windows9x/NT/2000運行在保護模式下。3.虛擬8086模式在Windows9x下,若打開一個MSDOS窗口,運行一個DOS應用程式,那麼該程式就運行在虛擬8086模式下。2023-11-1680x86組合語言程式設計2.3.2實模式1.記憶體分段
80x86採用分段記憶體管理機制,主要包括下列幾種類型的段:代碼段:用來存放程式的指令序列。數據段:用來存放程式的數據。堆疊段:作為堆疊使用的記憶體區域,用來存放過程返回地址、過程參數等。一個程式可以擁有多個代碼段、多個數據段甚至多個堆疊段。
2023-11-1680x86組合語言程式設計
2.物理地址與邏輯地址物理地址:記憶體單元的實際地址,也就是出現在地址匯流排上的地址。邏輯地址:或稱分段地址,記作 段地址:段內偏移地址 段地址表示段在內存中的起始位置,通常被保存在某個段寄存器中。段內偏移地址表示記憶體單元相對於段起始位置的位移,簡稱偏移地址,也叫有效地址EA。段地址與偏移地址都是16位。系統採用下列方法將邏輯地址自動轉換為20位的物理地址: 物理地址=段地址×16+偏移地址每個記憶體單元具有唯一的物理地址,但可由不同的邏輯地址描述。
2023-11-1680x86組合語言程式設計
3.實模式的編程要點採用16位段,段地址與偏移地址均為16位,即使32位80x86CPU(80386及更高)也只能尋址1MB的記憶體空間。
CPU總是從地址CS:IP處取指令,EIP的高16位為0。
SS:SP指向堆疊段的棧頂地址,ESP的高16位為0。在32位80x86CPU下,程式可以使用32位寄存器和32位運算元,但採用32位寄存器表示偏移地址時,只使用低16位,高16位為0。2023-11-1680x86組合語言程式設計2.4標誌位2.4.1狀態標誌
狀態標誌通常由CPU根據指令執行結果自動設置,以反映指令執行結果的特徵。
80x86CPU將狀態標誌作為條件判斷的依據,以控制程式的執行流程。最常用的狀態標誌是CF、OF、SF和ZF,應熟練掌握。2023-11-1680x86組合語言程式設計1.狀態標誌取值的一般規則
ZF(ZeroFlag):零標誌。若運算結果為0,則ZF=1,否則ZF=0。
SF(SignFlag):符號標誌。若運算結果為負數,則SF=1,否則SF=0。
CF(CarryFlag):進位標誌。若加法時結果最高位向前有進位或減法時最高位向前有借位,則CF=1,否則CF=0。
OF(OverflowFlag):溢出標誌。若帶符號數的運算結果超出了補數表示的範圍,則OF=1,否則OF=0。
AF(AuxiliaryCarryFlag):輔助進位標誌。若加法時結果低4位向前有進位或減法時結果低4位向前有借位,則AF=1,否則AF=0。
PF(ParityFlag):奇偶標誌。若結果最低位元組中1的個數為偶數,則PF=1,否則PF=0。2023-11-1680x86組合語言程式設計2.深入認識CF和OF
CF和OF本質上均表示溢出。
CF表示無符號溢出,即運算結果超出了無符號數的表示範圍。對於n位二進位數來說,無符號數表示範圍為0~2n-1,例如,n=8和16時分別為0~255和0~65535。
OF表示帶符號溢出,即運算結果超出了帶符號數的表示範圍。對於n位二進位數來說,帶符號數表示範圍為-2n-1~2n-1-1,例如,n=8和16時,分別為-128~127和-32768~32767。2023-11-1680x86組合語言程式設計2.4.2控制標誌
控制標誌是由程式根據需要用指令來設置的,以控制某些指令的執行方式。控制標誌包括:
DF(DirectionFlag):方向標誌
IF(InterruptFlag):中斷標誌
TF(TraceFlag):跟蹤標誌2023-11-1680x86組合語言程式設計本章小結80x86電腦由CPU、記憶體和I/O子系統三部分組成,各部分之間由系統匯流排相連。數據匯流排決定了CPU每次存取數據的最大寬度(位數);地址匯流排決定了最大可編址空間;控制匯流排用來控制CPU與記憶體和I/O設備之間的數據傳送方式。
80x86系統的I/O地址為16位,可尋址65536個不同的I/O端口。
80x86程式可以存取的最小數據單位是位元組。例如,若要讀取的位數不足8位,則只能先讀出一個完整位元組,再遮罩掉其他位。字的存儲採取“低位元組在低地址,高位元組在高地址,字的地址由低地址表示”的小端方式,雙字也類似。要正確理解記憶體單元的地址和值,地址表示位置,值是相應位置處的內容。同一地址既可以看作位元組單元地址,也可以看作字甚至雙字單元地址,取決於具體的使用方式。2023-11-1680x86組合語言程式設計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組合語言程式設計3.1指令格式1.指令的書寫格式 標號: 指令助記符 運算元 ;注釋2.運算元的3種形式:立即運算元:指令的運算元是立即數,並直接出現在指令中。寄存器運算元:運算元是寄存器的值,指令中使用寄存器名。記憶體運算元:運算元是某個記憶體單元的值,指令中給出有效地址EA,段地址在某個段寄存器中。2023-11-1680x86組合語言程式設計3.2運算元的形式3.2.18086指令的運算元形式1.立即數:8位或16位立即數。2.寄存器運算元:
8位/16位通用寄存器和段寄存器(除了FS和GS)。3.記憶體運算元包括下列幾種形式。
Variable 或[Variable] [reg] disp[reg] [base][index] disp[base][index]
說明:
Variable是變數名或變數名±整數運算式。
reg為BX、BP、SI、DI。
disp可以是常量或變數,彙編後為一個常數,若是變數,則取其偏移地址。
base為BX或BP,index為SI或DI。有效地址為各項之和。如disp[base][index]形式,EA=base+index+disp。若使用了BP,則隱含段地址在SS,否則在DS。當段地址不在隱含的段寄存器時,可使用段超越首碼,形式為: 段寄存器名:2023-11-1680x86組合語言程式設計3.2.232位CPU擴展的運算元形式1.立即數:32位立即數。2.寄存器運算元:32位通用寄存器以及FS和GS。3.記憶體運算元包括下列幾種形式。
[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組合語言程式設計3.3指令系統
介紹設計完整程式所需的常用指令,對於其餘指令,一部分在後續章節中講授,一部分自學。介紹常用指令的格式、功能以及對CF、OF、SF、ZF的影響。2023-11-1680x86組合語言程式設計為了描述方便,採用下列符號約定:dest —目的運算元src —源運算元oprdn —第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位記憶體運算元mem16 —16位記憶體運算元mem32 —32位記憶體運算元mem —mem8/mem16/mem32mem64 —64位記憶體運算元imm8 —8位立即數imm16 —16位立即數imm32 —32位立即數imm —imm8/imm16/imm322023-11-1680x86組合語言程式設計3.3.1數據傳送指令1.MOV(Move):傳送一般形式:
MOV dest,src ;dest=src。將源運算元src複製到目的運算元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必須類型匹配,即同時是位元組、字或雙字類型。2023-11-1680x86組合語言程式設計3.3.1數據傳送指令2.XCHG(Exchange):交換一般形式:
XCHG oprd1,oprd2 ;交換oprd1與oprd2的內容語法格式:
XCHG reg/mem,reg/mem
對標誌位的影響:無。說明:oprd1與oprd2不能作如下搭配:
XCHG mem,mem ;錯誤oprd1與oprd2類型必須匹配。、【例】
xchg ebx,edx xchg [ebp][eax*4],edx2023-11-1680x86組合語言程式設計3.3.1數據傳送指令3.LEA(LoadEffectiveAddress):裝入有效地址
語法格式:
LEA reg16,mem ;reg16=mem的有效地址 對標誌位的影響:無。【例】設BX=5678H,EAX=1,EDX=2。
lea si,2[bx] ;執行後,SI=567AH lea si,2[eax][edx] ;執行後,SI=54.LDS、LES
語法格式:
LDS reg16,mem32 ;reg16=mem32的低字,DS=mem32的高字
LES reg16,mem32 ;reg16=mem32的低字,ES=mem32的高字 對標誌位的影響:無。2023-11-1680x86組合語言程式設計3.3.1數據傳送指令5.堆疊操作指令
80x86系統的堆疊具有如下特點:堆疊是在內存的堆疊段中,具有“先進後出”的特點。堆疊只有一個出入口,即當前棧頂。當堆疊為空時,棧頂和棧底指向同一記憶體單元。堆疊有兩個基本操作:PUSH(進棧)和POP(出棧)。PUSH操作使棧頂向低地址方向移動,而POP操作則剛好相反。堆疊操作只能以字或雙字為單位。SS:SP指向棧頂。2023-11-1680x86組合語言程式設計3.3.1數據傳送指令(1)PUSH與POP:進棧與出棧
語法格式:
PUSH reg16/seg/mem16/reg32/mem32 POP reg16/seg/mem16/reg32/mem32 ;運算元不能是CS PUSH imm ;286新增功能描述:
PUSH指令(16位):
SP=SP-2 SS:[SP]=16位運算元
POP指令(16位):
16位運算元=SS:[SP] SP=SP+2 PUSH指令(32位):
SP=SP-4 SS:[SP]=32位運算元
POP指令(32位):
32位運算元=SS:[SP] SP=SP+4
對標誌位的影響:無。2023-11-1680x86組合語言程式設計3.3.1數據傳送指令(2)PUSHF與POPF:標誌寄存器進棧和出棧語法格式:
PUSHF ;FLAGS進棧
POPF ;棧頂字出棧到FLAGS對標誌位的影響:只有POPF指令會以彈出值設置標誌寄存器。
【例】設SP=100H,EBX=12345678H,給出下列指令依次執行後的結果。
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組合語言程式設計3.3.1數據傳送指令6.標誌寄存器傳送指令(1)LAHF(LoadAHfromFlags) 語法格式:
LAHF ;AH=FLAGS的低8位 對標誌位的影響:無。
(2)SAHF(StoreAHintoFlags) 語法格式:
SAHF ;FLAGS的低8位=AH
對標誌位的影響:由新裝入值確定。
2023-11-1680x86組合語言程式設計3.3.1數據傳送指令符號擴展與零擴展指令 對標誌位的影響:無。(1)CBW、CWD、CWDE與CDQ
語法格式:
CBW ;AL符號擴展為AX CWD ;AX符號擴展為32位數DX:AX CWDE ;AX符號擴展為EAX;386新增
CDQ ;EAX符號擴展為64位數EDX:EAX;386新增【例】設AL=0FEH,給出依次執行下列指令後的結果。
cbw ;ax=0fffeh cwd ;dx=0ffffh,ax不變,即dx:ax=-2 cwde ;eax=0fffffffeh(-2)
cdq ;edx=0ffffffffh,eax不變,即edx:eax=-2
2023-11-1680x86組合語言程式設計3.3.1數據傳送指令(2)MOVSX
一般形式:
MOVSX dest,src ;src符號擴展為dest;386新增語法格式:
MOVSX reg16,reg8/mem8 MOVSX reg32,reg8/mem8/reg16/mem16
功能描述:MOVSX是CBW、CWD和CWDE的一般形式,用來將8位數符號擴展為16位或32位數,或者將16位數符號擴展為32位數。
【例】CBW和CWDE的功能可由MOVSX指令實現。
movsx ax,al ;等價於cbw movsx eax,ax ;等價於cwde movsx eax,al ;等價於順序執行cbw與cwde
2023-11-1680x86組合語言程式設計3.3.1數據傳送指令(3)MOVZX
一般形式:
MOVZX dest,src ;src零擴展為dest;386新增語法格式:
MOVZX reg16,reg8/mem8 MOVZX reg32,reg8/mem8/reg16/mem16
2023-11-1680x86組合語言程式設計3.3.1數據傳送指令8.XLAT(Translate):換碼語法格式:
XLAT ;AL=DS:[BX+AL]
功能描述:將DS:BX所指記憶體區中、由AL指定位移處的一個位元組賦給AL。對標誌位的影響:無。
2023-11-1680x86組合語言程式設計3.3.2算術指令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:按一般規則影響CF、OF、SF和ZF。
INC:不影響CF,其他同ADD。說明:ADD與ADC的2個運算元必須類型匹配,且不能同時是記憶體運算元。2023-11-1680x86組合語言程式設計3.3.2算術指令2.減法一般形式:
SUB dest,src ;dest=dest–src SBB dest,src ;dest=dest-src–CF CMP dest,src ;dest–src。與SUB的區別在於,不將減法結果存入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:按一般規則影響CF、OF、SF和ZF。CF表示借位。
DEC:不影響CF,其他同SUB。說明:2個運算元必須類型匹配,且不能同時是記憶體運算元。2023-11-1680x86組合語言程式設計3.3.2算術指令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位的結果分別能由8、16或32位容納(即結果的高一半為0),則CF=OF=0,否則,CF=OF=1;其餘標誌無定義。說明:由於2個n位數的乘積可能需要2n位,因此,若運算元是8位,則結果為16位;同樣,16位運算元相乘結果為32位,32位數相乘結果為64位。2023-11-1680x86組合語言程式設計3.3.2算術指令(2)IMUL(IntegerMultiplication):帶符號乘法一般形式:
IMUL src 語法格式:
IMUL reg8/mem8 ;AX=AL×src。執行帶符號乘法,下同。
IMUL reg16/mem16 ;DX:AX=AX×src IMUL reg32/mem32 :EDX:EAX=EAX×src對標誌位的影響:若結果的高一半為低一半的符號擴展,則CF=OF=0,否則,CF=OF=1;其餘標誌無定義。說明:由於2個n位數的乘積可能需要2n位,因此,若運算元是8位,則結果為16位;同樣,16位運算元相乘結果為32位,32位數相乘結果為64位。【例】對於同一個二進位數,採用MUL與IMUL執行的結果可能不同。設AL=0FFH,BL=1,分別執行下列指令,會得出不同結果。
mul bl ;ax=0ffh(255)
imul bl ;ax=0ffffh(-1)2023-11-1680x86組合語言程式設計3.3.2算術指令4.除法一般形式:
DIV src ;無符號數除法
IDIV src ;帶符號數除法語法格式:
DIV reg/mem IDIV reg/mem 功能描述:
src是8位:AX÷src,結果商在AL、餘數在AH。
src是16位:DX:AX÷src,結果商在AX、餘數在DX。
src是32位:EDX:EAX÷src,結果商在EAX、餘數在EDX。對標誌位的影響:無定義。2023-11-1680x86組合語言程式設計3.3.2算術指令5.十進位調整指令
(1)壓縮BCD碼調整指令語法格式:
DAA ;調整AL中的和為壓縮BCD碼
DAS ;調整AL中的差為壓縮BCD碼功能描述:
DAA:通常先執行ADD/ADC指令,將2個壓縮BCD碼相加,結果存放在AL中。然後使用該指令將AL調整為壓縮BCD碼格式。
DAS:通常先執行SUB/SBB指令,將2個壓縮BCD碼相減,結果存放在AL中。然後使用該指令將AL調整為壓縮BCD碼格式。對標誌位的影響:OF不確定;CF反映壓縮BCD碼相加/相減的進位/借位狀態;按一般規則影響SF和ZF。說明:若使用DAA/DAS指令,則參加加法/減法運算的運算元應該是壓縮BCD碼。如果將任意2個二進位數相加/減,然後調整,將得不到正確結果。2023-11-1680x86組合語言程式設計3.3.2算術指令DAA的調整演算法如下: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的調整演算法如下: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組合語言程式設計3.3.2算術指令(2)非壓縮BCD碼調整指令語法格式:
AAA ;調整AL中的和為非壓縮BCD碼
;調整後,AL高4位=0,AH=AH+產生的CF AAS ;調整AL中的差為非壓縮BCD碼
;調整後,AL高4位=0,AH=AH-產生的CF AAM ;AH=AXdiv10,AL=AXmod10 AAD ;AL=AH×10+AL,AH=0功能描述:
AAA:通常先執行ADD/ADC指令,以AL為目的運算元,將2個非壓縮BCD碼(高4位無關)相加。然後使用AAA將AL調整為非壓縮BCD碼格式,且高4位=0,同時將調整產生的進位加到AH中。
AAS:通常先執行SUB/SBB指令,以AL為目的運算元,將2個非壓縮BCD碼(高4位無關)相減。然後使用AAS將AL調整為非壓縮BCD碼格式,且高4位=0,同時將調整產生的借位從AH中減去。
AAM與AAD:略。對標誌位的影響:
AAA與AAS:CF反映非壓縮BCD碼加/減的進位/借位;OF、SF和ZF不確定。2023-11-1680x86組合語言程式設計3.3.2算術指令AAA的調整演算法如下: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的調整演算法如下: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組合語言程式設計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,執行AND操作但不存儲結果到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,按一般規則影響SF和ZF。2023-11-1680x86組合語言程式設計3.3.3位操作指令1.移位指令
移位指令包括:
SHL(ShiftLeft):邏輯左移
SAL(ShiftArithmeticLeft):算術左移
SHR(ShiftRight):邏輯右移
SAR(ShiftArithmeticRight):算術右移其中,SHL與SAL完全相同,只是同一指令的不同助記符而已。一般形式:
SHL dest,count ;dest左移。其中,count為移位次數(下同)
SAL dest,count ;同SHL SHR dest,count ;dest邏輯右移
SAR dest,count ;dest算術右移語法格式:
SHL reg/mem,1/CL SHL reg/mem,imm8 ;286新增
SAL、SHR與SAR格式同SHL2023-11-1680x86組合語言程式設計3.3.3位操作指令功能描述:
SHL/SAL:左移。最高位移出到CF,最低位移入0。
SAR:算術右移。最低位移入CF,最高位不變。
SHR:邏輯右移。最低位移入CF,最高位移入0。對標誌位的影響:若移位後符號位發生了變化,則OF=1,否則OF=0;CF為最後移入位;按一般規則影響ZF與SF。然而,若移位次數為0,則不影響標誌位;若移位次數>1,則OF無定義。【例】設AX的值為一個2位元組非壓縮BCD碼,將其轉換為1位元組壓縮BCD碼存入AL。
mov cl,4 shl ah,cl ;ah低4位移到高4位
and al,0fh ;al高4位清0 or al,ah 2023-11-1680x86組合語言程式設計3.3.3位操作指令2.迴圈移位迴圈移位指令包括:
ROL(RotateLeft):迴圈左移
ROR(RotateRight):迴圈右移
RCL(RotatethroughCarryLeft):帶進位迴圈左移
RCR(RotatethroughCarryRight):帶進位迴圈右移一般形式:
ROL dest,count ;dest迴圈左移。其中,count為移位次數(下同)
ROR dest,count ;dest迴圈右移
RCL dest,count ;dest帶CF迴圈左移
RCR dest,count ;dest帶CF迴圈右移語法格式:
ROL reg/mem,1/CL ROL reg/mem,imm8 ;286新增
ROR、RCL、RCR格式同ROL2023-11-1680x86組合語言程式設計3.3.3位操作指令功能描述:
ROL:迴圈左移。最高位移出到CF,並同時移入最低位。
RCL:帶進位迴圈左移。最高位移出到CF,原CF移入最低位。
ROR:迴圈右移。最低位移出到CF,並同時移入最高位。
RCR:帶進位迴圈右移。最低位移出到CF,原CF移入最高位。對標誌位的影響:若移位後符號位發生了變化,則OF=1,否則OF=0;CF為最後移入位;不影響ZF與SF。然而,若移位次數為0,則不影響標誌位;若移位次數>1,則OF無定義。【例】將DX:AX中的32位數左移1位。
shl ax,1 rcl dx,12023-11-1680x86組合語言程式設計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組合語言程式設計3.3.3位操作指令語法格式:
BT reg16/mem16,reg16/imm8 BT reg32/mem32,reg32/imm8 BTR、BTS、BTC格式同BT對標誌位的影響:影響CF;其餘標誌無定義。【例】位測試。
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組合語言程式設計3.3.4控制轉移指令1.JMP(Jump):無條件轉移
一般形式:
JMP target ;轉移到target指定的目標地址處根據轉移的距離,JMP指令可分為下列兩類:段內轉移:在同一代碼段內進行,又稱近(Near)轉移,只要修改IP的值即可實現。段間轉移:可在不同代碼段之間進行,又稱遠(Far)轉移,需要同時修改CS和IP的值。根據目標地址的指定方式,JMP指令又可分為直接轉移和間接轉移。所謂直接轉移,是指轉移的目標地址直接出現在指令中,在程式執行前就已確定。所謂間接轉移,指轉移的目標地址是寄存器或記憶體運算元的值,只有執行到該條指令時才能確定。因此,JMP指令共有下列4種轉移方式:段內直接轉移(Intrasegment/DirectJump)段間直接轉移(Intersegment/DirectJump)段內間接轉移(Intrasegment/IndirectJump)段間間接轉移(Intersegment/IndirectJump)在組合語言程式中,通常使用標號(Label)來指定直接轉移的目標地址。2023-11-1680x86組合語言程式設計3.3.4控制轉移指令語法格式:
JMPlabel ;若label與該指令位於同一代碼段:IP=label的偏移地址;
;若label與該指令不在同一代碼段:CS:IP=label的分段地址
JMPreg16/mem16 ;IP=reg16/[mem16] JMPmem32 ;CS=[mem32+2],IP=[mem32]功能描述:
JMP label ;段內/段間直接轉移
;目標地址:標號label處
JMP reg16/mem16;段內間接轉移
;目標地址:同一代碼段,偏移地址=reg16/[mem16] JMP mem32 ;段間間接轉移
;目標地址:段地址=mem32高字,偏移地址=mem32低字對標誌位的影響:無。2023-11-1680x86組合語言程式設計3.3.4控制轉移指令2.條件轉移指令
為簡化描述,用Jcc表示所有條件轉移指令的助記符。一般形式:
Jcc label ;若條件成立,則IP=label的偏移地址。其中,label是標號功能描述:若條件成立,則轉移到目標地址label;否則,CPU忽略該條件轉移,繼續執行下一條指令。對標誌位的影響:無。Jcc指令包括下列3類:(1)測試單個標誌位的Jcc指令。(2)用於帶符號數比較的Jcc指令。常用在CMP指令之後,以判斷帶符號數的大小。(3)用於無符號數比較的Jcc指令。常用在CMP指令之後,以判斷無符號數的大小。2023-11-1680x86組合語言程式設計3.3.4控制轉移指令3.JCXZ/JECXZ(JumpifCX/ECXisZero)
語法格式:
JCXZ label ;若CX=0,則轉移到label JECXZ label ;若ECX=0,則轉移到label;386新增對標誌位的影響:無說明:
label相對位移量必須在-128~127之間,所有80x86CPU都一樣。2023-11-1680x86組合語言程式設計3.3.4控制轉移指令4.迴圈指令迴圈指令包括:
LOOPLOOPE/LOOPZ(LoopwhileEqual/Zero)
LOOPNE/LOOPNZ(LoopwhileNotEqual/NotZero)LOOPZ與LOOPE、LOOPNZ與LOOPNE完全等價,只是同一指令的不同助記符。語法格式:
LOOP label ;CX=CX–1,若CX<>0,則轉移到label LOOPZ/LOOPE label ;CX=CX–1,若CX<>0且ZF=1,則轉移到label LOOPNZ/LOOPNE label ;CX=CX–1,若CX<>0且ZF=0,則轉移到label對標誌位的影響:無。2023-11-1680x86組合語言程式設計3.3.4控制轉移指令5.中斷指令INT
本章只簡單引入軟體中斷調用指令INT。詳細介紹參見第8章。語法格式:
INT n ;調用中斷n的中斷服務程式。n為中斷號,取值0~255。對標誌位的影響:不影響CF、OF、SF、ZF。
MSDOS使用中斷號21H作為系統調用,為程式員提供了上百種系統服務功能,對這些功能的調用步驟如下:(1)由AH給出功能號。(2)根據相應功能的要求,設置入口參數。(3)INT21H。(4)分析和使用出口參數。其中,最常用的是功能號4CH,用來實現程式退出、並返回DOS。使用方法如下:
mov ah,4ch int 21h2023-11-1680x86組合語言程式設計3.3.5標誌處理指令
標誌處理指令包括CLC(ClearCarryFlag,CF清0)、STC(SetCarryFlag,CF置1)、CMC(ComplementCarryFlag,CF取反)、CLD(ClearDirectionFlag,DF清0)、STD(SetDirectionFlag,DF置1)、CLI(ClearInterruptFlag,關中斷)和STI(SetInterruptFlag,開中斷)。語法格式:
CLC ;CF=0 STC ;CF=1 CMC ;CF=NOTCF CLD ;DF=0 STD ;DF=1 CLI ;IF=0 STI ;IF=1
對標誌位的影響:只影響指定標誌。注意,在程式中應慎重使用CLI指令,錯誤的使用會導致系統無法正常工作。2023-11-1680x86組合語言程式設計3.3.6處理器控制指令1.NOP(NoOperation):無操作語法格式:
NOP功能描述:NOP指令不做任何事情,只佔用1個位元組,耗費1個指令執行週期。說明:程式員經常使用NOP作為占位符(PlaceHolder),以預留記憶體空間。當然,可以使用其他指令實現類似功能,如XCHGAX,AX指令。事實上,NOP與XCHGAX,AX的機器碼完全一樣,都是90H。對標誌位的影響:無。
2023-11-1680x86組合語言程式設計3.3.6處理器控制指令2.HLT(Halt):暫停語法格式:
HLT功能描述:使CPU進入暫停狀態,這時CPU不執行任何操作,直到系統複位或發生外部中斷為止。中斷使CPU繼續執行HLT後的下一條指令。說明:
HLT不能用來終止程式。通常,應用程式不使用該指令。對標誌位的影響:無。2023-11-1680x86組合語言程式設計3.4容易犯的錯誤1.運算元類型不匹配例如,將BL的值送AX。錯誤方法:
mov ax,bl ;類型不匹配正確方法:(1)作為無符號數。
mov al,bl mov ah,0(2)作為帶符號數。
mov al,bl cbw
2023-11-1680x86組合語言程式設計3.4容易犯的錯誤2.憑空構造指令例如:(1)實現AX=AL*5。錯誤方法:
mul 5 ;MUL的運算元不能是立即數(2)將記憶體單元(段地址在DS,偏移地址在AX)的一個位元組送BL。錯誤方法:
mov bl,[ax] ;記憶體運算元不能用[AX]正確方法:
mov si,ax mov bl,[si]2023-11-1680x86組合語言程式設計3.4容易犯的錯誤3.對標誌位的錯誤使用例如:判斷AX的值,若AX=0FFFFH,則轉移到標號L。錯誤方法:
not ax ;NOT不影響標誌位
jz l正確方法:
xor ax,0ffffh jz l或
cmp ax,0ffffh je l2023-11-1680x86組合語言程式設計3.5實例舉例說明指令的使用方法。如例3.41、3.42、3.43、3.46等。2023-11-1680x86組合語言程式設計4.1地址計數器
彙編器在將根源程式轉換為目標程式的過程中,每彙編一個段,都需要跟蹤其中代碼或數據的偏移地址,這就是地址計數器。地址計數器的值表示當前偏移地址。在缺省情況下,段的偏移地址從0開始。例如,下列指令序列:0: mov bl,al ;機器碼為2位元組2: and bl,0fh ;機器碼為3位元組5: mov bh,al ;機器碼為2位元組7: shr bh,4 ;機器碼為3位元組A:
若該指令序列出現在段的開始,那麼,在彙編相應指令時,地址計數器的值如左側所示。例如,第1條MOV指令始於偏移地址0,由於該MOV指令是2位元組,故下一條指令始於偏移地址2,等等。
2023-11-1680x86組合語言程式設計4.2組合語言語句1.語句格式(1)語句的書寫形式: 名字 助記符 運算元 ;注釋(2)MASM對語句格式的要求:大小寫無關。每條語句必須占1行,但可以使用續行符“\”。為了提高可讀性,應該使各個域對齊。2.常數與數值運算式整數。包括二進位、十進位、八進制或十六進製錶示的整數。字元與字串。必須用單引號或雙引號括起來。數值運算式。2023-11-1680x86組合語言程式設計3.變數、標號與地址運算式變數與標號的3種屬性:段地址、偏移地址、類型。變數的類型包括BYTE(位元組)、WORD(字)、DWORD(雙字)等。標號的類型包括NEAR和FAR。地址運算式。 地址運算式的基本形式為: 變數名或標號名±常數其類型由相應的變數或標號確定。兩個地址運算式的差表示兩個地址之間的距離(位元組數),兩個地址必須在同一個段內。注意,不能將兩個地址運算式相加。
$是一個特殊的地址運算式,表示當前地址,即地址計數器的當前值。2023-11-1680x86組合語言程式設計4.3基本偽指令1.處理器選擇偽指令在缺省方式下,MASM只承認8086指令。為了使用更高的CPU指令,必須使用處理器選擇偽指令,主要包括:
.8086 .286 .286P .386 .386P .486 .486P .586 .586P .686 .686P分別表示其後面的代碼使用相應CPU的指令。其中,結尾的'P'表示使用特權指令。若使用32位CPU新增指令以及寄存器或記憶體尋址方式,則至少要用.386偽指令。2023-11-1680x86組合語言程式設計4.3基本偽指令2.段定義偽指令
段定義由SEGMENT與ENDS偽指令實現,基本形式如下: 段名 SEGMENTSTACKUSE16 <語句序列>
段名 ENDS
其中,STACK僅用於堆疊段。USE16指出使用16位段。在實模式下,只能使用16位段,而32位段只能用於保護模式程式。在實模式下,如果要使用32位指令,還必須在段定義時給出USE16。段名作為運算元出現在指令中時,MASM將其視為立即數,表示段地址。
2023-11-1680x86組合語言程式設計4.3基本偽指令3.符號定義偽指令基本形式: 符號名 EQU 運算式 符號名 = 常數運算式功能:給運算式指定一個等價的符號名。說明:(1)=後的運算式只能是常數,對於字元或字串,彙編時按整數處理。例如:
COUNT = 20 MOV CX,COUNT ;等價於MOVCX,20(2)EQU後的運算式可以是數值、字串、寄存器名、指令助記符等。(3)EQU不能重複定義,而=可重複定義,其作用域從定義點到重新定義之前。2023-11-1680x86組合語言程式設計4.3基本偽指令4.變數定義偽指令變數定義偽指令用來為數據分配記憶體空間,並設置相應記憶體單元的初始值。形式: 變數名 變數定義符
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 肋骨骨折患者的护理
- 农业智能革命
- IT采购新时代介绍
- 七夕节汽车销售洞察
- 气管食管瘘支架术后护理
- 2024广播电视台广告代理合同
- 2024专业技术人员聘用合同范本
- 2023年四川水利职业技术学院招聘工作人员考试真题
- 蓝色插画风员工执行力管理培训模板
- 教育文选阅读I学习通超星期末考试答案章节答案2024年
- 《创业投资财富》课件
- 设计水稻育种计划书
- 电梯使用现场类隐患专项排查清单
- 新媒体视听节目制作 第二章 新媒体视听节目的类型与特征
- 版式设计的网格系统
- JCT640-2010 顶进施工法用钢筋混凝土排水管
- 八年级物理第一二章测试题(含答案)
- 两山之路智慧树知到课后章节答案2023年下丽水学院
- 青光眼PPT课件完整版
- 快速消费品制造行业概述
- 类风湿性关节炎综述4572
评论
0/150
提交评论