歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

C語言中通過全局變量引用匯編語言中的全局標簽

匯編語言和C語言混合編程中,在C語言中通過全局變量來引用匯編中的數據定義非常普遍,然而卻存在同名不同義的陷阱。

1 測試代碼

在匯編語言中的定義整數變量studentID,並賦初值,如下:

    .global studentID
    .data
studentID:
    .word 12345678

    .text
    ldr r0, =studentID  /* studentID被當做內存地址 */
    ldr r0, [r0]        /* 執行後,r0=12345678 */

假設鏈接後,studentID所代表地址為0x30000000。

在C語言中引用studentID,如下:

extern int studentID;   /* studentID被當做標簽studentID內存地址處的值 */
printf("%d\n", studentID); /* 會打印出12345678 */
printf("%p\n", &studentID); /* 會打印studentID標簽代表的地址0x30000000 */

2 注意事項

需要注意:
(1)字符串“studentID”,在匯編語言中代表其所在的內存地址,即常數0x30000000。可以理解為:

studentID = 0x30000000

(2)同樣的字符串“stdentID”,在C語言中則表示0x30000000內存地址處存放的數據(值)。要想取得內存地址,則需要使用“&studentID”。可以理解為:

studentID = 12345678;
&studentID = 0x30000000;

顯然C語言提高了抽象層次,同時也造成了同一個名字在不同語言中所代表的含義的不同,給匯編和C混合編程造成了一定的混淆。

Copyright © Linux教程網 All Rights Reserved