簡體   English   中英

在Arm組件中使用C中聲明的全局變量

[英]Using global variables declared in C, in Arm assembly

我有一個聲明全局變量的C文件。 此文件將與一些ARM程序集文件一起編譯。

int foo;

void call_asm(void);

int main(void) {
    call_asm();
    return foo;
}
call_asm:
    ...

我嘗試使用arm信息中心鏈接,但編譯器( arm-linux-gnueabi-gcc )告訴我“import”是一個未定義的指令。

我可以簡單地做一些事情:

LDR    r0, =GLOBAL_VAR

如何在程序集中使用C文件中定義的全局變量?

一旦你問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.

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