请问ARM架构使用哪个寄存器来记住返回到哪里
执行一个方法?
又如何使用此寄存器来控制
程序 可以的话可以提供一个例子吗
ARM架构使用哪个寄存器来记住返回到哪里
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
2条回答 默认 最新
- _GX_ 2022-01-13 06:19关注
ARM架构用lr寄存器保存函数返回地址,下面是一个简单的例子
int add(int a, int b) { return a+b; } int main() { int a = 1; int b = 2; int c = add(a, b); return 0; }
$ gcc -S a.c
.arch armv6 .eabi_attribute 28, 1 .eabi_attribute 20, 1 .eabi_attribute 21, 1 .eabi_attribute 23, 3 .eabi_attribute 24, 1 .eabi_attribute 25, 1 .eabi_attribute 26, 2 .eabi_attribute 30, 6 .eabi_attribute 34, 1 .eabi_attribute 18, 4 .file "a.c" .text .align 2 .global add .arch armv6 .syntax unified .arm .fpu vfp .type add, %function add: @ args = 0, pretend = 0, frame = 8 @ frame_needed = 1, uses_anonymous_args = 0 @ link register save eliminated. str fp, [sp, #-4]! ; 保存上一层函数的帧指针到栈上 add fp, sp, #0 ; 设置当前帧指针 sub sp, sp, #12 ; 分配局部变量内存,sp-4: 上一层函数帧指针,sp-8: 局部变量a,sp-12: 局部变量b str r0, [fp, #-8] ; 把传入的第一个参数(寄存器r0)拷贝到局部变量a str r1, [fp, #-12] ; 把传入的第二个参数(寄存器r1)拷贝到局部变量b ldr r2, [fp, #-8] ; 把变量a的值读入到寄存器r2 ldr r3, [fp, #-12] ; 把变量b的值读入到寄存器r3 add r3, r2, r3 ; 计算r2+r3,结果保存到r3 mov r0, r3 ; 拷贝r3到r0,寄存器r0里的值就是函数的返回值 add sp, fp, #0 ; 恢复栈指针 @ sp needed ldr fp, [sp], #4 ; 恢复帧指针 bx lr ; 函数返回,寄存器lr是返回地址 .size add, .-add .align 2 .global main .syntax unified .arm .fpu vfp .type main, %function main: @ args = 0, pretend = 0, frame = 16 @ frame_needed = 1, uses_anonymous_args = 0 push {fp, lr} ; 把帧指针和函数返回地址压栈 add fp, sp, #4 ; 设置帧指针 sub sp, sp, #16 ; 在栈上分配局部变量内存 mov r3, #1 ; str r3, [fp, #-8] ; a = 1 mov r3, #2 str r3, [fp, #-12] ; b = 2 ldr r1, [fp, #-12] ; 把b的值拷贝到r1,r1是传给子函数的第二个参数 ldr r0, [fp, #-8] ; 把a的值拷贝到r0,r0是传给子函数的第一个参数 bl add ; 调用子函数add,函数返回地址保存到lr寄存器 str r0, [fp, #-16] ; 寄存器r0里的值是函数返回值,把函数返回值拷贝到局部变量c中 mov r3, #0 mov r0, r3 ; main函数返回值0 sub sp, fp, #4 ; 恢复栈指针 @ sp needed pop {fp, pc} ; main函数返回 .size main, .-main .ident "GCC: (Raspbian 8.3.0-6+rpi1) 8.3.0" .section .note.GNU-stack,"",%progbits
解决 无用评论 打赏 举报
悬赏问题
- ¥15 关于#c##的问题:最近需要用CAT工具Trados进行一些开发
- ¥15 南大pa1 小游戏没有界面,并且报了如下错误,尝试过换显卡驱动,但是好像不行
- ¥15 没有证书,nginx怎么反向代理到只能接受https的公网网站
- ¥50 成都蓉城足球俱乐部小程序抢票
- ¥15 yolov7训练自己的数据集
- ¥15 esp8266与51单片机连接问题(标签-单片机|关键词-串口)(相关搜索:51单片机|单片机|测试代码)
- ¥15 电力市场出清matlab yalmip kkt 双层优化问题
- ¥30 ros小车路径规划实现不了,如何解决?(操作系统-ubuntu)
- ¥20 matlab yalmip kkt 双层优化问题
- ¥15 如何在3D高斯飞溅的渲染的场景中获得一个可控的旋转物体