MOVS,STOS和REP

MOVS 移动数据

  • 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

注意:

  • 执行MOVS后,ESIEDI会根据数据宽度变化,增加或减少由方向标志DF决定,为0时增加,为1时减少。

例:

MOV EDI,0x12FFD8
MOV ESI,0x12FFD0
MOVS DWORD PTR ES:[EDI],DWORD PTR DS:[ESI]	;注意观察EDI的值
MOVS DWORD PTR ES:[EDI],DWORD PTR DS:[ESI]
MOVS DWORD PTR ES:[EDI],DWORD PTR DS:[ESI]
MOVS DWORD PTR ES:[EDI],DWORD PTR DS:[ESI]
MOVS DWORD PTR ES:[EDI],DWORD PTR DS:[ESI]

;修改DF后,执行下列指令,观察EDI的值
MOV EDI,0x12FFD8
MOV ESI,0x12FFD0
MOVS DWORD PTR ES:[EDI],DWORD PTR DS:[ESI]	;注意观察EDI的值
MOVS DWORD PTR ES:[EDI],DWORD PTR DS:[ESI]
MOVS DWORD PTR ES:[EDI],DWORD PTR DS:[ESI]
MOVS DWORD PTR ES:[EDI],DWORD PTR DS:[ESI]
MOVS DWORD PTR ES:[EDI],DWORD PTR DS:[ESI]

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

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

注意:

  • 执行STOS后,EDI会根据数据宽度变化,增加或减少由方向标志DF决定,为0时增加,为1时减少。

例:

MOV EAX,0X12345678
MOV EDI,12FFC4
STOS BYTE PTR ES:[EDI]	;注意观察EDI的值
STOS WORD PTR ES:[EDI]
STOS DWORD PTR ES:[EDI]

;修改DF后,执行下列指令,观察EDI的值
MOV EAX,0X12345678
MOV EDI,12FFC4
STOS BYTE PTR ES:[EDI]	;注意观察EDI的值
STOS WORD PTR ES:[EDI]
STOS DWORD PTR ES:[EDI]

REP指令

按计数寄存器 (ECX) 中指定的次数重复执行字符串指令

例:

MOV ECX,10
REP MOVSD
REP STOSD