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 帶進位循環右移