日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

在 C 中引用汇编语言定义的 .globl 变量

發布時間:2025/3/15 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 在 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 語言提高了抽象層次,也造成了同一個符號在不同語言中代表不同的含義。使用時務必小心,以防混淆。
  • 【完】


    參考資料
    https://blog.csdn.net/smstong/article/details/54405649

    總結

    以上是生活随笔為你收集整理的在 C 中引用汇编语言定义的 .globl 变量的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。