十四、汇编指令(存储、加法、减法、乘法、除法、跳转、子程序、if判断、中断)
0. 存儲(chǔ)指令
語(yǔ)法:
mov 寄存器,寄存器 mov 寄存器,[偏移地址] mov [偏移地址],寄存器 mov ds:[偏移地址],寄存器?
1. 加法指令
add 加法
語(yǔ)法:
add 目的操作數(shù),源操作數(shù)執(zhí)行的操作:目的操作數(shù) <- 目的操作數(shù) + 源操作數(shù)
實(shí)例:
assume cs:daima daima segmentmov ax,1000Hmov bx,2000Hadd bx,axmov ax,4c00Hint 21H daima ends endinc 加1
語(yǔ)法:
inc 操作數(shù)?執(zhí)行的操作:操作數(shù) <- 操作數(shù) + 1
實(shí)例:
assume cs:daima daima segmentmov ax,1000Hinc axadd bx,axmov ax,4c00Hint 21H daima ends end?
2. 減法指令
sub 加法
語(yǔ)法:
sub 目的操作數(shù),源操作數(shù)執(zhí)行的操作:目的操作數(shù) <- 目的操作數(shù) -?源操作數(shù)
實(shí)例:
assume cs:daima daima segmentmov ax,5000Hmov bx,3000Hsub ax,bxmov ax,4c00Hint 21H daima ends enddec 加1
語(yǔ)法:
dec 操作數(shù)?執(zhí)行的操作:操作數(shù) <- 操作數(shù) -?1
實(shí)例:
assume cs:daima daima segmentmov ax,1001Hdec axmov ax,4c00Hint 21H daima ends end加減法匯總實(shí)例
;段地址偏移地址2000-2005中依次放入數(shù)據(jù)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. 循環(huán)指令
loop 循環(huán)指令(for)
語(yǔ)法:
loop 標(biāo)號(hào)執(zhí)行步驟:
a 將cx寄存器中的值減1
b 判斷cx寄存器中的值是否為0.不為0轉(zhuǎn)至標(biāo)號(hào)處執(zhí)行程序,為0向下執(zhí)行。
標(biāo)號(hào):在匯編程序中,為指令的位置標(biāo)記。
模型:
mov cx,循環(huán)次數(shù) 標(biāo)號(hào):循環(huán)體 loop 標(biāo)號(hào)實(shí)例
assume cs:daima daima segmentmov ax,0000Hmov cx,2HA:inc zxloop Amov ax,4c00Hint 21H daima ends end ;段地址偏移地址2000-2005中依次放入數(shù)據(jù)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
作用:乘法運(yùn)算
格式:MUL (寄存器? |? 內(nèi)存單元)
8位乘數(shù)時(shí),被乘數(shù)在AL內(nèi),乘積將存儲(chǔ)在AX內(nèi)。
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位實(shí)例:
;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位乘數(shù)時(shí),被乘數(shù)在AX內(nèi),乘積在DX,AX內(nèi),遵循高存高,低存低原則。(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
作用:除法運(yùn)算。
格式:DIV (寄存器? |? 內(nèi)存單元)
8位除數(shù)時(shí),被除數(shù)在AX內(nèi),商在AL內(nèi),余數(shù)在AH內(nèi)。
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位除數(shù)時(shí),被除數(shù)在DX和AX內(nèi),商在AX內(nèi),余數(shù)在DX內(nèi)。(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位實(shí)例:
;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無(wú)條件跳轉(zhuǎn)指令(自己理解為go to語(yǔ)句,向前向后跳轉(zhuǎn)均可)
作用:無(wú)條件轉(zhuǎn)移指令,可以只修改IP,也可以同時(shí)修改CS和IP。
段內(nèi)短轉(zhuǎn)移(移動(dòng)范圍:-128~127)?? ?JMP SHORT 標(biāo)號(hào)(占兩個(gè)字節(jié))
段內(nèi)近轉(zhuǎn)移(移動(dòng)范圍:-32768~32767)?? ?JMP NEAR PTR 標(biāo)號(hào)(占3個(gè)字節(jié))
紅箭頭表示占字節(jié)幾位,也就是取值范圍大小。
實(shí)例:
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指令段間轉(zhuǎn)移
作用:無(wú)條件轉(zhuǎn)移指令,可以只修改IP,也可以同時(shí)修改CS和IP。
段間遠(yuǎn)轉(zhuǎn)移?? ?JMP FAR PTR 標(biāo)號(hào)(占5個(gè)字節(jié))
FAR PTR 指明了轉(zhuǎn)移指令用標(biāo)號(hào)的段地址和偏移地址修改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指令轉(zhuǎn)移地址
轉(zhuǎn)移地址可以在寄存器中
JMP 寄存器(16位)(段內(nèi)轉(zhuǎn)移)
轉(zhuǎn)移地址可以在內(nèi)存中(自己感覺(jué)像if語(yǔ)句的語(yǔ)法,通過(guò)判斷跳轉(zhuǎn)內(nèi)存某內(nèi)存位置)
JMP WORD PTR 內(nèi)存單元地址(段內(nèi)轉(zhuǎn)移)
JMP DWORD PTR 內(nèi)存單元地址(段間轉(zhuǎn)移)(跳轉(zhuǎn)到段地址2233,偏移量為0011的位置)
?
7. jcxz有條件跳轉(zhuǎn)指令(if語(yǔ)句,判斷cx寄存器是否為0)
作用:有條件轉(zhuǎn)移指令。段內(nèi)短轉(zhuǎn)移,范圍為:-128~127。
格式:JCXZ 標(biāo)號(hào)
解釋:如果CX寄存器的值為0,則轉(zhuǎn)移到標(biāo)號(hào)處執(zhí)行。
實(shí)例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實(shí)例2:
;判斷cx寄存器是否為0,不為0返回s0,否則執(zhí)行s1,實(shí)現(xiàn)了loop循環(huán)功能 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指令(跳轉(zhuǎn))
RET指令
?? ?
? ? RET指令取棧中的數(shù)據(jù),修改IP寄存器的內(nèi)容,從而實(shí)現(xiàn)近轉(zhuǎn)移。
;取出棧60-2地址位數(shù)據(jù)1111(2個(gè)字節(jié)),將CS的IP指針賦值為1111,棧同時(shí)做了pop,SP指針恢復(fù)到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指令取棧中的數(shù)據(jù),修改CS和IP寄存器的內(nèi)容,從而實(shí)現(xiàn)遠(yuǎn)轉(zhuǎn)移。
;取出1122放入cs,3344放入ip,恢復(fù)至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指令(跳轉(zhuǎn),形成子程序)
語(yǔ)法:CALL 標(biāo)號(hào)(與ret配合使用形成子程序)
作用:將IP寄存器的值進(jìn)棧,然后轉(zhuǎn)到標(biāo)號(hào)處執(zhí)行指令。
CALL指令與段間轉(zhuǎn)移
語(yǔ)法:CALL FAR PTR 標(biāo)號(hào)(與retf配合使用形成子程序)
作用:將CS寄存器、IP寄存器進(jìn)棧,然后轉(zhuǎn)到標(biāo)號(hào)處執(zhí)行指令。
CALL指令與寄存器
作用:將IP寄存器的值進(jìn)棧,然后轉(zhuǎn)到寄存器值的位置執(zhí)行指令。
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 ;將標(biāo)號(hào)存放入寄存器,在call寄存器達(dá)到跳轉(zhuǎn)call cxmov ax,bxs0:mov bx,cxmov bx,cxretmov ax,4c00Hint 21H code ends end startCALL指令與內(nèi)存
語(yǔ)法:CALL WORD PTR 內(nèi)存單元地址(ret配合使用)
作用:將IP寄存器的值進(jìn)棧,然后轉(zhuǎn)到內(nèi)存單元所存儲(chǔ)值的位置執(zhí)行指令。
語(yǔ)法:CALL DWORD PTR 內(nèi)存單元地址(retf配合使用)
作用:將CS寄存器、IP寄存器進(jìn)棧,然后轉(zhuǎn)到內(nèi)存單元所存儲(chǔ)值的位置執(zhí)行指令。
?
10.?ADC指令(區(qū)別ADD指令)
? ? ADC指令:帶進(jìn)位加法指令。
?? ?作用:在計(jì)算加法的時(shí)候,一同帶上CF標(biāo)志位上的進(jìn)位值進(jìn)行計(jì)算。
;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指令:帶借位減法指令。
?? ?作用:在計(jì)算減法的時(shí)候,一同帶上CF標(biāo)志位上的借位值進(jìn)行計(jì)算。
?? ?ADC指令:帶進(jìn)位加法指令。
?? ?作用:在計(jì)算加法的時(shí)候,一同帶上CF標(biāo)志位上的進(jìn)位值進(jìn)行計(jì)算。
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 ;注意先從低位數(shù)做減法,后做高位數(shù)減法.mov ax,4c00Hint 21H code ends end start?
12.?CMP指令(比較指令,自己理解為if語(yǔ)句里做等號(hào)不等號(hào)判斷)
? ? CMP指令:比較指令。
?? ?作用:計(jì)算減法功能,但并不保存結(jié)果,僅僅根據(jù)計(jì)算結(jié)果影響標(biāo)志寄存器的位。
?? ?CMP指令比較對(duì)照(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. 條件轉(zhuǎn)移指令(if條件轉(zhuǎn)移)
? ? 條件轉(zhuǎn)移指令:根據(jù)條件是否滿足,來(lái)決定是否修改IP。
?? ?條件轉(zhuǎn)移指令對(duì)照(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個(gè)字節(jié))
?? ?功能:將ds:si指向的內(nèi)存單元中的字節(jié)傳送入es:di指向的內(nèi)存單元,然后根據(jù)DF標(biāo)志位的值,將si、di遞增1或遞減1。
?? ?movsw指令(2個(gè)字節(jié))
?? ?功能:將ds:si指向的內(nèi)存單元中的字傳送入es:di指向的內(nèi)存單元,然后根據(jù)DF標(biāo)志位的值,將si、di遞增2或遞減2。
?
15. rep指令 (重復(fù)前綴指令,一種循環(huán)的方式)
? ? REP 重復(fù)前綴指令
?? ?作用:根據(jù)CX的值,重復(fù)執(zhí)行后面的串傳送指令。
?
16. INT 指令(強(qiáng)制觸發(fā)中斷,結(jié)束中斷 int 21H)
? ? 作用:觸發(fā)中斷過(guò)程。
?? ?語(yǔ)法:INT 中斷類型碼
?
17.?與比較(and)
實(shí)例:
test al,al? ? ? ? ? ?
?
18. 取ebx補(bǔ)碼
實(shí)例:
neg? ebx? ? ??
?
?
?
?
?
?
?
總結(jié)
以上是生活随笔為你收集整理的十四、汇编指令(存储、加法、减法、乘法、除法、跳转、子程序、if判断、中断)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: MFC:移动对话框到右下角
- 下一篇: 设计模式:策略模式(C++)【诸葛亮的锦