簡體   English   中英

如何在arm內聯匯編中訪問本地C變量?

[英]How do I access local C variable in arm inline assembly?

我想訪問內聯arm Assembly中C語言聲明的局部變量。 我怎么做?

可以像這樣訪問全局變量,

int temp = 0;
Function(){
    __asm(
       ".global temp\n\t"           
        "LDR R2, =temp\n\t"                                                     
        "LDR R2, [R2, #0]\n\t"
    );
}       

但是如何訪問局部變量? 我嘗試將“.global”更改為“.local”以獲取局部變量,但它生成了錯誤(未定義的引用“temp”)。 我使用的IDE是KEIL。

有什么想法嗎? 提前致謝。

根據海灣合作委員會文件: 6.45.2.3輸出操作數

您可以傳遞這樣的值:

#include <stdio.h>

int main(int argc, char *argv[]) {

  int src = 1;
  int dst;   

  asm ("mov %1, %0\n\t add $1, %0" : "=r" (dst) : "r" (src));

  printf("0x%X\n", dst);

  return 0;
}

在你的asm代碼之后你把':'字符和你要傳遞的值放在這樣: "(=|+)(r|m)" (variable) 在覆蓋值時使用'=' ,在讀取或覆蓋值時使用'+' ,如果值位於寄存器中,則使用'r'字母;如果值駐留在內存中,則使用'm'

r最小的可運行的例子

main.c中

#include <assert.h>
#include <inttypes.h>

int main(void) {
    uint64_t in0 = 1, in1 = 2, out;
    __asm__ (
        "add %[out], %[in0], %[in1];"
        : [out] "=r" (out)
        : [in0] "r"  (in0),
          [in1] "r"  (in1)
    );
    assert(in0 == 1);
    assert(in1 == 2);
    assert(out == 3);
}

GitHub上游

編譯並運行:

sudo apt-get install qemu-user gcc-aarch64-linux-gnu
aarch64-linux-gnu-gcc -std=c99 -ggdb3 -march=armv8-a -pedantic -Wall -Wextra -o main.out main.c
qemu-aarch64 -L /usr/aarch64-linux-gnu -E LD_BIND_NOW=1 main.out

拆卸:

gdb-multiarch -nh -batch -ex 'disassemble/rs main' add.out

輸出摘錄:

Dump of assembler code for function main:
add.c:
6   int main(void) {
   0x0000000000000764 <+0>: fd 7b bd a9 stp x29, x30, [sp, #-48]!
   0x0000000000000768 <+4>: fd 03 00 91 mov x29, sp

7       uint64_t in0 = 1, in1 = 2, out;
   0x000000000000076c <+8>: 20 00 80 d2 mov x0, #0x1                    // #1
   0x0000000000000770 <+12>:    e0 0f 00 f9 str x0, [sp, #24]
   0x0000000000000774 <+16>:    40 00 80 d2 mov x0, #0x2                    // #2
   0x0000000000000778 <+20>:    e0 13 00 f9 str x0, [sp, #32]

8       __asm__ (
   0x000000000000077c <+24>:    e0 0f 40 f9 ldr x0, [sp, #24]
   0x0000000000000780 <+28>:    e1 13 40 f9 ldr x1, [sp, #32]
   0x0000000000000784 <+32>:    00 00 01 8b add x0, x0, x1
   0x0000000000000788 <+36>:    e0 17 00 f9 str x0, [sp, #40]

9           "add %[out], %[in0], %[in1];"
10          : [out] "=r" (out)
11          : [in0] "r"  (in0),
12            [in1] "r"  (in1)
13      );

所以我們看到r轉換為堆棧sp相對str加載,這是局部變量存在的地方。

在Ubuntu 18.10,GCC 8.2.0,QEMU 2.12中測試。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM