簡體   English   中英

從 C 訪問內聯匯編器中定義的數組

[英]Access array defined in inline assembler from C

我在匯編程序中聲明了一個整數,我在 C 中按以下方式使用它:

asm(
            "number:    \n"
            ".long 0xFFFFFFFF \n
);

extern int number;
int main(){
    //do something with number
}

現在我想在匯編程序中聲明一個 32 字節的數組。 我嘗試了以下方法:

asm(
            "number:    \n"
            ".long 0xFFFFFFFF \n"
            ".long 0xFFFFFFFF \n"
            ".long 0xFFFFFFFF \n"
            ".long 0xFFFFFFFF \n"
            ".long 0xFFFFFFFF \n"
            ".long 0xFFFFFFFF \n"
            ".long 0xFFFFFFFF \n"
            ".long 0xFFFFFFFF \n"
);

extern unsigned char* number;
int main() {
    printf("%x ", number[0]); //gives segmentation fault
}

我不太了解匯編程序,但我必須使用這個特定的變量。

您的內聯匯編器執行此操作

asm(
            "number:    \n"
            ".long 0xFFFFFFFF \n"
            [snip rest of array]
);

然后你告訴C這個數字

extern unsigned char* number;

這表示該數字是指向無符號字符的指針。 然后你像這樣訪問它:

printf("%x ", number[0]);

這表示取消引用number 中的指針並返回第一個字符。 這將與執行相同:

printf("%x ", *(number+0));

問題是數字被定義為一個指針。 假設 32 位指針轉換為:

*(0xFFFFFFFF+0)

如果出現段錯誤,可能是因為您的程序無法訪問地址 0xFFFFFFFF。

您可以將extern語句更改為:

extern unsigned char number[32];

現在number是一個包含 32 個無符號字符的數組。 我傾向於使用inttypes.h標頭並將其聲明為:

extern uint8_t number[32];

uint8_t保證為 8 位(或 1 個字節)。 另一方面, char被定義為最少 8 位(但可以更多)。 但是sizeof(char)將始終返回 1。我更喜歡uint8_t (無符號 8 位整數),這樣您就知道您正在處理 8 位值,這里似乎就是這種情況。 我將代碼修改為:

#include <stdio.h>
#include <inttypes.h>

__asm__(
            "number:    \n"
            ".long 0xFFFFFFFF \n"
            ".long 0xFFFFFFFE \n"
            ".long 0xFFFFFFFF \n"
            ".long 0xFFFFFFFF \n"
            ".long 0xFFFFFFFF \n"
            ".long 0xFFFFFFFF \n"
            ".long 0xFFFFFFFF \n"
            ".long 0xFFFFFFFF \n"
);

extern uint8_t number[32];

int main() {
    printf("%x ", number[0]);
    return 0;
}

另請注意,如果您打算使用 GCC 作為 C99 進行編譯(也適用於 GCC 的 C89),最好使用__asm__而不是asm因為 GCC 的默認值是在使用-std=c99時禁用asm關鍵字(除非被-fasm覆蓋) -std=c99選項。

number可能不是一個無符號字符數組的好名字。 當有人必須出現並維護您的代碼時,這可能會引起混亂。

暫無
暫無

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

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