十四、汇编指令(存储、加法、减法、乘法、除法、跳转、子程序、if判断、中断)
0. 存儲指令
語法:
mov 寄存器,寄存器 mov 寄存器,[偏移地址] mov [偏移地址],寄存器 mov ds:[偏移地址],寄存器?
1. 加法指令
add 加法
語法:
add 目的操作數,源操作數執行的操作:目的操作數 <- 目的操作數 + 源操作數
實例:
assume cs:daima daima segmentmov ax,1000Hmov bx,2000Hadd bx,axmov ax,4c00Hint 21H daima ends endinc 加1
語法:
inc 操作數?執行的操作:操作數 <- 操作數 + 1
實例:
assume cs:daima daima segmentmov ax,1000Hinc axadd bx,axmov ax,4c00Hint 21H daima ends end?
2. 減法指令
sub 加法
語法:
sub 目的操作數,源操作數執行的操作:目的操作數 <- 目的操作數 -?源操作數
實例:
assume cs:daima daima segmentmov ax,5000Hmov bx,3000Hsub ax,bxmov ax,4c00Hint 21H daima ends enddec 加1
語法:
dec 操作數?執行的操作:操作數 <- 操作數 -?1
實例:
assume cs:daima daima segmentmov ax,1001Hdec axmov ax,4c00Hint 21H daima ends end加減法匯總實例
;段地址偏移地址2000-2005中依次放入數據FF、FE、FC、FB、FAassume cs:daima daima segmentmov ax,2000Hmov ds,axmov bx,0000Hmov ah,0FFHmov [bx],ahinc bxdec ahmov [bx],ahinc bxdec ahmov [bx],ahinc bxdec ahmov [bx],ahinc bxdec ahmov [bx],ahmov ax,4c00Hint 21H daima ends end?
3. 循環指令
loop 循環指令(for)
語法:
loop 標號執行步驟:
a 將cx寄存器中的值減1
b 判斷cx寄存器中的值是否為0.不為0轉至標號處執行程序,為0向下執行。
標號:在匯編程序中,為指令的位置標記。
模型:
mov cx,循環次數 標號:循環體 loop 標號實例
assume cs:daima daima segmentmov ax,0000Hmov cx,2HA:inc zxloop Amov ax,4c00Hint 21H daima ends end ;段地址偏移地址2000-2005中依次放入數據FF、FE、FC、FB、FAassume cs:daima daima segmentmov ax,2000Hmov ds,axmov bx,0000Hmov ah,0FFHmov [bx],ahmov cx,4HA:inc bxdec ahmov [bx],ahloop Amov ax,4c00Hint 21H daima ends end?
4. 乘法指令
MUL
作用:乘法運算
格式:MUL (寄存器? |? 內存單元)
8位乘數時,被乘數在AL內,乘積將存儲在AX內。
assume cs:code,ds:data data segment data endsstack segment stack endscode segment start:mov bl,16Hmov al,17Hmul bl ;ds:[00H]mov ax,4c00Hint 21H code ends end start8位實例:
;8位乘法 assume cs:code,ds:data data segmentdb 03H,04Hdw 0FFH data endsstack segment stack endscode segment start:mov ax,datamov ds,axmov al,ds:[0]mov ah,ds:[1]mul ahmov ds:[2],axmov ax,4c00Hint 21H code ends end start?
16位乘數時,被乘數在AX內,乘積在DX,AX內,遵循高存高,低存低原則。(DX存放高位,AX存放低位)
assume cs:code,ds:data data segment data endsstack segment stack endscode segment start:mov bx,0FFFFHmov aX,0FFFFHmul bxmov ax,4c00Hint 21H code ends end start?
5. 除法指令
DIV
作用:除法運算。
格式:DIV (寄存器? |? 內存單元)
8位除數時,被除數在AX內,商在AL內,余數在AH內。
assume cs:code,ds:data data segment data endsstack segment stack endscode segment start:mov ax,4DHmov bl,0AHdiv blmov ax,4c00Hint 21H code ends end start16位除數時,被除數在DX和AX內,商在AX內,余數在DX內。(DX存放高位,AX存放低位)
assume cs:code,ds:data data segment data endsstack segment stack endscode segment start:mov dx,000FHmov ax,0001Hmov bx,03E8Hdiv bxmov ax,4c00Hint 21H code ends end start16位實例:
;16位除法 assume cs:code,ds:data data segmentdd 00015F99Hdw 0384H,0H,0Hdb 0FFH data endsstack segment stack endscode segment start:mov ax,datamov ds,axmov dx,ds:[2]mov ax,ds:[0]mov bx.ds:[4]div bx;div word ptrbx ds:[4]mov ds:[6],axmov ds:[8],dxmov ax,4c00Hint 21H code ends end start?
6. jmp無條件跳轉指令(自己理解為go to語句,向前向后跳轉均可)
作用:無條件轉移指令,可以只修改IP,也可以同時修改CS和IP。
段內短轉移(移動范圍:-128~127)?? ?JMP SHORT 標號(占兩個字節)
段內近轉移(移動范圍:-32768~32767)?? ?JMP NEAR PTR 標號(占3個字節)
紅箭頭表示占字節幾位,也就是取值范圍大小。
實例:
assume cs:code,ds:data data segment data endsstack segment stack endscode segment start:mov ax,bxjmp short s0 ;取值范圍小;jmp near ptr s0 ;取值范圍大mov ax,bxmov ax,bxs0: mov bx,cxmov bx,cxmov bx,cxmov ax,4c00Hint 21H code ends end startjmp指令段間轉移
作用:無條件轉移指令,可以只修改IP,也可以同時修改CS和IP。
段間遠轉移?? ?JMP FAR PTR 標號(占5個字節)
FAR PTR 指明了轉移指令用標號的段地址和偏移地址修改CS和IP。
assume cs:code,ds:data data segment data endsstack segment stack endsabc segment s1:mov bx,cxmov bx,cxmov bx,cx ends abccode segment start:mov ax,bxjmp far ptr s1 ;abc段中的s1s0:mov cx,dxmov cx,dxmov cx,dxmov ax,4c00Hint 21H code ends end startjmp指令轉移地址
轉移地址可以在寄存器中
JMP 寄存器(16位)(段內轉移)
轉移地址可以在內存中(自己感覺像if語句的語法,通過判斷跳轉內存某內存位置)
JMP WORD PTR 內存單元地址(段內轉移)
JMP DWORD PTR 內存單元地址(段間轉移)(跳轉到段地址2233,偏移量為0011的位置)
?
7. jcxz有條件跳轉指令(if語句,判斷cx寄存器是否為0)
作用:有條件轉移指令。段內短轉移,范圍為:-128~127。
格式:JCXZ 標號
解釋:如果CX寄存器的值為0,則轉移到標號處執行。
實例1:
assume cs:code,ds:data data segment data endsstack segment stack endscode segment start:mov ax,bxmov ax,bxmov cx,0Hjcxz s0mov ax,bxmov ax,bxs0:mov bx,cxmov ax,4c00Hint 21H code ends end start實例2:
;判斷cx寄存器是否為0,不為0返回s0,否則執行s1,實現了loop循環功能 assume cs:code,ds:data,ss:stack data segmentdw 2H.2H,2H,0H,2H,2H data endsstack segment stack endscode segment start:mov ax,datamov ds,axmov bx,0s0: mov cx,ds:[bx]jcxz s1add bx,2Hjmp s0 s1:mov dx,bxmov ax,4c00Hint 21H code ends end start?
8.?RET與RETF指令(跳轉)
RET指令
?? ?
? ? RET指令取棧中的數據,修改IP寄存器的內容,從而實現近轉移。
;取出棧60-2地址位數據1111(2個字節),將CS的IP指針賦值為1111,棧同時做了pop,SP指針恢復到60H. assume cs:code,ds:data,ss:stack data segment data endsstack segmentdw 256 dup [0H] stack endscode segment start:mov ax,stackmov ss,axmov sp,60Hmov ax,1111Hpush axret mov ax,4c00Hint 21H code ends end startRETF指令
?? ?RETF指令取棧中的數據,修改CS和IP寄存器的內容,從而實現遠轉移。
;取出1122放入cs,3344放入ip,恢復至sp為60 assume cs:code,ds:data,ss:stack data segment data endsstack segmentdw 256 dup [0H] stack endscode segment start:mov ax,stackmov ss,axmov sp,60Hmov ax,1122Hmov bx,3344Hpush axpush bxretfmov ax,4c00Hint 21H code ends end start?
9.?CALL指令(跳轉,形成子程序)
語法:CALL 標號(與ret配合使用形成子程序)
作用:將IP寄存器的值進棧,然后轉到標號處執行指令。
CALL指令與段間轉移
語法:CALL FAR PTR 標號(與retf配合使用形成子程序)
作用:將CS寄存器、IP寄存器進棧,然后轉到標號處執行指令。
CALL指令與寄存器
作用:將IP寄存器的值進棧,然后轉到寄存器值的位置執行指令。
assume cs:code,ds:data,ss:stack data segment data endsstack segmentdw 256 dup (0H) stack endscode segment start:mov ax,stcakmov ss,axmov sp,60Hmov ax,bxmov cx,offset s0 ;將標號存放入寄存器,在call寄存器達到跳轉call cxmov ax,bxs0:mov bx,cxmov bx,cxretmov ax,4c00Hint 21H code ends end startCALL指令與內存
語法:CALL WORD PTR 內存單元地址(ret配合使用)
作用:將IP寄存器的值進棧,然后轉到內存單元所存儲值的位置執行指令。
語法:CALL DWORD PTR 內存單元地址(retf配合使用)
作用:將CS寄存器、IP寄存器進棧,然后轉到內存單元所存儲值的位置執行指令。
?
10.?ADC指令(區別ADD指令)
? ? ADC指令:帶進位加法指令。
?? ?作用:在計算加法的時候,一同帶上CF標志位上的進位值進行計算。
;1AFFFF + 2CFFFC = ? assume cs:code,ds:data,ss:stack data segmentdw 256 dup (0H) data endsstack segmentdw 256 dup (0H) stack endscode segment start:mov ax,1AHmov bx,0FFFFHmov cx,2CHmov dx,0FFFCHadd bx,dxadc ax,cxmov ax,4c00Hint 21H code ends end start?
11.?SBB指令
? ? SBB指令:帶借位減法指令。
?? ?作用:在計算減法的時候,一同帶上CF標志位上的借位值進行計算。
?? ?ADC指令:帶進位加法指令。
?? ?作用:在計算加法的時候,一同帶上CF標志位上的進位值進行計算。
assume cs:code,ds:data,ss:stack data segmentdw 256 dup (0H) data endsstack segmentdw 256 dup (0H) stack endscode segment start:mov ax,0037Hmov bx,0000H ;00370000Hmov cx,0030Hmov dx,0001H ;00300001Hsub,bx,dxsbb,ax,cx ;注意先從低位數做減法,后做高位數減法.mov ax,4c00Hint 21H code ends end start?
12.?CMP指令(比較指令,自己理解為if語句里做等號不等號判斷)
? ? CMP指令:比較指令。
?? ?作用:計算減法功能,但并不保存結果,僅僅根據計算結果影響標志寄存器的位。
?? ?CMP指令比較對照(CMP A,B):
?? ?ZF=1?? ??? ?A=B(等于)
?? ?ZF=0?? ??? ?A!=B(不等于)
?? ?CF=1?? ??? ?A<B(小于)
?? ?CF=0?? ??? ?A>=B(大于或等于)
?? ?CF=0并且ZF=0?? ?A>B(大于)
?? ?CF=1或者ZF=1?? ?A<=B(小于或等于)
13. 條件轉移指令(if條件轉移)
? ? 條件轉移指令:根據條件是否滿足,來決定是否修改IP。
?? ?條件轉移指令對照(CMP A,B):
?? ?ZF=1?? ??? ?A=B(等于)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?JE
?? ?ZF=0?? ??? ?A!=B(不等于)? ? ? ? ? ? ? ? ? ? ? ? ? JNE
?? ?CF=1?? ??? ?A<B(小于)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? JB
?? ?CF=0?? ??? ?A>=B(大于或等于)? ? ? ? ? ? ? ? ?JNB?? ?
?? ?CF=0并且ZF=0?? ?A>B(大于)? ? ? ? ? ? ? ? ? JA
?? ?CF=1或者ZF=1?? ?A<=B(小于或等于)? ? ?JNA
?
14. movsb、movsw(串傳送指令)
? ? movsb指令(1個字節)
?? ?功能:將ds:si指向的內存單元中的字節傳送入es:di指向的內存單元,然后根據DF標志位的值,將si、di遞增1或遞減1。
?? ?movsw指令(2個字節)
?? ?功能:將ds:si指向的內存單元中的字傳送入es:di指向的內存單元,然后根據DF標志位的值,將si、di遞增2或遞減2。
?
15. rep指令 (重復前綴指令,一種循環的方式)
? ? REP 重復前綴指令
?? ?作用:根據CX的值,重復執行后面的串傳送指令。
?
16. INT 指令(強制觸發中斷,結束中斷 int 21H)
? ? 作用:觸發中斷過程。
?? ?語法:INT 中斷類型碼
?
17.?與比較(and)
實例:
test al,al? ? ? ? ? ?
?
18. 取ebx補碼
實例:
neg? ebx? ? ??
?
?
?
?
?
?
?
總結
以上是生活随笔為你收集整理的十四、汇编指令(存储、加法、减法、乘法、除法、跳转、子程序、if判断、中断)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MFC:移动对话框到右下角
- 下一篇: 设计模式:策略模式(C++)【诸葛亮的锦