在 C 中引用匯編語言定義的 .globl 變數
緣起
在 Linux-0.11 中遇到了這種用法,所以想做個實驗以加深理解。
實驗程式碼
分為2個原始檔和1個Makefile.
a.s
.globl phone_num
.data
phone_num:
.word 0x1234
.word 0x5678
可以認為,phone_num是一個全域性變數,可以供其他檔案連結,phone_num的值是0x56781234.
b.c
#include <stdio.h>
extern unsigned int phone_num; //宣告a.s中的phone_num變數
int main(void)
{
printf("phone = 0x%x\n", phone_num);
printf("&phone_num = %p\n", &phone_num);
return 0;
}
Makefile
TGT =main
C_SRC = $(wildcard *.c)
ASM_SRC = $(wildcard *.s)
OBJ =$(patsubst %.c,%.o,$(C_SRC))
OBJ +=$(patsubst %.s,%.o,$(ASM_SRC))
CC =gcc
$(TGT): $(OBJ)
$(CC) -o $@ $^
clean:
$(RM) $(TGT) *.o
編譯與執行
編譯後生成可執行檔案main
執行main
,結果如下:
分析結果
可以看到,我們成功地在C程式中引用了a.s
裡面定義的符號(或者說變數)phone_num
.
注意:
1. phone_num
的地址是在連結後確定的。如果想檢視符號地址,可以用nm
命令。
nm main
- 識別符號
phone_num
,在組合語言中代表一個記憶體地址;但是在C語言中,則表示一個變數,讀寫這個變數時,表示讀寫記憶體地址 0x601038 處存放的資料值。 - 在C語言中,要想取得
phone_num
的記憶體地址,則需要使用表示式&phone_num
。 - 與組合語言相比,顯然 C 語言提高了抽象層次,也造成了同一個符號在不同語言中代表不同的含義。使用時務必小心,以防混淆。
【完】
相關文章
- 第四節 go 語言變數定義Go變數
- c 語言中巨集定義和定義全域性變數的區別變數
- c語言的定義與宣告C語言
- C語言巨集定義中#define中的井號#的使用C語言
- 三分鐘學會go語言的變數定義Go變數
- 複習PHP-語言參考-預定義變數PHP變數
- c語言函式指標的定義C語言函式指標
- C++教程-----C++變數型別和變數的定義C++變數型別
- c+++變數宣告和定義C++變數
- ABAP 程式語言裡的 Reference Semantic - 引用語義
- C語言sizeof()變數、字元、字串C語言變數字元字串
- lua語法-變數的定義與使用變數
- 在KEIL MDK中定義變數到固定地址變數
- c語言if語句是如何變成彙編程式碼的?C語言
- 在程式中定義多個同值不同名的變數變數
- [C++]變數宣告與定義的規則C++變數
- C語言可變引數詳解C語言
- MySQL中變數的定義和變數的賦值使用MySql變數賦值
- 微控制器-C語言-定義和申明C語言
- 學會在 C++ 中使用變數:從定義到實踐C++變數
- C語言基礎-2、函式的定義與使用C語言函式
- C++對C語言的擴充套件(1)--引用C++C語言套件
- 教你在 C 語言上編寫自己的協程
- 在 ISO C90 標準中 C 語言負數比正數大?
- JavaScript中是如何定義私有變數的JavaScript變數
- JavaScript中的安全變數引用JavaScript變數
- C語言-變數常量資料型別C語言變數資料型別
- C語言--靜態區域性變數C語言變數
- C語言學習筆記之變數C語言筆記變數
- C語言學習第18篇---巨集定義與使用 / 條件編譯使用分析C語言編譯
- maven中properties標籤定義變數Maven變數
- 變數的定義和使用變數
- C++類內成員變數可以定義引用型別嗎C++變數型別
- C語言怎麼實現可變引數C語言
- C語言指標(二) 指標變數 ----by xhxhC語言指標變數
- go語言變數Go變數
- C語言include關鍵字和引用.h .c的區別C語言
- c++中的變數型別_C ++中的變數C++變數型別