其实重复汇编也属于宏结构,本文应该可以说是上面前一篇文章的另一部分。
程序中有时要连续重复一段相同或基本相同的语句,这时可以使用重复汇编来完成。重复汇编一样是在编译前进行展开的。重复汇编伪指令有3个:REPEAT/FOR/FORC,3条汇编伪指令的区别在于如何制定重复次数。
1.REPEAT
我们可以用重复汇编定义'0' - '9',请看以下示例程序:
option casemap:none include windows.inc include kernel32.inc include user32.inc includelib kernel32.lib includelib user32.lib asc = '9' .data szNums db asc repeat '9' - '0' asc = asc - 1 db asc endm db 0 .code Main proc invoke MessageBox,0,offset szNums,offset szNums,MB_OK invoke ExitProcess,0 Main endp _START: call Main end _START
2.FOR
FOR伪指令按照实参表个数进行重复汇编,实参用<>括起来,并用,分割。比如,我们可以不使用pushad,而换一种方式压入所有寄存器。
源代码如下:
FOR reg32,<eax,ebx,ecx,edx,edi,esi,ebp> push reg32 ENDM
3.FORC
FORC伪指令按字符串字符个数重复汇编。字符串可以用<>括起来,也可以不括,按照从左到右的顺序,每一次重复用一个字符替换形参。比如,我们可以写一段代码把一串10进制数字转换为字符串类型。
.386 .model flat,stdcall option casemap:none include windows.inc include kernel32.inc include user32.inc includelib kernel32.lib includelib user32.lib .data szBuf db 256 dup(0) .code Main proc mov esi,offset szBuf FORC num,<0123456789> mov byte ptr[esi],num add byte ptr[esi],'0' - 0 inc esi ENDM invoke MessageBox,0,offset szBuf,offset szBuf,MB_OK invoke ExitProcess,0 Main endp _START: call Main end _START