在 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 語言提高了抽象層次,也造成了同一個符號在不同語言中代表不同的含義。使用時務必小心,以防混淆。
【完】
相關文章
- 【C++】為什麼不能定義陣列的引用,卻可定義變數的引用C++陣列變數
- 深入瞭解C語言(區域性變數的定義) (轉)C語言變數
- 第四節 go 語言變數定義Go變數
- Linux下變數的定義及引用Linux變數
- C語言(巨集定義)C語言
- c 語言中巨集定義和定義全域性變數的區別變數
- c語言的定義與宣告C語言
- C語言巨集定義中#define中的井號#的使用C語言
- 三分鐘學會go語言的變數定義Go變數
- 複習PHP-語言參考-預定義變數PHP變數
- C++教程-----C++變數型別和變數的定義C++變數型別
- c+++變數宣告和定義C++變數
- c語言函式指標的定義C語言函式指標
- lua語法-變數的定義與使用變數
- C語言sizeof()變數、字元、字串C語言變數字元字串
- ABAP 程式語言裡的 Reference Semantic - 引用語義
- 第3天:定義語言編碼(轉)
- 在程式中定義多個同值不同名的變數變數
- MySQL中變數的定義和變數的賦值使用MySql變數賦值
- C# WebForm定義全域性變數C#WebORM變數
- C++11 中的右值引用與轉移語義C++
- C語言的本質(32)——C語言與彙編之C語言內聯彙編C語言
- C語言可變引數詳解C語言
- C語言裡全域性變數管理C語言變數
- c語言if語句是如何變成彙編程式碼的?C語言
- [C++]變數宣告與定義的規則C++變數
- 在blade中定義一個可以被模版使用的變數變數
- 有關C語言的知識---巨集定義用法C語言
- JavaScript中的安全變數引用JavaScript變數
- JavaScript中是如何定義私有變數的JavaScript變數
- C語言的本質(38)——makefile之變數C語言變數
- 學會在 C++ 中使用變數:從定義到實踐C++變數
- angular中定義全域性變數及全域性變數的使用Angular變數
- 微控制器-C語言-定義和申明C語言
- C/C++語言巨集定義##連線符和符#的使用C++
- maven中properties標籤定義變數Maven變數
- C語言學習筆記之變數C語言筆記變數
- C語言-變數常量資料型別C語言變數資料型別