将寄存器的值传递给宏

时间:2017-01-09 09:54:37

标签: assembly arm

我正在为学校开发一个装配程序,而且我遇到了一个问题"。

我的老师给了我一个已编码的宏WAIT(我不能修改)有这个主体:

.macro WAIT delay
     LDR r0, =\delay
     @ code
.endm

所以我明白我要传递一个(即0xCAFE)。

由于我不喜欢代码冗余,我想在一个函数中调用此宏,该函数将寄存器r1作为传递给WAIT宏的延迟。

我有什么方法可以做到:WAIT value(r1)

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

假设这是一个类似ARM的处理器,并且代码/文字没有放在只读内存中,可能会变得聪明并使用强制使用文字的WAIT宏实例:

        LDR     R0, =\delay

例如delay == 0x55555555,在内存中生成一个常量,使指令

        LDR     R0,[PC + offset]

例如,假设这是文字用于LDR RX,= literal的唯一实例,那么这可能有效:

        ;       ...
        LEA     R2,delay0
        STR     R1,[R2]
        WAIT    =0x55555555      ;force a literal at delay0
        ;       ...
delay0                           ;address of literal 0x55555555
        LTORG

正如原始问题中所评论的那样,最好创建一个新的宏。宏内联实现也可能使其非常精确。