循环 字符串指令和寻址方式
循环
XOR ECX,ECX
MOV ECX,15H
LABEL:
DEC ECX
CMP ECX,0
JNE LABEL
LOOP
- 重复循环,直到计数器的值为0,每次循环将计数器的值减1,如果计数器为0就跳转到指定地址,比如loop short 401007。
LOOPZ,LOOPE
- 重复循环,直到零标志位Z被置为1。
LOOPNZ,LOOPNE
-
重复循环,直到零标志位被置为0。
-
LOOPZ, LOOPNZ指令还需要检查零标志位,只有计数器的值和零标志位Z都满足条件时才会循环。
串操作
MOVS
- 从一个地址向另一个地址复制数据,源地址保存在ESI寄存器中,目的地址保存在EDI寄存器中。
- 拷贝4个字节的内容时,还可以写为MOVSD,拷贝两个字节的内容时可以写为MOVSW,拷贝一个字节的内容时可以写为MOVSB。
- MOVS指令不能将数据拷贝到没有写入权限的内存单元中,强制写入的话会引发异常。
REP
- 可以作为一些指令的前缀,尤其MOVS指令,该前缀表示当前指令需要执行的次数ECX,每次循环计数器ECX的值递减1,和循环一样。
- REP MOVS则不一定拷贝4个字节的内容,它拷贝的大小是 每次拷贝的大小乘上计数器ECX。
LODS
- 该指令是从源地址拷贝数据到EAX中
- REP也可以搭配LODS指令配合使用,重复执行直到计数器ECX的值为0。
- 一次拷贝两个字节的内容的指令为LODSW,一次拷贝一个字节的内容的指令为LODSB。
STOS
- 该指令是将EAX的值拷贝到寄存器EDI指向的内存单元中。
- 该指令也可以搭配REP使用
- 每次操作两个字节的STOSW指令和每次操作一个字节的STOSB指令。
CMPS
- 该指令是比较ESI和EDI指向内存单元的内容。
- 该指令执行的是算数减法的运算,如果差值为0,零标志位Z会被置为1。
- 由于该指令影响零标志位Z,所以可以搭配REPZ/REPE前缀指令来使用,直到计数器ECX的值为0或者零标志位被清0。
- REPNZ/REPNE也可以搭配该指令使用。
寻址方式
直接寻址
-
最简单的一种寻址方式,该指令的操作数包含一个具体的地址。
MOV DWORD PTR [00513450], ECX MOV AX, WORD PTR [00510A25] MOV AL, BYTE PTR [00402811] CALL 452200 JMP 421000
间接寻址
-
许多程序使用间接寻址来完成一些复杂的操作,在刚开始分析调试的时候真实地址并不会显示出来,直到执行到这条指令时,查看相应寄存器的值才能知道真实的地址。
-
如果想在指令执行之前看到真实的地址,需要在该指令上下断点,断下来以后查看寄存器的值或者查看解释窗口中的提示信息。
MOV DWORD PTR[EAX], ECX CALL EAX JMP [EAX+4]