天天看點

彙編文法

1、 通用寄存器

EAX,EBX,ECX,EDX,ESI,EDI,ESP,EBP, 它 們 的低 16 位就是 8086 的

AX,BX,CX,DX,SI,DI,SP,BP,它們的含義如下:

    EAX:累加器 

    EBX:基址寄存器(Base) 

    ECX:計數器 

    EDX:資料寄存器(Data) 

    ESI:源位址指針寄存器(Source) 

    EDI:目的位址指針寄存器(Directy) 

    EBP:基址指針寄存器(Base) 

ESP:堆棧指針寄存器(Stack)

32位系統前面多了‘E’,16位系統沒有‘E’。

AX的高8位AH,低8位AL

DX的高8位DH,低8位DL

2.PUSHF及POPF

PUSHF壓入标志寄存器,POPF彈出并存入标志寄存器

PUSHA及POPA

PUSHA壓入所有一般用途寄存器,POPA彈出并存入所有一般用途寄存器

PUSHAD及POPAD

PUSHAD壓入所有擴充寄存器,POPAD彈出并存入所有擴充寄存器

3.MOV AX,[1234h]   表示将0x1234位址處的内容存入AX寄存器

MOV [1234h],WORD 2*33   将2*33存入記憶體0x1234位址處

MOV AX, IP          錯誤,不能使用寄存器IP當目的操作數或源操作數,因為IP所存的資料是下一個指令的位址,不能改變它的值。

LEA  AX, total         将total的偏移位址傳送到AX

4.PUSH  AX          壓入16位的寄存器AX

PUSH  EAX           壓入32位的寄存器EAX         

PUSH  WORD [total]    壓入16位的記憶體total内容

PUSH  DWORD [total]   壓入32位的記憶體total内容

PUSH  BYTE  12       壓入8位的立即數12

PUSH  WORD 1234H    壓入16位的立即數1234H

PUSH  DWORD  12345678H   壓入32位的立即數12345678H

5.INT  8位立即數    INT指令執行軟體中斷

依标志及CX的條件轉移指令表:

JZ     當ZF=1時轉移

JNZ    當ZF=0時轉移

JS     當SF=1時轉移

JNS    當SF=0時轉移

JO     當OF=1時轉移

JNO    當OF=0時轉移

JC     當CF=1時轉移

JNC     當CF=0時轉移

JP(JPE)      當PF=1時轉移

JNP(JPO)    當PF=0時轉移

JCXZ       當CX=0時轉移

6.CMP指令:

CMP  AX, BX      寄存器AX與寄存器BX比較

CMP  AX, [total]    寄存器AX與變量total比較

CMP  AX, 0         寄存器AX與立即數0比較

CMp  [total], DX     變量total與寄存器DX比較

CMP  [total], 0       變量total與立即數0比較

有符号整數比較的條件轉移指令表:

JL(JNGE)            小于時轉移

JG(JNLE)            大于時轉移

JLE(JNG)            小于或等于時轉移

JGE(JNL)            大于或等于時轉移

JE                  等于時轉移

JNE                不等于時轉移

無符号整數比較的條件轉移指令表:

JB(JNAE)            低于時轉移

JA(JNBE) 高于時轉移

JBE(JNA) 低于或等于時轉移

JAE(JNB) 高于或等于時轉移

JE 等于時轉移

JNE 不等于時轉移

7.無條件轉移指令JMP

JMP  label

JMP  SHORT label

跳至指定位址開始執行程式

循環指令loop:

Label:

;需要循環執行的指令

LOOP label

8.

Label:

DEC  CX

JG  label

将CX的值減去1,如果CX的值大于0,則跳轉到label執行

9.

加減法:

ADD 第一操作數,第二操作數      加法

SUB  第一操作數, 第二操作數      減法

ADD AL, BYTE[b]    将變量b的内容加入寄存器AL

SUB  AL, BYTE[b]   将寄存器AL減去變量b的值

DEC 操作數         對操作數減一

INC  操作數         對操作數加一

乘法:

MUL 操作數    MUL針對無符号整數的相乘

IMUL操作數    IMUL針對帶符号整數的相乘

8位操作數的值與AL相乘後其乘積存入AX中。

16位操作數的值與AX相乘後其乘積存入DX:AX中。

32位操作數的值與EAX相乘後其乘積存入EDX:EAX中。

除法:

DIV 操作數

IDIV操作數

AX的值除以8位操作數的值,其商存在AL上,其餘數存于AH中。

DX:AX的值除以16位操作數的值,其商存于AX中,其餘數存于DX中。

EDX:EAX的值除以32位操作數的值,其商存于EAX,其餘數存于EDX中。

10. 每次cpu執行都要先讀取eip寄存器的值,然後定位eip指向的記憶體位址,并且讀取彙編指令,最後執行。執行後 eip的值=後面要跳轉的位址。

11. 彙編過程參數傳遞的方式:寄存器,變量,堆棧,利用call後續區四種方式傳參。

test   eax,   eax

 je   00401083  

test指令操作是目的操作數和源操作數按位邏輯“與“

運算結果不送回目的操作數

然後根據結果設定SF、ZF、和PF标志位,并将CF和OF

标志位清零。

而JE是當ZF=1時跳轉。

即,當eax的值等于0時跳轉。

是以說,這裡的test就是檢測eax的值是不是0

12. xor eax,eax和mov eax,0兩者的作用沒有差別,都是讓eax的值為0,但是xor eax,eax 指令為2位元組,mov eax,0 指令為5個位元組。相比而言,前面指令更能節省空間。

xor eax,eax是讓eax與eax進行異或操作。

13.彙編過程末尾ret 4*n的含義:先執行ret,将堆棧頂函數傳回位址取出存入eip,執行函數傳回操作,然後将過程的n個參數彈出堆棧,esp=esp+4*n,堆棧指針恢複到調用call之前的狀态。

14.位運算:

AND 第一操作數,第二操作數

OR  第一操作數,第二操作數

XOR 第一操作數,第二操作數

NOT 操作數

TEST第一操作數,第二操作數

TEST指令檢查第一操作數,看看某個指定的位是否被打開。Test的結果不會改變任何操作數的值,與and的操作結果相同,隻是沒有将結果存回第一操作數而已。

15.改變位位置:

SHL  左移

SHR  右移

SAL  算術左移

SAR  算術右移

ROL  循環左移

ROR  循環右移

RCL  帶進位循環左移

RCR  帶進位循環右移