c - 标签作为内联汇编宏中的值

标签 c assembly x86 arm inline-assembly

我想知道如何在内联汇编中加载带有标签值的寄存器。

我天真地尝试以这种方式这样做:

#define inline_macro(a) \
    asm volatile("1: movw %[rega], #:lower16:1b\n" \
                 "   movt %[rega], #:upper16:1b\n" \
                 : [rega] "+r" (a)       \
                 :                       \
                 :                       \
    );

int main(void){
    register int   i     asm("r2");
    register void* value asm("r1");
    i++;
    i += 2;
    inline_macro(value);
    return i;
}

但是,对象转储显示正在生成此汇编代码:

00000000 <main>:
   0:   e52db004    push    {fp}        ; (str fp, [sp, #-4]!)
   4:   e28db000    add fp, sp, #0
   8:   e1a03002    mov r3, r2
   c:   e2833001    add r3, r3, #1
  10:   e1a02003    mov r2, r3
  14:   e1a03002    mov r3, r2
  18:   e2833002    add r3, r3, #2
  1c:   e1a02003    mov r2, r3

00000020 <.L11>:
  20:   e3001000    movw    r1, #0
  24:   e3401000    movt    r1, #0
  28:   e1a03002    mov r3, r2
  2c:   e1a00003    mov r0, r3
  30:   e24bd000    sub sp, fp, #0
  34:   e49db004    pop {fp}        ; (ldr fp, [sp], #4)
  38:   e12fff1e    bx  lr

我想要的是将值 0x20 加载到寄存器 r1 中。

最佳答案

实际上有一条完整的指令用于将标签的地址放入寄存器:ADR .

由于它在 PC 上通过算术工作,因此它完全与位置无关,并且没有无限的范围,但这似乎都不是问题 - 利用汇编器的“当前指令”伪标签 ,问题中的例子就变成:

#define inline_macro(a) \
    asm volatile("adr %[rega], . \n"     \
                 : [rega] "=r" (a)       \
                 :                       \
                 :                       \
    );

关于c - 标签作为内联汇编宏中的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32021551/

相关文章:

c - 如何在使用 SDL2 的程序中查找 valgrind 检测到的内存错误的原因

assembly - 汇编器字符输出

windows - PE文件操作码

x86 - 寻求帮助解决 D 程序中的内联汇编问题

Android NDK C 预处理器为 TARGET_PLATFORM 定义

c - 打印数组时的额外值(从 %s 转换为 %c)

c++ - 分区和mbr恢复

gcc - 32 位 GCC C 程序中的内联 64 位汇编

组装事业部

c - 替换数组中的数据时出现问题