辅助汇编学习记录2

  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,eaxmov eax,0两者的作用没有区别,都是让eax的值为0,但是xor eax,eax 指令为2字节,mov eax,0 指令为5个字节。相比而言,前面指令更能节省空间。

xor eax,eax是让eaxeax进行异或操作。

 

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  带进位循环右移

 

 

 

 

 

 

 

 

你可能感兴趣的:(X86指令集,汇编)