尝试在arm64架构中运行下面的内联汇编指令时出现编译错误。使用32位架构时可以正常工作。
存储指令将堆栈指针(sp)存储到变量stack_ptr。
unsigned long stack_ptr = 0;
__asm__ __volatile__("str sp, %[stack_ptr]"
:[stack_ptr]"=m" (stack_ptr) //output operand list
);
答案 0 :(得分:1)
在64位代码中,您不能在SP
指令中使用STR
作为操作数。引用documentation:
您只能在以下说明中使用SP作为操作数:
- 作为装载和存储的基本寄存器。在这种情况下,在添加任何偏移量或堆栈对齐之前,它必须是四字对齐的 异常发生。
- 作为算术指令的源或目标,但它不能用作设置指令的目标 条件标志。
- 在逻辑指令中,例如为了对齐它。
首先应将其复制到通用寄存器中,然后将其存储到内存中。
除非你需要一个真正精确的值,否则你可以使用普通的C并获取局部变量本身的地址来估计堆栈指针:
unsigned long stack_ptr = (unsigned long)&stack_ptr;