【2020.11.14】常用汇编指令

  • 说明

  1. r:通用寄存器

  2. m:内存

  3. imm:立即数

  4. r8:8位通用寄存器

  5. r16:16位通用寄存器

  6. r32:32位通用寄存器

  7. m8:8位内存

  8. m16:16位内存

  9. m32:32位内存

  10. imm8:8位立即数

  11. imm16:16位立即数

  12. imm32:32位立即数

  • MOV:数据传送指令

MOV r/m8, r8
MOV r/m16, r16
MOV r/m32, r32
MOV r8, r/m8
MOV r16, r/m16
MOV r32, r/m32
MOV r8, imm8
MOV r16, imm16
MOV r32, imm32

  • ADD:加法指令

ADD r/m8, imm8
ADD r/m16, imm16
ADD r/m32, imm32
ADD r/m16, imm8
ADD r/m32, imm8
ADD r/m8, r8
ADD r/m16, r16
ADD r/m32, r32
ADD r8, r/m8
ADD r16, r/m16
ADD r32, r/m32

  • SUB:减法指令

SUB r/m8, imm8
SUB r/m16, imm16
SUB r/m32, imm32
SUB r/m16, imm8
SUB r/m32, imm8
SUB r/m8, r8
SUB r/m16, r16
SUB r/m32, r32
SUB r8, r/m8
SUB r16, r/m16
SUB r32, r/m32

  • AND:与运算指令

  • 两个位都为1时,结果才为1。

AND r/m8, imm8
AND r/m16, imm16
AND r/m32, imm32
AND r/m16, imm8
AND r/m32, imm8
AND r/m8, r8
AND r/m16, r16
AND r/m32, r32
AND r8, r/m8
AND r16, r/m16
AND r32, r/m32

  • OR:或运算指令

  • 当一个位为1时,结果才为1。

OR r/m8, imm8
OR r/m16, imm16
OR r/m32, imm32
OR r/m16, imm8
OR r/m32, imm8
OR r/m8, r8
OR r/m16, r16
OR r/m32, r32
OR r8, r/m8
OR r16, r/m16
OR r32, r/m32

  • XOR:异或运算指令

  • 两个位不一样时,结果才为1。

XOR r/m8, imm8
XOR r/m16, imm16
XOR r/m32, imm32
XOR r/m16, imm8
XOR r/m32, imm8
XOR r/m8, r8
XOR r/m16, r16
XOR r/m32, r32
XOR r8, r/m8
XOR r16, r/m16
XOR r32, r/m32

  • NOT:非运算指令

  • 位为1时,结果为0,位为0时,结果为1。

  • 1就是0,0就是1,也就是取反。

NOT r/m8
NOT r/m16
NOT r/m32

  • MOVS:数据传送指令(内存<->内存)

  • BYTE/WORD/DWORD

MOVS BYTE PTR ES:[EDI], BYTE PTR DS:[ESI]    //简写为:MOVSB
MOVS WORD PTR ES:[EDI], WORD PTR DS:[ESI]    //简写为:MOVSW
MOVS DWORD PTR ES:[EDI], DWORD PTR DS:[ESI]    //简写为:MOVSD

  • ESI、EDI寄存器:

当需要把数据从内存复制到内存时使用,这两个寄存器在MOVS指令中是指定的。使用MOVS指令时,默认使用的就是ESI和EDI寄存器。
注意:使用MOVS指令,ESI、EDI寄存器的值执行完成后会自增。

例:
MOV EDI, 0x12FFD8
MOV ESI, 0x12FFD0
MOVS DWORD PTR ES:[EDI], DWORD PTR DS:[ESI]    //观察EDI的值

修改标志寄存器中D位的值,然后再执行下面的指令:
MOV EDI, 0x12FFD8
MOV ESI, 0x12FFD0

  • 标志寄存器:EFL

null
例如当前标志寄存器EFL的值为00000246,将其转换为二进制:
0000 0000 0000 0000 0000 0010 0100 0110
它的第十位(从右往左数)叫做DF位(方向位)。
如果DF位为0时,当使用MOVS指令,ESI与EDI寄存器的值都会自增(取决于是操作BYTE、WORD还是DWORD)。
如果DF位为1时,当使用MOVS指令,ESI与EDI寄存器的值都会自减(取决于是操作BYTE、WORD还是DWORD)。

  • 标志位

  • 这些标志位是EFL标志寄存器的二进制被OD单独拿出来表示了

null

  • STOS:将AL/AX/EAX的值储存到[EDI]指定的内存单元

  • 使用STOS指令后EDI的值也会自动变化:
    自增自减取决于DF位,自增自减的值取决于是操作BYTE、WORD还是DWORD。

STOS BYTE PTR ES:[EDI]        //简写为:STOSB
STOS WORD PTR ES:[EDI]        //简写为:STOSW
STOS DWORD PTR ES:[EDI]        //简写为:STOSD

MOV EAX, 0x12345678        //观察EDI的值
MOV EDI, 0x12FFC4
STOS BYTE PTR ES:[EDI]
STOS WORD PTR ES:[EDI]
STOS DWORD PTR ES:[EDI]

修改标志寄存器中D位的值,然后再执行下面的指令:
MOV EAX, 0x12345678
MOV EDI, 0x12FFC4
STOS BYTE PTR ES:[EDI]        //观察EDI的值
STOS WORD PTR ES:[EDI]
STOS DWORD PTR ES:[EDI]

  • REP:循环指令

  • 该指令循环执行次数取决于ECX寄存器中的值。

MOV ECX,0xA    //循环执行10次,每循环1次,ECX寄存器的值减1
REP MOVSD
REP STOSD

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值