日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

十四、汇编指令(存储、加法、减法、乘法、除法、跳转、子程序、if判断、中断)

發(fā)布時間:2025/3/15 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 十四、汇编指令(存储、加法、减法、乘法、除法、跳转、子程序、if判断、中断) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

0. 存儲指令

語法:

mov 寄存器,寄存器 mov 寄存器,[偏移地址] mov [偏移地址],寄存器 mov ds:[偏移地址],寄存器

?

1. 加法指令

add 加法

語法:

add 目的操作數(shù),源操作數(shù)

執(zhí)行的操作:目的操作數(shù) <- 目的操作數(shù) + 源操作數(shù)

實例:

assume cs:daima daima segmentmov ax,1000Hmov bx,2000Hadd bx,axmov ax,4c00Hint 21H daima ends end

inc 加1

語法:

inc 操作數(shù)

?執(zhí)行的操作:操作數(shù) <- 操作數(shù) + 1

實例:

assume cs:daima daima segmentmov ax,1000Hinc axadd bx,axmov ax,4c00Hint 21H daima ends end

?

2. 減法指令

sub 加法

語法:

sub 目的操作數(shù),源操作數(shù)

執(zhí)行的操作:目的操作數(shù) <- 目的操作數(shù) -?源操作數(shù)

實例:

assume cs:daima daima segmentmov ax,5000Hmov bx,3000Hsub ax,bxmov ax,4c00Hint 21H daima ends end

dec 加1

語法:

dec 操作數(shù)

?執(zhí)行的操作:操作數(shù) <- 操作數(shù) -?1

實例:

assume cs:daima daima segmentmov ax,1001Hdec axmov 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],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)

語法:

loop 標(biāo)號

執(zhí)行步驟:

a 將cx寄存器中的值減1

b 判斷cx寄存器中的值是否為0.不為0轉(zhuǎn)至標(biāo)號處執(zhí)行程序,為0向下執(zhí)行。

標(biāo)號:在匯編程序中,為指令的位置標(biāo)記。

模型:

mov cx,循環(huán)次數(shù) 標(biāo)號:循環(huán)體 loop 標(biāo)號

實例

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

作用:乘法運算

格式:MUL (寄存器? |? 內(nèi)存單元)

8位乘數(shù)時,被乘數(shù)在AL內(nèi),乘積將存儲在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 start

8位實例:

;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ù)在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

作用:除法運算。

格式:DIV (寄存器? |? 內(nèi)存單元)

8位除數(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 start

16位除數(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 start

16位實例:

;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無條件跳轉(zhuǎn)指令(自己理解為go to語句,向前向后跳轉(zhuǎn)均可)

作用:無條件轉(zhuǎn)移指令,可以只修改IP,也可以同時修改CS和IP。

段內(nèi)短轉(zhuǎn)移(移動范圍:-128~127)?? ?JMP SHORT 標(biāo)號(占兩個字節(jié))
段內(nèi)近轉(zhuǎn)移(移動范圍:-32768~32767)?? ?JMP NEAR PTR 標(biāo)號(占3個字節(jié))

紅箭頭表示占字節(jié)幾位,也就是取值范圍大小。

實例:

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 start

jmp指令段間轉(zhuǎn)移

作用:無條件轉(zhuǎn)移指令,可以只修改IP,也可以同時修改CS和IP。
段間遠(yuǎn)轉(zhuǎn)移?? ?JMP FAR PTR 標(biāo)號(占5個字節(jié))

FAR PTR 指明了轉(zhuǎn)移指令用標(biā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 start

jmp指令轉(zhuǎn)移地址

轉(zhuǎn)移地址可以在寄存器
JMP 寄存器(16位)(段內(nèi)轉(zhuǎn)移)

assume cs:code,ds:data data segment data endsstack segment stack endscode segment start:mov ax,bxmov ax,offset s0jmp axmov bx,cxs0:mov cx,dxmov ax,4c00Hint 21H code ends end start

轉(zhuǎn)移地址可以在內(nèi)存中(自己感覺像if語句的語法,通過判斷跳轉(zhuǎn)內(nèi)存某內(nèi)存位置)
JMP WORD PTR 內(nèi)存單元地址(段內(nèi)轉(zhuǎn)移)

assume cs:code,ds:data data segmentdw 0000H,0FFFFH data endsstack segment stack endscode segment start:mov ax.datamov ds,axmov ax,offset s0mov ds:[0],axjmp word ptr ds:[0]mov bx,cxs0:mov cx,dxmov ax,4c00Hint 21H code ends end start


JMP DWORD PTR 內(nèi)存單元地址(段間轉(zhuǎn)移)(跳轉(zhuǎn)到段地址2233,偏移量為0011的位置)

assume cs:code,ds:data data segmentdw 0000H,0000H,0FFFFH data endsstack segment stack endsabc segmentmov ax,bxs0:mov ax,bxmov ax,bx ends abccode segment start:mov ax.datamov ds,axmov bx,abcmov ds:[0002H],bxmov bx,offset s0mov ds:[0],bxjmp dowrd ptr ds:[0]mov ax,4c00Hint 21H code ends end start

?

7. jcxz有條件跳轉(zhuǎn)指令(if語句,判斷cx寄存器是否為0)

作用:有條件轉(zhuǎn)移指令。段內(nèi)短轉(zhuǎn)移,范圍為:-128~127。

格式:JCXZ 標(biāo)號
解釋:如果CX寄存器的值為0,則轉(zhuǎn)移到標(biāo)號處執(zhí)行。

實例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,否則執(zhí)行s1,實現(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)容,從而實現(xiàn)近轉(zhuǎn)移。

;取出棧60-2地址位數(shù)據(jù)1111(2個字節(jié)),將CS的IP指針賦值為1111,棧同時做了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 start

RETF指令

?? ?RETF指令取棧中的數(shù)據(jù),修改CS和IP寄存器的內(nèi)容,從而實現(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),形成子程序)

語法:CALL 標(biāo)號(與ret配合使用形成子程序)
作用:將IP寄存器的值進(jìn)棧,然后轉(zhuǎn)到標(biāo)號處執(zhí)行指令。

;一個簡單的子程序設(shè)計完成了 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,bxcall s0mov ax,bx ;將ax,bx地址放入ss的005e中,跳轉(zhuǎn)到s0mov ax,4c00Hint 21Hs0:mov bx,cxmov bx,cxret ;恢復(fù),從而形成子程序 code ends end start

CALL指令與段間轉(zhuǎn)移

語法:CALL FAR PTR 標(biāo)號(與retf配合使用形成子程序)
作用:將CS寄存器、IP寄存器進(jìn)棧,然后轉(zhuǎn)到標(biāo)號處執(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,bxcall far ptr s0 ;先將cs值放入ss,再將ip值放入ss,ss中存放2個字mov ax,bxmov ax,bxs0:mov bx,cxmov bx,cxretfmov ax,4c00Hint 21H code ends end start

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)號存放入寄存器,在call寄存器達(dá)到跳轉(zhuǎn)call cxmov ax,bxs0:mov bx,cxmov bx,cxretmov ax,4c00Hint 21H code ends end start

CALL指令與內(nèi)存

語法:CALL WORD PTR 內(nèi)存單元地址(ret配合使用)
作用:將IP寄存器的值進(jìn)棧,然后轉(zhuǎn)到內(nèi)存單元所存儲值的位置執(zhí)行指令。

assume cs:code,ds:data,ss:stack data segmentdw 256 dup (0H) data endsstack segmentdw 256 dup (0H) stack endscode segment start:mov ax,datamov ds,axmov ax,stcakmov ss,axmov sp,60Hmov word ptr ds:[0H],offset s0 ;將s0放入數(shù)據(jù)段內(nèi)存偏移地址中mov ax,bxcall word ptr ds:[0H] ;跳轉(zhuǎn)ds的偏移地址存儲的代碼mov ax,bxs0:mov bx,cxmov bx,cxretmov ax,4c00Hint 21H code ends end start

語法:CALL DWORD PTR 內(nèi)存單元地址(retf配合使用)
作用:將CS寄存器、IP寄存器進(jìn)棧,然后轉(zhuǎn)到內(nèi)存單元所存儲值的位置執(zhí)行指令。

assume cs:code,ds:data,ss:stack data segmentdw 256 dup (0H) data endsstack segmentdw 256 dup (0H) stack endscode segment start:mov ax,datamov ds,axmov ax,stcakmov ss,axmov sp,60Hmov word ptr ds:[0H],offset s0 ;將s0放入數(shù)據(jù)段內(nèi)存偏移地址中mov word ptr ds:[2H],offset code ;放入代碼段cs值放入ds內(nèi)存mov ax,bxcall dword ptr ds:[0H] ;跳轉(zhuǎn)ds的偏移地址存儲的代碼mov ax,bxs0:mov bx,cxmov bx,cxretfmov ax,4c00Hint 21H code ends end start

?

10.?ADC指令(區(qū)別ADD指令)

? ? ADC指令:帶進(jìn)位加法指令。

?? ?作用:在計算加法的時候,一同帶上CF標(biāo)志位上的進(jìn)位值進(jìn)行計算。

;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標(biāo)志位上的借位值進(jìn)行計算。

?? ?ADC指令:帶進(jìn)位加法指令。

?? ?作用:在計算加法的時候,一同帶上CF標(biāo)志位上的進(jìn)位值進(jìn)行計算。

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語句里做等號不等號判斷)

? ? CMP指令:比較指令。

?? ?作用:計算減法功能,但并不保存結(jié)果,僅僅根據(jù)計算結(jié)果影響標(biāo)志寄存器的位。

?? ?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. 條件轉(zhuǎn)移指令(if條件轉(zhuǎn)移)

? ? 條件轉(zhuǎn)移指令:根據(jù)條件是否滿足,來決定是否修改IP。

?? ?條件轉(zhuǎn)移指令對照(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

assume cs:code,ds:data,ss:stack data segmentdw 256 dup (0H) data endsstack segmentdw 256 dup (0H) stack endscode segment start:mov ax,0011Hmov bx,0011Hcmp ax,bxje s ;舉例ZF=1 A=B JEmov ax,bxmov ax,bxs:mov bx,cxmov bx,cxmov ax,4c00Hint 21H code ends end start

?

14. movsb、movsw(串傳送指令)

? ? movsb指令(1個字節(jié)
?? ?功能:將ds:si指向的內(nèi)存單元中的字節(jié)傳送入es:di指向的內(nèi)存單元,然后根據(jù)DF標(biāo)志位的值,將si、di遞增1或遞減1。

?? ?movsw指令(2個字節(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í)行后面的串傳送指令。

;從前向后依次復(fù)制粘貼,遞增 assume cs:code,ds:data,ss:stack data segmentdb 'china os'db 8 dup (0H) data endsstack segmentdw 256 dup (0H) stack endscode segment start:mov ax,datamov ds,axmov si,0Hmov es,axmov di,8Hcld ;設(shè)置DF值為0mov cx,8H ;循環(huán)8次rep movsb ;重復(fù)cx的次數(shù); movsb ;依次將ds寄存器數(shù)據(jù)偏移賦值到8-16,標(biāo)志位遞增,0賦值8 ; movsb ;1賦值9 ; movsb ;2賦值A(chǔ) ; movsb ; movsb ; movsb ; movsb ; movsbmov ax,4c00Hint 21H code ends end start

?

16. INT 指令(強制觸發(fā)中斷,結(jié)束中斷 int 21H)

? ? 作用:觸發(fā)中斷過程。
?? ?語法:INT 中斷類型碼

assume cs:code,ds:data,ss:stack data segmentdw 256 dup (0H) data endsstack segmentdw 256 dup (0H) stack endscode segment start:mov ax,1000Hint 0 ;除法溢出中斷mov ax,4c00Hint 21H code ends end start

?

17.?與比較(and)

實例:

test al,al? ? ? ? ? ?

?

18. 取ebx補碼

實例:

neg? ebx? ? ??

?

?

?

?

?

?

?

總結(jié)

以上是生活随笔為你收集整理的十四、汇编指令(存储、加法、减法、乘法、除法、跳转、子程序、if判断、中断)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。