【问题标题】:Writing a nasm loop over tokens在令牌上编写 nasm 循环
【发布时间】:2018-09-18 17:16:48
【问题描述】:

我想写一个基于 N 个标记列表的 nasm 循环,其中某个变量依次获取每个标记的值。

类似:

%for reg in {rax, rbx, rcx, rdx, rsi, rdi}
push reg
%endfor

生成:

push rax
push rbx
...
push rdi

当然,%for 实际上并不存在:它只是一个虚构的伪指令,显示我想要什么。有什么方法可以相对优雅地做到这一点?

【问题讨论】:

  • @tkausl - 好的,谢谢。我认为这不允许我“就地”编写这样一个循环:我会将每个循环的特定代码提取到一个宏中(例如,一个特定于 push 的宏),然后用我想要的任何参数列表调用它对吧?
  • 正确。您甚至可以编写另一个第二个宏 %pusha,例如,用所有寄存器调用 %push,这样您就不需要每次都手动列出它们,基本上模仿 x64 的 pushad 指令。

标签: assembly x86 nasm


【解决方案1】:

我在 NASM 中遇到过类似的任务,现在我在我 19 岁的宏库中找到了它:

;   PUSH   multiple operands
%MACRO PUSH 1-*
    %REP %0
      PUSH %1
      %ROTATE 1
    %ENDREP
%ENDMACRO

您在上面引用的语法几乎与 €ASM 相同:

reg %for rax, rbx, rcx, rdx, rsi, rdi
      push %reg
    %endfor

但在 PUSH/POP 的情况下,不必使用宏实现多个操作数 因为它是语言内置的:https://euroassembler.eu/eadoc/#InsEnhMultipleOperands

【讨论】:

  • 对,但问题是宏硬核了push 指令。我的问题不是如何专门编写这个push 循环,而是如何为任意“主体”编写循环(在这种情况下恰好是push)。也许有一种方法可以将主体传递给宏?
  • 事先创建宏Body,将硬连线的PUSH %1替换为Body %1
  • 谢谢!这可以通过重复重新定义 Body 宏来重复,对吗?也就是说,如果我想对不同的body使用相同的循环,那么每次都定义Body宏吗?
猜你喜欢
  • 1970-01-01
  • 2020-06-13
  • 1970-01-01
  • 2013-03-01
  • 2015-07-08
  • 2012-02-19
  • 2021-09-15
  • 1970-01-01
  • 2020-10-01
相关资源
最近更新 更多