【问题标题】:Create a for loop in MASM with a variable to create distinct PROC functions在 MASM 中创建一个带有变量的 for 循环以创建不同的 PROC 函数
【发布时间】:2022-10-17 23:40:00
【问题描述】:

我正在尝试创建一组基于“for循环”计数器的过程。 MASM 似乎没有传统的 for-next 类型循环,因此我尝试使用变量和 REPT。

例如:

ix = 0
rept 2
    foo_&ix& proc
        mov rax, ix
        ret
    foo_&ix& endp
    ix = ix + 1
endm

...

; call the generated procs
call foo_0
call foo_1

然而 ml64.exe 返回error A2008: syntax error : foo_,所以它好像没有使用该变量。

我假设我没有正确定义和使用变量。常量是用ix equ 0 创建的,但这些似乎无法更改。

【问题讨论】:

  • 我认为您将不得不使用TEXTEQU 之类的东西将字符串等同于常量值ix,然后使用 % (表达式运算符)来生成需要文本替换的行。您也可以使用 CATSTR。已经有一段时间了,但我认为您可以执行以下操作:pastebin.com/86rwSgWt。一些可能有用的额外信息在这里:masm32.com/board/index.php?topic=5703.0。在我的示例中,我在ix$ 的末尾使用$ 来表示string,这只是我使用的约定,所以我知道它是一个字符串值。
  • 谢谢,遗憾的是这个例子没有骰子。我整天都在搜索 masm32.org!
  • 用那个例子你会得到什么错误?不一样的A2008错误?除非您的代码中有其他干扰内容,否则它实际上应该可以工作。
  • 使用 @CATSTR 的版本也应该可以工作,看起来像:pastebin.com/E8mjx0cJ@CATSTR 会将多个字符串表达式连接成一个输出字符串。它也为PROC 语句构建foo_# 函数名称
  • 啊!这确实做到了。太好了,谢谢!

标签: assembly x86-64 intel masm


【解决方案1】:

从上面的 cmets 中,使用 CatStr:

.code
ix = 0
rept 2
    @CatStr(<foo_>, %ix, < proc>)
    mov rax, ix
    ret
    @CatStr(<foo_>, %ix, < endp>)
    ix = ix + 1
endm

...
 
; call the generated procs
    call foo_0
    call foo_1

所有功劳归功于@Micheal Petch

【讨论】:

    猜你喜欢
    • 2021-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多