天天看點

dx 彙編dec_彙編語言——彙編指令

mov

功能:用來進行資料傳輸。

以 “mov A, B”為例,相當于A=B。

具有以下形式:mov 寄存器, 資料;mov 寄存器, 寄存器;mov 寄存器, 記憶體單元;mov 記憶體單元, 寄存器;mov 段寄存器,寄存器;

add

功能:用來做加法。

以“add A, B”為例,相當于A=A+B。

具有的形式,和 mov 一樣。

sub

功能:用來做減法。

以“sub A, B”為例,相當于A=A-B。

具有的形式,和 mov 一樣。

inc,dec

功能:用來自增,自減

以“inc A”為例,相當于A=A+1。

以“dec A”為例,相當于A=A-1。

push

功能:入棧

以“push A”為例,大概相當于:SP=SP-2 ;将A中的内容送入SS:SP指向的記憶體單元處。

具有以下形式:push 寄存器;push 記憶體單元;push 段寄存器

pop

功能:出棧

以“pop A”為例,大概相當于:将SS:SP指向的記憶體單元處的資料送入A中;SP=SP+2。

具有形式和push相同

Loop

功能:實作基于cx的循環功能

以“loop S“為例,大概相當于:cx=cx-1,判斷cx中的值,不為0則轉至标号處執行程式。

and

功能:邏輯與指令,按位進行與運算。

通過該指令可将操作對象的相應位設定為0,其他位不變。

or

功能:邏輯或指令,按位進行或運算。

通過該指令可将操作對象的相應位設定為1,其他位不變。

mul

功能:乘法指令

當乘數是位元組操作數時,把AL中的無符号數與乘數相乘,結果16位放入AX中

當乘數是字操作數時,把AX中的無符号數與乘數相乘,結果32位,高位放入DX中,低位放入AX中。

div

功能:除法指令

除數:有8位和16位兩種,在一個reg或記憶體單元中。

被除數:預設放在AX或DX和AX中,如果除數為8位,被除數則為16位,預設在AX中存放;如果除數為16位,被除數則為32位,在DX和AX中存放,DX存放高16位,AX存放低16位。

結果:如果除數為8位,則AL存儲除法操作的商,AH存儲除法操作的餘數;如果除數為16位,則AX存儲除法操作的商,DX存儲除法操作的餘數。

jmp

1. 依據位移進行轉移的 jmp 指令:

(1) jmp short 标号

這種 jmp指令實作的是段内短轉移,它對IP的修改範圍為 -128-127 。

實際上,“jmp short 标号”的功能為:(IP)=(IP)+8位位移

8位位移=标号處的位址-jmp指令後的第一個位元組的位址。

short指明此處的位移為8位位移。

8位位移用補碼表示。

8位位移由編譯程式在編譯時算出。

(2)jmp near ptr 标号

這種 jmp 指令實作的是段内近轉移。

實際上,“jmp near 标号”的功能為:(IP)=(IP)+16位位移

2. 轉移的目的位址在指令中的 jmp 指令

jmp far ptr 标号  實作的是段間轉移,又稱為遠轉移。

功能:(CS)= 标号所在段的段位址,(IP)= 标号所在段中的偏移位址

3. 轉移位址在寄存器中的 jmp 指令

指令格式:jmp 16位 reg

功能:(IP)=(16位reg)

4.轉移位址在記憶體單元中的 jmp 指令

(1)jmp word ptr 記憶體單元位址

功能:從記憶體單元位址處開始存放着一個字,是轉移的目的偏移位址。

(2)jmp dword ptr 記憶體單元位址(段間轉移)

功能:從記憶體單元位址處開始存放着兩個字,高位址處的字是轉移的目的位址,低位址處是轉移的目的偏移位址。

jcxz(jump if cx = zero)

指令格式:jcxz 标号

操作:當 cx=0 時,(IP)=(IP)+8位位移

ret

ret指令用棧中的資料,修改IP的内容,進而實作近轉移;

CPU執行 ret 指令時,進行下面兩步操作:

(1)(IP)=((ss)*16+(sp))

(2)(sp)=(sp)+ 2

retf

retf指令用棧中的資料,修改CS和IP的内容,進而實作遠轉移;

CPU執行 retf 指令時,進行下面4步操作:

(1)(IP)=((ss)*16 + (sp))

(2)(sp)=(sp)+ 2

(3)(CS)=((ss)*16 + (sp))

(4)(sp)=(sp)+ 2

call

一.  依據位移進行轉移的call指令

1. call 标号(将目前的 IP 壓棧後,轉到标号處執行指令)

