有32b CPU。为了使用64b变量,编译器分配2个寄存器,例如library(googleway)
map_key <- 'your_api_key'
google_map(key = map_key) %>%
add_overlay(north = 40.773941,south = 40.712216, east = -74.12544, west = -74.22655,
overlay_url = "https://www.lib.utexas.edu/maps/historical/newark_nj_1922.jpg")
是&#39; var64b_low&#39;并且r0
是&#39; var64b_high&#39;。
有没有办法知道在内联asm中为64b变量分配了哪些寄存器。我希望得到类似的东西:
r1
感谢。
PS:现在我把低和高的部分写回内存,但我想避免这些额外的节省/负担。
答案 0 :(得分:4)
引自this post to the gcc-help mailing list:
在ARM上,访问64位类型的修饰符是
- %LT; N&GT;一对中编号最小的寄存器
- %H一对中编号最大的寄存器
- %Q包含最不重要的寄存器 部分32位值
- %R包含最多的寄存器 32位值的重要部分
为什么这么多?那么这取决于你是否想要编译代码 正确适用于大端系统和小端系统。
该帖子包含一个例子:
int64_t a,b,r; asm( "adds %Q0, %Q1, %Q2" "\n\t" "adds %R0, %R1, %R2" "\n\t" "mov %R0, %R0, rrx" "\n\t" "mov %Q0, %Q0, rrx" : "=&r" (r) : "r" (a), "r" (b) : "cc" );
注意在变量&#39; r&#39;的约束中使用=&amp; r。这个 确保您的输入操作数在它们出现之前不会被破坏 已被完全阅读。
我没有设置ARM,所以我无法确认。然而,Richard Earnshaw(该帖子的作者)是gcc的ARM端口维护者,所以他可能知道他在说什么。
可能还值得一提的是(与x86 modifiers不同)这些ARM修饰符是未记录的,这通常意味着它们也不受支持。根据不支持的功能(对于任何产品)存在风险,请谨慎使用!