[英]Difference between global variables and variables declared in main in ARM C
[英]Using global variables declared in C, in Arm assembly
一旦你問gcc怎么做,這就變得非常簡單了。 例如,使用gcc -S -O3
編譯以下函數:
extern int foo;
void useFoo()
{
foo=7;
}
你會看到gcc如何實現它。
基於此,我設計了一個從C調用匯編函數來設置全局C變量的工作示例:
// test.c
#include <stdio.h>
void setupFoo();
int foo;
int main()
{
setupFoo();
printf("foo=%d\n", foo);
}
# test.s
.text
.global foo
.fooAddr:
.word foo
.global setupFoo
setupFoo:
ldr r0, .fooAddr
mov r1, #123
str r1, [r0]
bx lr
編譯和運行:
$ gcc test.c test.s -o test && ./test
foo=123
測試了gcc Raspbian 6.3.0-18 + rpi1。
上面的匯編代碼基於useFoo
示例的gcc輸出。 更簡單的方法是使用=foo
而不是手動將地址放入變量:
# test.s
.text
.global foo
.global setupFoo
setupFoo:
ldr r0, =foo
mov r1, #123
str r1, [r0]
bx lr
這將導致foo
的地址被匯編器放在函數定義之后。
我認為您需要將指令從ARM匯編程序轉換為GNU匯編程序。 如果我理解正確,您可以使用.global
指令而不是.import
訪問任何全局符號。 從使用為頁面:
.global 符號
.global使符號對ld可見。 如果在部分程序中定義符號 ,則其值可用於與其鏈接的其他部分程序。 否則, 符號從鏈接到同一程序的另一個文件中獲取同名符號的屬性。
.extern (symbol)
是你需要的
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.