内容发布更新时间 : 2024/12/23 17:04:29星期一 下面是文章的全部内容请认真阅读。
4)汇编语言函数中用到的寄存器如何保护与恢复,为什么要保护参考程序中的R11? 5将delay.s中的R11改成R4,并将两条R11的保护与恢复语句stmfd sp!,{r12}和 ldmfd sp!{r11}删掉,在C语言程序中的语句i----处设置端点,观察运行过程中变量i的变化情况,并解释其中的原因。 程序原代码截图:
Init完成异常矢量表的建立,模式堆栈初始化,并将程序引导至C语言的main函数
C语言程序,调用汇编语言文件delay.s
汇编delay.s延时程序
思考题: 思考题
1) 如何建立异常矢量入口表?
要设置中断类型号,设置中断服务子程序段地址
2)如何在汇编语言中切换至C语言的main函数?
为了保证程序调用时参数的正确传递,汇编程序设计要遵守ATPCS。在C程序中不需要任何关键字来声明将被汇编语言调用的C程序,但需要在汇编语言程序之前使用IMPORT伪操作来声明该C程序。在汇编程序中通过BL指令来调用子程序。 3) 如何在C语言中调用汇编语言函数,并完成参数传递?
为了保证程序调用时参数的正确传递,汇编程序设计要遵守ATPCS。
在汇编程序中需要使用EXPORT伪操作来声明,同时,在C程序中调用该汇编程序之前需
要在C语言程序中使用extern关键词来声明该汇编程序。
4) 汇编语言函数中用到的寄存器如何保护与恢复,为什么要保护参考程序中的R11? 根据ATPCS标准,R11对应ARM 状态局部变量寄存器8。因为R11中可能含有其他重要的数据,所以要保护程序中R11。汇编语言函数中用到的寄存器的保护与恢复需要用到压栈与出栈。
5)将delay.s中的R11改成R4,并将两条R11的保护与恢复语句stmfd sp!,{r12}和 ldmfd sp!{r11}删掉,在C语言程序中的语句i----处设置端点,观察运行过程中变量i的变化情况,并解释其中的原因。 修改后程序如图
由于根据ATPCS标准,R4对应局部变量寄存器1,即i,所以在delay.s中,R4的值减为1,若不进行保护,则返回C程序后经i--,i值变为-1,永远不为0,无法执行if语句。导致i值一直递减下去