使用通过寄存器传递的参数的地址, 作为支持调用其他函数
#include <stdint.h> uint32_t arg = 0x12345678; uint32_t getArgVal0( uint32_t * arg) { return *arg; } uint32_t getArgVal( uint32_t arg) { return getArgVal0( &arg ); } uint32_t * getArgPtr( uint32_t arg) { return &arg; } int main( void ) { arg = (uint32_t)getArgVal( arg); // OK arg = (uint32_t)getArgPtr( arg); // ERROR }
getArgVal0: 0x200050d0: 0x6800 LDR R0, [R0] 0x200050d2: 0x4770 BX LR getArgVal: 0x200050d4: 0xb501 PUSH {R0, LR} 0x200050d6: 0xa800 ADD R0, SP, #0x0 ; Push Arg to Stack, use Address of Stack as argument pass to getArgVal0() 0x200050d8: 0xf7ff 0xfffa BL getArgVal0 ; 0x200050d0 0x200050dc: 0xbd02 POP {R1, PC} getArgPtr: 0x200050de: 0xb401 PUSH {R0} 0x200050e0: 0xa800 ADD R0, SP, #0x0 ; Push Arg to Stack, Return Address of Stack 0x200050e2: 0xb001 ADD SP, SP, #0x4 0x200050e4: 0x4770 BX LR main: 0x200050e8: 0x481b LDR.N R0, ??DataTable1_1 ; arg 0x200050ea: 0x6800 LDR R0, [R0] 0x200050ec: 0xf7ff 0xfff2 BL getArgVal ; 0x200050d4 0x200050f0: 0x4919 LDR.N R1, ??DataTable1_1 ; arg 0x200050f2: 0x6008 STR R0, [R1] 0x200050f4: 0x4818 LDR.N R0, ??DataTable1_1 ; arg 0x200050f6: 0x6800 LDR R0, [R0] 0x200050f8: 0xf7ff 0xfff1 BL getArgPtr ; 0x200050de 0x200050fc: 0x4916 LDR.N R1, ??DataTable1_1 ; arg 0x200050fe: 0x6008 STR R0, [R1] ; R0 is Address in Stack, NOT global
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
2013-07-17 JTAG接线描述
2013-07-17 电感式DC/DC变换器工作原理
2013-07-17 PID DC/DC Converter Controller Using a PICmicro Microcontroller