weixin_58333864 2022-01-13 00:00 采纳率: 0%
浏览 20

ARM架构使用哪个寄存器来记住返回到哪里

请问ARM架构使用哪个寄存器来记住返回到哪里
执行一个方法?
又如何使用此寄存器来控制
程序 可以的话可以提供一个例子吗

  • 写回答

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
    
    评论

报告相同问题?

问题事件

  • 创建了问题 1月13日

悬赏问题

  • ¥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高斯飞溅的渲染的场景中获得一个可控的旋转物体