[英]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.