CPU執行這種格式的call指令後,進行如下的操作:

(1)(sp)=(sp)- 2

((ss)* 16 +(sp))=(IP)

(2)(IP)=(IP)+ 16位位移

二.  轉移的目的位址在指令中的call指令

1. call far ptr 标号

CPU執行此種格式的call指令時,進行如下的操作:

(1)(sp)=(sp)- 2

((ss)*16 + (sp))=(CS)

(sp)=(sp)- 2

((ss)*16 + (sp))=(IP)

(2)(CS)=标号所在段的段位址

(IP)=标号在段中的偏移位址

三. 轉移位址在寄存器中的call指令

call 16位 reg

功能:

(sp)=(sp)- 2

((ss)*16 +(sp))=(IP)

(IP)=(reg)

四. 轉移位址在記憶體中的call指令

1. call word ptr 記憶體單元位址

功能:

push IP

jmp word ptr 記憶體單元位址

2. call dwordd ptr 記憶體單元位址

功能:

push CS

push IP

jmp dword ptr 記憶體單元位址

adc

adc是帶進位加法指令,它利用了CF位上記錄的進位值。

指令格式:adc 操作對象1,操作對象2

功能:操作對象1=操作對象1+操作對象2+CF

sbb

sbb是帶借位減法指令,它利用了CF位上記錄的借位值。

指令格式:sbb 操作對象1,操作對象2

功能:操作對象1=操作對象1-操作對象2-CF

cmp

cmp是比較指令,cmp的功能相當于減法指令,隻是不儲存結果,關鍵作用是對标志寄存器的影響。

指令格式:cmp 操作對象1,操作對象2

功能:計算操作對象1-操作對象2但不儲存結果,僅僅根據計算結果對标志寄存器進行設定。

檢測比較結果的條件轉移指令

指令

含義

檢測的相關标志位

je

等于則跳轉

zf=1

jne

不等于則跳轉

zf=0

jb

小于則跳轉

cf=1

jnb

不小于則跳轉

cf=0

ja

大于則跳轉

cf=0且zf=0

jna

不大于則跳轉

cf=1且zf=1

movsb

格式:movsb

功能:将ds:si指向的記憶體單元中的位元組送入es:di中,然後根據df的值,将si和di遞增1或遞減1。

執行movsb指令相于進行下面幾步操作

(1)((es)*16+(di))=((ds)*16+(si))

(2)如果df=0則:(si)=(si)+ 1;(di)=(di)+ 1

如果df=1則:(si)=(si)- 1;(di)=(di)- 1

movsw

格式:movsw

功能:将ds:si指向的記憶體字單元中的字送入es:di中,然後根據标志寄存器df的值,将si和di遞增2或遞減2 。

rep

一般和movsb,movsw關聯

功能:rep的作用是根據cx的值,重複執行後面的串傳送指令。

pushf ,popf

pushf的功能是将标志寄存器的值壓棧,popf的功能是從棧中彈出資料,放入标志寄存器中。

int

功能:引發中斷過程。

指令格式:int n  (n為中斷類型碼)

cpu執行int n指令,相當于引發一個n号中斷的中斷過程,執行過程如下。

(1)取中斷類型碼n;

(2)标志寄存器入棧,IF=0,TF=0;

(3)CS、IP入棧;

(4)(IP)=(n*4),(CS)=(n*4+2)。

iret

功能:從中斷例程傳回到應用程式。

相當于:

pop IP

pop CS

popf

in   out

在in和out指令中,隻能使用ax或al來存放從端口中讀入的資料或要發送到端口中的資料。通路8位端口時,要用al;通路16位端口時,要用ax。

對0~255以内的端口進行讀寫時:

in al,20h  ;從20h端口讀入一個位元組

out 20h,al  ;往20h端口寫入一個位元組

對256~65535的端口進行讀寫時,端口号放在dx中:

mov dx,3f8h  ;将端口号3f8h放入dx

in al,dx  ;從3f8h端口讀入一個位元組

out dx,al  ;往3f8h端口寫入一個位元組

shl

shl是邏輯左移指令,它的功能為:

(1)将一個寄存器或記憶體單元中的資料向左移位;

(2)将最後移出的一位寫入CF中;

(3)最低位用0補充。

如果移動位數大于1時,必須将移動位數放在cl中。

shr

shr是邏輯右移指令,它的功能為:

(1)将一個寄存器或記憶體單元中的資料向右移位;

(2)将最後移出的一位寫入CF中;

(3)最高位用0補充。

如果移動位數大于1時,必須将移動位數放在cl中。

sti  cli

sti,設定IF=1

cli,設定IF=0