匯編學習(四)——算術運算程序


(一)跳轉指令

一、無條件跳轉指令(不管標志寄存器,執行到這句直接跳轉)

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

image

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,否則順序執行

image

2、指令格式中的“ccc”是1~3個字母,指明判斷的條件,目的地址是段內的短標號,但是范圍只有D8,所以超出了合法范圍,都會報錯

3、所有指令匯總

image

image

 

三、循環控制指令

1、為了方便循環程序的設計,8086設計了一組共用4條用CX作為循環計數的循環控制指令,也正是由於這個原因,我們把CX成為計數寄存器。循環控制指令一般都要先對循環計數CX自動減1,然后在判斷CX是否為0

2、CX不為0循環指令

(1)指令格式:

LOOP short_label;      CX<--CX-1,若CX不等於0,則跳轉,否則順序執行

(2)圖示:

image

3、CX不為0且相等循環指令

(1)指令格式:

LOOPE short_label;     CX<--CX-1,若CX不等於0,且ZF=1,則跳轉,否則順序執行
LOOPZ short_label;

    所以只要用ZF=1,則就會提前結束循環

(2)圖示:

image

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
          CMP指令僅執行減法計算,不回送結果,所以目的操作數不變, 但根據減計算的結果影響6個條件標志位,可用的操作數組合也與SUB等指令相同。(2

(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碼

 

 

(三)多字節加/減運算程序

一、多字節加法程序流程圖

image

 

二、程序如下:多字節加法

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命令可以看到反匯編得到的程序

image

從中可以得到數據段的地址是076A

(2)使用D命令可以看數據

image

(3)使用E命令進行修改

image

2、斷點運行程序

(1)使用G命令可以使程序執行一段規定的長度。

image

3、修改程序指令

使用A命令,再鍵入要寫入的命令即可。

image

 

(四)多字節除法程序

一、除法指令的除法程序

1、程序流程圖如下:

image

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、程序流圖

image

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM