一、十六个常用的寄存器
AX:累加add寄存器,存储函数返回值
BX:基址base寄存器,数据段基址
CX:计数count寄存器,字符串和循环操作数的寄存器
DX:数据data寄存器,I/O指针寄存器
CS、DS、ES、FS、GS、SS:段选择寄存器,去除低三位
ESI:字符串操作的源地址指针寄存器
EDI:字符串操作的目的地址指针寄存器
EBP、ESP
EFLAGS:标志位寄存器
EIP:程序计数器。存放程序下一个执行的指令地址
二、汇编指令
1.NOP :交换指令,操作数为90,什么也不干
2.PUSH x:将x压入栈,esp先减再压数据
3.POP x: 将栈顶数据弹出到x中,esp递增
4.CALL x:将call指令下一条指令压入栈中,改变eip的值为x
5.RET: 将栈顶数据弹出到eip 若为RET X 表示esp再增加x字节
6.MOV 目的源 :将源的值传给目的 !!不能同时是内存操作数
7.LEA x1,x2:将x2的地址载入到x1
8.ADD x1,x2:x1=x1+x2,指令的计算结果将影响eflags寄存器
9.SUB x1,x2:x1=x1-x2,同add,不能同时是内存操作数
10. jmp x: 将eip的值改为x。 jmp -2意味着jmp指令的无限循环
11. jcc x:当条件满足时跳转到x
12. cmp x1, x2: 用于比较两个操作数的大小
13. test x1, x2:通过计算两个操作数的逻辑与位运算实现比较操作,根据结果设置eflags
14. AND x1,x2: x1 = x1&x2
15. OR x1,x2: x1 = x1|x2
16. XOR x1,x2: x1 = x1^x2 常用于清零,效率高xor eax eax
17. not x1: x1 = ~x1
18. SHL x1,x2:x1=x1<<x2逻辑左移,右边补0, SAL:算术左移
19. SHR x1,x2:x1=x1>>x2 逻辑右移,左边补0, SAR:算术右移,左边补符号
20. IMUL/MUL: imul实现有符号数的乘法运算,mul是无符号乘法
imul r/m32 eax=eax*r/m*32
imul reg,r/m reg=reg*r/m32
imul reg,r/m32,immediate reg=r/m32*immediate
21. IDIV/DIV: div用于实现无符号数的除法运算
idiv ecx: eax / ecx 商放在eax,余数放在edx
div ax, r/m8 ; ax 除以 r/m8, al是商,ah是余数
div eax,r/m32; eax除以r/m32,eax是商,edx是余数
若被除数是32位数,在指令执行前edx被置为0
22. REP STOS; rep是前缀,表示重复执行某项操作
23. REP MOVS:重复执行movs操作
24. LEAVE: 用于子函数推出时清理栈的操作,ret和leave选择取决于编译器。 等价于mov esp, ebp; pop ebp
10、
11、
22、
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QTW0rDty-1681098950742)(./…/AppData/Roaming/Typora/typora-user-images/image-20221109195726769.png)]