内联asm,为64b变量分配的32b cpu寄存器

时间:2017-06-28 00:49:40

标签: assembly arm inline-assembly

有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:现在我把低和高的部分写回内存,但我想避免这些额外的节省/负担。

1 个答案:

答案 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修饰符是未记录的,这通常意味着它们也不受支持。根据不支持的功能(对于任何产品)存在风险,请谨慎使用!