(一)跳轉指令
一、無條件跳轉指令(不管標志寄存器,執行到這句直接跳轉)
1、段內直接跳轉指令
(1)指令格式:
JMP SHORT short_label; IP<--IP+DB,即代碼直接跳轉到此地址為
JMP near_label; IP<--IP+D16 基准的相應的地址中
(2)其實就是GOTO語句,不同的就是他跳轉只能以跳轉地址與目前地址的偏差量來進行跳轉。
2、段間直接跳轉語句
(1)指令格式:
JMP far_label; IP<-標號的偏移地址,CS<--標號的段地址
若指定的目標標號在另一個段中,就成為了段間跳轉指令
(2)一個demo
CODE SEGMENT
ASSUME CS:CODE
START: 1~3條JMP指令沒有指定標號的類型(FAR,NEAR),匯編程序默認為段內的標號,並根據標號的距離大小自動處理成SHORT或者NEAR類型
JMP START; 被翻譯成段內短跳轉
JMP EXIT; 被翻譯成段內直接跳轉,但因為跳轉的距離較短,所以又自動改為段內短跳轉,所以加了個NOP
JMP EXIT1; 被翻譯成段內直接跳轉
JMP SHORT EXIT; 被翻譯成段內短跳轉
JMP NEAR PTR EXIT; 被翻譯成段內直接跳轉,但因為跳轉的距離較短,所以又自動改為段內短跳轉,所以加了個NOP
JMP FAR PTR EXIT; 被翻譯成段間直接跳轉,單因為是段內的跳轉且距離短,所以又自動改為段內短跳轉,所以加了3個NOP
JMP FAR PTR EXIT2; 被翻譯成段間直接跳轉
EXIT:
MOV AH,4CH
INT 21H
ORG 200H ;其中ORG 200H是一個偽指令,指定段內偏移地址的偽指令,即接下來的指令從偏移地址200H開始存放
EXIT1:
MOV AH,4CH
INT 21H
CODE ENDS
CODE1 SEGMENT
ASSUME CS:CODE1
EXIT2:
MOV AH,4CH
INT 21H
CODE1 ENDS
END START
3、段內間接跳轉指令:
(1)指令格式:
JMP reg16 ;IP<--reg16
JMP mem16 ;IP<--mem16
此指令的操作數必須是一個16位的通用寄存器或者16位的存儲單元,功能是將此16位操作數賦給IP而實現跳轉。
(2)一個demo:
設BX=1234H,DS=1000H,(11234H)= 5678H
若執行JMP BX,則IP=1234H
若執行JMP [BX],則IP=5678H
4、段間間接跳轉指令
(1)指令格式:
JMP mem32;IP<--[mem32],CS<--[mem32+2]
(2)一個demo:
例如,設BX=1234H,DS=1000H,(11234H)=5678H,(11236H)=9ABCH,
若執行JMP [BX],則IP=5678H,CS=9ABCH,即程序跳到段地址為9ABCH,偏移地址為5678H的地址處繼續執行。
二、條件跳轉指令
1、指令的一般格式:
Jccc short_label; 若條件成立,則IP<--IP+D8,否則順序執行
2、指令格式中的“ccc”是1~3個字母,指明判斷的條件,目的地址是段內的短標號,但是范圍只有D8,所以超出了合法范圍,都會報錯
3、所有指令匯總
三、循環控制指令
1、為了方便循環程序的設計,8086設計了一組共用4條用CX作為循環計數的循環控制指令,也正是由於這個原因,我們把CX成為計數寄存器。循環控制指令一般都要先對循環計數CX自動減1,然后在判斷CX是否為0
2、CX不為0循環指令
(1)指令格式:
LOOP short_label; CX<--CX-1,若CX不等於0,則跳轉,否則順序執行
(2)圖示:
3、CX不為0且相等循環指令
(1)指令格式:
LOOPE short_label; CX<--CX-1,若CX不等於0,且ZF=1,則跳轉,否則順序執行
LOOPZ short_label;
所以只要用ZF=1,則就會提前結束循環
(2)圖示:
4、CX不為0且不等循環指令
(1)指令格式:
LOOPNE short_label; CX<--CX-1,若CX不等於0且ZF=0,則跳轉,否則順序執行 LOOPNZ short_label
5、CX為0跳轉指令
(1)指令格式:
JCXZ short_label;若CX=0,則跳轉,否則順序執行
CX=0時跳轉,一般在循環體中需要跳出循環時使用
(二)算術運算指令
一、二進制運算指令
1、不帶CF的加/減指令
(1)指令格式:
ADD dst,src; dst<--dst+src
SUB dst,src; dst<--dst-src
段寄存器不能使用,對6個條件標志位均有影響
2、帶CF的加/減指令
(1)指令格式:
ADC dst,src; dst<--dst+src+CF
SBB dst,src; dst<--dst-src-CF
(2)注意點
一條帶CF的加/減指令實際上涉及兩個CF,參加加/減計算的是前一個字節計算后影響的CF,本次計算后影響的CF留下給下一字節計算。
3、比較指令
(1)指令格式:
CMP dst,src; dst<—src
(2)ZF標志位變化意義:
ZF = 1,則兩個數字相等,ZF = 0,則不相等。
(3)CF標志位意義:無符號數判斷大小:
CF = 0,則被減數大於或等於減數,若CF 0 1,則相反。
(4)OF,SF標志位意義:有符號數判斷大小:
A、
OF = 0, SF = 0,則被減數大於等於減數。 SF = 1,則被減數小於減數 OF = 1, SF = 0,則被減數大於減數 SF = 0,則被減數小於減數
B、OF和SF相同,被減數大於等於減數,OF和SF不同,被減數小於等於減數
4、加1/減1指令
(1)指令格式:
INC dst ; dst<--dst+1 DEC dst; dst<-dst-1
能夠使用的操作數是reg和mem,8位或者16位都可以
(2)功能:主要用於循環程序中對地址指令修改和對循環次數進行計數。
5、求補指令
(1)指令格式:
NEG dst; dst<--0-dst
能夠使用的操作數也是reg和mem,8或者16位均可以。
(2)作用:
A、求帶符號負數的絕對值
B、對帶符號正數操作,得到絕對值相等的負數
6、乘法指令
(1)指令格式:
MUL src; AX<-AL*8位src或 DX,AX<--AX*16位src ;無符號數乘法指令,能做8位*8位,16位*16位的乘法運算,但乘法指令只能指定一個源操作數作為乘數,可以是
;8位或者16位的reg或者mem。若操作數是16位,則乘積在DX(高16位)和AX(低16位中)
IMUL src; AX<-AL*8位src或 DX,AX<--AX*16位src ; 有符號數乘法指令
(2)相關注意點
乘法指令對OF和CF標志位有影響,其他標志位不確定
A、無符號數,若高8/16位等於0則OF=CF=0,否則OF=CF=1
B、有符號數,若高8/16位的積的高16位DX是低16位AX的符號擴張,則OF=CF=0,OF=CF=1。
7、除法指令
(1)指令格式:
DIV src; AX/8位src,AL<--商,AH<--余數 ; DX(高)、AX(低)/16位src,AX<--商,DX<--余數 IDIV src; AX/8位src,AL<--商,AH<--余數 ; DX(高)、AX(低)/16位src,AX<--商,DX<--余數
(2)相關注意點:
出發指令對標志位的影響是不確定的
8、符號擴展指令
(1)指令格式:
CBW;若AL最高位為1,則AH<--0FFH,否則AH<--0 CWD;若AX最高位為1,則DX<--0FFFFH,否則DX<--0
(2)使用地方:
一條除法指令只能做16位除以8位,或32位除以16位的運算,若要進行8位除以8位,或16位除以16位的運算,則必須先把被除數從8位擴展到16位,或16位擴展到32位。一般是配合帶符號除法
9、二進制運算指令的使用:
(1)一般只能帶符號之間進行運算,不帶符號之間進行運算
(2)但是要是1個帶符號和一個無符號數進行乘法或者除法運算也是可以實現的:
A、求帶符號數的絕對值
B、用無符號數乘或除指令進行此絕對值與無符號數的乘或除運算
C、將無符號數轉換成帶符號數
二、BCD碼調整
1、壓縮型BCD碼加法調整指令:
(1)指令格式:
DAA;若AL的低4位>9或AF = 1,則AL<—AL + 06H,AF<--1
;若AL的高4位>9或CF = 1,則AL<—AL + 06H,CF<--1
(2)使用注意點:
DAA指令必須跟在一條以AL為目的操作數的ADC或着ADD指令之后,且相加的數必須是合法的壓縮型BCD碼
2、非壓縮性BCD碼加法調整指令
(1)指令格式:
AAA;若AL的低4位>9或AF=1,則AL<--AL+06H,CF<--AF<--1,AH<—AH - 1,AL高4位清0
(2)使用注意點:
AAA指令必須跟在一條以AL為目的操作數的ADC或着ADD指令之后,且相加的數必須是合法的壓縮型BCD碼
3、壓縮型BCD碼減法調整指令
(1)指令格式:
DAS;若AL的低4位>9或AF = 1,則AL<—AL - 06H,AF<--1
;若AL的高4位>9或CF = 1,則AL<—AL - 06H,CF<--1
(2)使用注意點:
DAS指令必須跟在一條以AL為目的操作數的SUB或着SBB指令之后,且相減的數必須是合法的壓縮型BCD碼
4、非壓縮型BCD碼減法調整指令
(1)指令格式:
AAS;若AL的低4位 > 9或AF = 1,則AL<—AL - 06H,CF<--AF<--1,AH<—AH - 1,AL高4位清0
(2)使用注意點:
DAS指令必須跟在一條以AL為目的操作數的SUB或着SBB指令之后,且相減的數必須是合法的壓縮型BCD碼
5、非壓縮型BCD碼乘法調整指令
(1)指令格式:
AAM; AL<—AH * 0AH + AL,AH = 0
(2)使用注意點:
AAM指令必須跟在一條8位乘8位指令之后,且相乘的數必須是合法的壓縮型BCD碼
6、非壓縮型BCD嗎除法調整指令
(1)指令格式:
AAD; AL<—AH / 0AH,AH<--商,AL<—余數
(2)使用注意點:
AAD指令必須放在一條16位除以8位指令之前,且相除的數必須是合法的壓縮型BCD碼
(三)多字節加/減運算程序
一、多字節加法程序流程圖
二、程序如下:多字節加法
DATA SEGMENT ;數據段 DATA1 DB 4 DUP(?) DATA2 DB 4 DUP(?) DATA3 DB 5 DUP(?) DATA ENDS CODE SEGMENT ;代碼段 ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX MOV SI,OFFSET DATA1 ;取地址 MOV DI,OFFSET DATA2 MOV BX,OFFSET DATA3 MOV CX,DATA2-DATA1 CLC NEXT: ;循環做加法 MOV AL,[SI] ADC AL,[DI] NOP MOV [BX],AL INC SI INC DI INC BX LOOP NEXT MOV AL,0 ;處理最后的進位 ADC AL,0 MOV [BX],AL MOV AH,4CH INT 21H CODE ENDS END START
三、基本調試方法:
1、顯示和修改內存中的數據
(1)使用U命令可以看到反匯編得到的程序
從中可以得到數據段的地址是076A
(2)使用D命令可以看數據
(3)使用E命令進行修改
2、斷點運行程序
(1)使用G命令可以使程序執行一段規定的長度。
3、修改程序指令
使用A命令,再鍵入要寫入的命令即可。
(四)多字節除法程序
一、除法指令的除法程序
1、程序流程圖如下:
2、程序如下:
DATA SEGMENT DATA1 DB 4 DUP(?) ;被除數 DATA2 DB 1 DUP(?) ;除數 DATA3 DB 5 DUP(?) ;商 DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA ;初始化 MOV DS,AX LEA SI,DATA1 ;取地址 LEA DI,DATA3 MOV CX,DATA2-DATA1 ;確定循環次數 MOV AH,0 NEXT: MOV AL,[SI] ;取被除數的一字節 NOP NOP DIV DATA2 MOV [DI],AL ;存儲 INC SI INC DI LOOP NEXT MOV DATA3+4,AH ;對余數進行的處理 MOV AH,4CH INT 21H CODE ENDS END START
二、被除數左移法的除法程序
1、程序流圖
2、程序如下:
DATA SEGMENT DATA1 DB 4 DUP(?) DATA2 DB ? DATA3 DB ? DATA ENDS
CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX MOV AL,0 MOV CH,8*LENGTH DATA1
NEXT1: LEA SI,DATA2-1 MOV CL,DATA2-DATA1 CLC NEXT2: MOV AH,[si] adc ah,[si] mov [si],ah dec si dec cl jnz next2 adc al,al JC NEXT4 cmp al,data2 jc next3 NEXT4: sub al,data2 inc data2-1 next3: dec ch jnz next1 mov data3,al mov ah,4ch int 21h code ends end start