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混合编程造成了一定的混淆。
相关推荐
Emiter0 2020-06-28
风月无古今 2020-06-28
andyljn 2020-06-13
李辉 2020-06-08
风月无古今 2020-06-06
duling 2020-06-03
PLA 2020-05-25
风月无古今 2020-05-15
duling 2020-05-15
Emiter0 2020-05-10
Emiter0 2020-05-09
andyljn 2020-05-06
shunelly 2020-05-05
Emiter0 2020-04-30
李辉 2020-04-30
李辉 2020-04-25
李辉 2020-04-07
andyljn 2020-03-27
Emiter0 2020-03-08