【问题标题】:How do I write a macro to repeat something up to a specific address?如何编写一个宏来重复某个特定地址的内容?
【发布时间】:2020-03-20 05:03:01
【问题描述】:

The .org directive 将位置计数器前进到指定的偏移量,并用指定的值填充额外的字节。

.org 123, 1 @ Pads 1s until we reach address 123.

我想编写一个宏来做类似的事情,但使用更复杂的“填充”。喜欢:

@ Pads some_special_symbol until we reach address new_lc.
.macro my_pad new_lc
.if . < \new_lc
    .4byte some_special_symbol
    my_pad \new_lc
.endif
.endm

GAS 抱怨这种实现是因为 the .if directive requires an absolute expressionthe dot symbol 显然不是绝对的。

<instantiation>:2:5: error: expected absolute expression
.if . < 10
    ^

到目前为止,我发现的唯一解决方法是更改​​宏的接口以进行重复计数,而不是结束地址。有没有更好的办法?

【问题讨论】:

  • .fill can take a 4 byte constant too 但也许这和.if 有同样的问题。编辑:是的。
  • .和某个符号之间的距离。
  • @fuz 你有完整的例子吗?
  • @Maxpm 现在懒得写了。基本上,如果两个符号在同一节中,则它们的差异是一个常数,可以用于此目的。将一个符号放在该部分的开头,另一个符号为.。请注意,这仅允许您找到与此文件中部分开头的差异,这可能不是链接后的整体开头。

标签: assembly macros gnu-assembler


【解决方案1】:

基于comment of @fuz

.macro my_pad new_lc
.if . - base < \new_lc
    .4byte 0xdeadbeef
    my_pad \new_lc
.endif
.endm

.data
base:
my_pad 100

对于常量,宏也可以使用.fill \new_lc-(.-base), 4, 0xdeadbeef 实现,无需递归。

【讨论】:

    猜你喜欢
    • 2012-10-11
    • 2016-04-11
    • 1970-01-01
    • 2015-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-06
    • 1970-01-01
    相关资源
    最近更新 更多