01.汇编语法

来源:互联网 发布:matlab input输入数组 编辑:程序博客网 时间:2024/05/21 21:01

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


原创粉丝点击