【问题标题】:How to declare a define in ARM assembly and use it?如何在 ARM 程序集中声明一个定义并使用它?
【发布时间】:2013-07-09 16:37:18
【问题描述】:

我正在尝试使用icachetest,其中有一个名为icache.s 的文件包含:

#define LOOP \
        subs    r2, r2, #1             ; \ 
        mov     r0, r0                 ; \
        mov     r0, r0                 ; \ 
        mov     r0, r0                 ; \
        mov     r0, r0                 ; \
        mov     r0, r0                 ; \
        beq     end_loop               ; \
        mov     r0, r0                 ; \

我正在使用arm-eabi-as 编译这个项目,但我得到了这个错误:

  AS     icache.S
icache.S: Assembler messages:
icache.S:16: Error: junk at end of line, first unrecognized character is `\'
icache.S:17: Error: junk at end of line, first unrecognized character is `\'
icache.S:18: Error: junk at end of line, first unrecognized character is `\'
icache.S:19: Error: junk at end of line, first unrecognized character is `\'
icache.S:20: Error: junk at end of line, first unrecognized character is `\'
icache.S:21: Error: junk at end of line, first unrecognized character is `\'
icache.S:22: Error: junk at end of line, first unrecognized character is `\'
icache.S:23: Error: junk at end of line, first unrecognized character is `\'
icache.S:52: Error: bad instruction `loop LOOP LOOP LOOP LOOP LOOP LOOP LOOP LOOP LOOP LOOP LOOP LOOP LOOP LOOP LOOP'
icache.S:53: Error: bad instruction `loop LOOP LOOP LOOP LOOP LOOP LOOP LOOP LOOP LOOP LOOP LOOP LOOP LOOP LOOP LOOP'
icache.S:54: Error: bad instruction `loop LOOP LOOP LOOP LOOP LOOP LOOP LOOP LOOP LOOP LOOP LOOP LOOP LOOP LOOP LOOP'

【问题讨论】:

  • 您不应该使用as - 只需要使用gcc 以便调用预处理器,例如gcc -Wall icache.S ....
  • as 是汇编程序,干净的汇编将与 as 一起正常组装。如果您在程序集中尝试使用 C 代码进行一些混合语言的操作,那么您需要在 gcc 调用之前使用 C 预处理器。基本上你不会在 asm 中使用定义,而是使用宏。
  • @PaulR 将gcc -Wall 运行为as 好吗?
  • 是的,这就是重点——如果您使用 gcc 作为驱动程序,那么它会负责预处理(以及其他各种事情)并将预处理的 asm 源传递给as

标签: gcc assembly arm


【解决方案1】:

正如其他人指出的那样,LOOP 是一个 C 宏。由于它没有参数或条件,因此很容易用gas 宏替换。

.macro  LOOP
    subs    r2, r2, #1
    mov     r0, r0
    mov     r0, r0
    mov     r0, r0
    mov     r0, r0
    mov     r0, r0
    beq     end_loop
    mov     r0, r0
.endm

在此之后它的行为与#define 相同,但需要注意的是每行只允许一个。 ARM 汇编器确实允许一行中有多个操作码(据我所知)。

您可以使用.rept 重复宏。

.rept 2048
   LOOP
.endr

【讨论】:

  • 查看类似内容:Macros using gasGAS macro docs
  • 如何调用 LOOP 宏?
  • 你应该只需要LOOP。您可能需要在源中使用 '\r\n'。我不知道你是否可以在一行中有多个宏调用
  • 是的,你是对的,但是否可以编写宏运行循环 2048 次而不是编写 2048 行?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-29
  • 1970-01-01
相关资源
最近更新 更多