MASM 重复汇编

其实重复汇编也属于宏结构,本文应该可以说是上面前一篇文章的另一部分。

程序中有时要连续重复一段相同或基本相同的语句,这时可以使用重复汇编来完成。重复汇编一样是在编译前进行展开的。重复汇编伪指令有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
原文地址:https://www.cnblogs.com/galano/p/8721429.html