3954|8

66

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

ARM子程序里再调用函数的问题 [复制链接]

有人能给个ARM子程序里面在调用函数的例子吗
子程序的返回值应该是 MOV PC LR
那调用函数的返回值应该是什么 最好能给个完整的例子 先谢了!
此帖出自ARM技术论坛

最新回复

同样不是很清楚 我也刚学ARM 希望高手解答 帮顶!  详情 回复 发表于 2010-2-22 06:47
点赞 关注
 

回复
举报

75

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
可以查一下相关的ARM指令
此帖出自ARM技术论坛
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
给个例子。

LDR          R0, PARAM2
STR          R0, [SP, #-4]!                ;将参数推入堆栈
LDR          R0, PARAM1
STR         R0, [SP, #-4]!       
BL          SUB1
2020        LDR         R0, [SP]                        ;保存SUB1的结果
STR         R0, RESULT
ADD         SP, SP, #8                ;恢复堆栈

子程序
SUB1
        STMFD         SP!, {R0-R3, FP,LR}
        ADD         FP, SP, #16                ;计算帧指针
        LDR         R0, [FP, #8]                ;载入参数1
        LDR         R1, [FP, #12]                ;载入参数2
        LDR         R2, PARAM3                ;载入参数3
        STR         R2, [SP, #-4]!                ;将参数3推入堆栈
        BL                 SUB2
        LDR         R2, [SP], #4                ;将SUB2的结果弹出并存储在R2中,并递增SP
        STR         R3, [FP, #8]                        ;将结果推入堆栈
        LDMFD  SP!, {R0-R3, FP, PC}        ;恢复寄存器并返回

SUB2
        STMFD         SP!, {R0, R1, FP, LR}
        ADD         FP, SP, #8                ;载入结构指针
        LDR         R0, [FP, #8]                ;载入参数
        STR         R1, [FP, #8]                ;将结果推入堆栈
        LDMFD  SP!, {R0, R1, FP, PC}

此帖出自ARM技术论坛
 
 
 

回复

82

帖子

0

TA的资源

一粒金砂(初级)

4
 
例子有点复杂 一时不太理解
比如做个简单的程序 像算个5+2*3 用两个子程序完成 应该怎么写的 谢谢
此帖出自ARM技术论坛
 
 
 

回复

85

帖子

0

TA的资源

一粒金砂(初级)

5
 
MOV PC LR
这个是说子函数调用结束时把主程序中的调用该子程序指令的下一条要执行的指令放到程序计数器pc中去,所以函数调用结束后能够顺利返回,这句话一般是自动执行的,不用写

你只需要在子程序的开头把pc,lr以及子程序中要用到的寄存器都压入堆栈保护,在子程序的末尾再从堆栈中恢复出来就可以了
此帖出自ARM技术论坛
 
 
 

回复

87

帖子

0

TA的资源

一粒金砂(初级)

6
 
是不是就是

SUB1
STMFD SP!, {R0-R3, FP,LR}
...............
BL SUB2
LDMFD  SP!, {R0-R3, FP, PC}

SUB2
STMFD SP!, {R0, R1, FP, LR}
........
LDMFD  SP!, {R0, R1, FP, PC}

就行了?需不需要在子程序里面对FP和SP进行操作?

此帖出自ARM技术论坛
 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

7
 
引用 2 楼 aaa_tnt 的回复:
给个例子。

LDR? R0, PARAM2
STR? R0, [SP, #-4]! ;将参数推入堆栈
LDR? R0, PARAM1
STR R0, [SP, #-4]!
BL? SUB1
2020 LDR R0, [SP] ;保存SUB1的结果
STR R0, RESULT
ADD SP, SP, #8 ;恢复堆栈

子程序
SUB1
STMFD SP!, {R0-R3, FP,LR}
ADD FP, SP, #16 ;计算帧指针
LDR R0, [FP, #8] ;载入参数1
LDR R1, [FP, #12] ;载入参数2
LDR R2, PARAM3 ;载入参数3
STR R2, [SP, #-4]! ;将参数3推入堆栈
BL SUB2
LDR R2, [SP], #4 ;将SUB2的结果弹出并存储在R2中,并递增SP
STR R3, [FP, #8] ;将结果推入堆栈
LDMFD? SP!, {R0-R3, FP, PC} ;恢复寄存器并返回

SUB2
STMFD SP!, {R0, R1, FP, LR}
ADD FP, SP, #8 ;载入结构指针
LDR R0, [FP, #8] ;载入参数
STR R1, [FP, #8] ;将结果推入堆栈
LDMFD? SP!, {R0, R1, FP, PC}


此帖出自ARM技术论坛
 
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

8
 
我需不需要在子程序里对FP和SP进行操作?还是在子程序的末尾再从堆栈中恢复出就够了?
此帖出自ARM技术论坛
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

9
 
同样不是很清楚 我也刚学ARM 希望高手解答 帮顶!
此帖出自ARM技术论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表