【2015-02-11】《RealView编译工具开发指南》摘录: C和汇编语言互相调用 [历史归档]本文原发布于 cstriker1407.info 个人博客内容为历史存档仅供参考。发布时间2015-02-11 标题《RealView编译工具开发指南》摘录 C和汇编语言互相调用分类操作系统 / ARM 标签ARM《RealView编译工具开发指南》摘录 C和汇编语言互相调用备注4.2. 在汇编代码中访问 C 全局变量Example 4.1. 访问全局变量4.4. C、C 和 ARM 汇编语言交叉调用4.4.3. 语言交叉调用的示例在 C 中调用汇编语言在汇编语言中调用 C备注1 本部分文档摘录自ARM网站【 http://infocenter.arm.com/help/index.jsp?topic/com.arm.doc.dui0203ic/index.html 】,版权归属于ARM。2 作者只摘录了部分内容这里主要是C和汇编相互调用全面详细的内容清参考ARM网址。4.2. 在汇编代码中访问 C 全局变量全局变量只能通过地址间接访问。 要访问全局变量请使用 IMPORT 指令执行导入然后将地址加载到寄存器中。 根据变量的类型可以使用加载和存储指令来访问全局变量。例如对于 unsigned 变量LDRB/STRB 用于 charLDRH/STRH 用于 shortLDR/STR 用于 int对于 signed 变量请使用等效的有符号指令如 LDRSB 和 LDRSH。使用 LDM 和 STM 指令可以将少于 8 个字的小型结构作为整体进行访问。 可以使用适当类型的加载和存储指令来访问结构的单个成员。 为了访问成员必须知道该成员从结构起始地址算起的偏移量。Example 4.1 将整型全局变量 globvar 的地址加载到 R1将该地址中包含的值加载到 R0将它与 2 相加然后将新值存回 globvar 中。Example 4.1. 访问全局变量PRESERVE8 AREA globals,CODE,READONLY EXPORT asmsubroutine IMPORT globvar asmsubroutine LDR R1, globvar ; read address of globvar into R1 LDR R0, [R1] ; load value of globvar ADD R0, R0, #2 STR R0, [R1] ; store new value into globvar BX lr END4.4. C、C 和 ARM 汇编语言交叉调用本节提供一些示例帮助您在 C 中调用 C 和汇编语言代码以及在 C 和汇编语言中调用 C 代码 还介绍调用约定和数据类型。只要遵循 ARM 体系结构的过程调用标准 (AAPCS)就可以混合调用 C、C 和汇编语言例程。 有关详细信息请参阅 install_directory\Documentation\Specifications… 中的 AAPCS 规范 aapcs.pdf。4.4.3. 语言交叉调用的示例在 C 中调用汇编语言Example 4.4 和Example 4.5 介绍的 C 程序调用了汇编语言子例程将一个字符串复制到另一个字符串之前。Example 4.4. 在 C 中调用汇编语言#includestdio.hexternvoidstrcopy(char*d,constchar*s);intmain(){constchar*srcstrFirst string - source ;chardststr[]Second string - destination ;/* dststr is an array since we’re going to change it */printf(Before copying:);printf(%s%s ,srcstr,dststr);strcopy(dststr,srcstr);printf(After copying:);printf(%s%s ,srcstr,dststr);return(0);}Example 4.5. 汇编语言字符串复制子例程PRESERVE8 AREA SCopy, CODE, READONLY EXPORT strcopy strcopy ; R0 points to destination string. ; R1 points to source string. LDRB R2, [R1],#1 ; Load byte and update address. STRB R2, [R0],#1 ; Store byte and update address. CMP R2, #0 ; Check for null terminator. BNE strcopy ; Keep going if not. BX lr ; Return. ENDExample 4.4 位于示例目录 …\asm 中文件名为 strtest.c 和 scopy.s。请按以下步骤在命令行生成该示例键入 armasm --debug scopy.s 编译汇编语言源代码。键入 armcc -c --debug strtest.c 编译 C 源代码。键入 armlink strtest.o scopy.o -o strtest 链接对象代码。通过对相应调试目标使用兼容调试器来运行映像。在汇编语言中调用 CExample 4.6 和Example 4.7 演示如何在汇编语言中调用 C。Example 4.6. 定义 C 函数intg(inta,intb,intc,intd,inte){returnabcde;}Example 4.7. 汇编语言调用; int f(int i) { return g(i, 2*i, 3*i, 4*i, 5*i); } PRESERVE8 EXPORT f AREA f, CODE, READONLY IMPORT g ; i is in R0 STR lr, ! ; preserve lr ADD R1, R0, R0 ; compute 2*i (2nd param) ADD R2, R1, R0 ; compute 3*i (3rd param) ADD R3, R1, R2 ; compute 5*i STR R3, ! ; 5th param on stack ADD R3, R1, R1 ; compute 4*i (4th param) BL g ; branch to C function ADD sp, sp, #4 ; remove 5th param LDR pc, , #4 ; return END

相关新闻

最新新闻

肠道菌群:决定全身健康的隐形器官

肠道菌群:决定全身健康的隐形器官

肠道菌群:决定全身健康的隐形器官 关于肠道菌群对健康的影响,解读几乎都停留在"助消化"这一表层认知,真正的行业底层逻辑只有这几点:肠道菌群并非简单的消化助手,而是人体代谢、免疫、神经系统的核心调控中枢…

2026/8/25 14:39:44
一站式健康管理,为何叫好不叫座?

一站式健康管理,为何叫好不叫座?

一站式健康管理,为何叫好不叫座? 一站式健康管理看似是「产品与服务」的问题,实则是「供需错配+交付断层+认知断层」三重叠加导致的落地假象。行业喊了多年的「一站式闭环」,真正跑通的机构,寥寥…

2026/8/25 14:39:44
血液净化是智商税?别急着下结论

血液净化是智商税?别急着下结论

血液净化是智商税?别急着下结论关于血液净化,市面上90%的解读都停留在表层——要么将其神化为「****的排毒神器」,要么一棍子打死为「纯智商税」。真正的行业底层逻辑只有一点:血液净化本身是一项严肃的医疗技术,它有没…

2026/8/25 14:39:44
2026年7月黄石市新房价格深度分析报告

2026年7月黄石市新房价格深度分析报告

一、报告背景与数据说明本报告基于2026年7月黄石市新房实际成交案例,结合区域分布、楼盘定位、户型结构与成交价格等多维数据,对当前黄石市新房市场进行深度分析。报告旨在为购房者、投资者及行业从业者提供客观、真实的市场参考。数据来源说明&#xff…

2026/8/25 14:39:44
无线充电电动牙刷的五大核心优势:便利、安全、美观与智能体验全解析

无线充电电动牙刷的五大核心优势:便利、安全、美观与智能体验全解析

引言 在电动牙刷日益普及的今天,充电方式的选择也成为了影响用户体验的重要因素。从早期的有线充电到如今的无线充电,技术的进步为我们的日常口腔护理带来了更多便利。无线充电技术应用于电动牙刷,不仅仅是简单的“去掉一根线”,它…

2026/8/25 14:39:44
基于SpringBoot的知识分享平台设计与实现(源码+文档+讲解视频)

基于SpringBoot的知识分享平台设计与实现(源码+文档+讲解视频)

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…

2026/8/25 14:34:44