手机版
你好,游客 登录 注册
背景:
阅读新闻

C语言中通过全局变量引用汇编语言中的全局标签

[日期:2017-01-19] 来源:Linux社区  作者:smstong [字体: ]

汇编语言和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混合编程造成了一定的混淆。

本文永久更新链接地址http://www.linuxidc.com/Linux/2017-01/139718.htm

linux
相关资讯       C语言变量  C语言全局变量 
本文评论   查看全部评论 (0)
表情: 表情 姓名: 字数

       

评论声明
  • 尊重网上道德,遵守中华人民共和国的各项有关法律法规
  • 承担一切因您的行为而直接或间接导致的民事或刑事法律责任
  • 本站管理人员有权保留或删除其管辖留言中的任意内容
  • 本站有权在网站内转载或引用您的评论
  • 参与本评论即表明您已经阅读并接受上述条款