寄存器
指令格式
常用指令
#include <stdio.h>
int fib(int n) {if (n <= 2)return 1;return fib(n - 1) + fib(n - 2);
}
int main() { fib(3); }
0000000000000628 <fib>:628: 7179 addi sp,sp,-48 //栈指针-4862a: f406 sd ra,40(sp) //保存函数返回地址62c: f022 sd s0,32(sp) //保存 保存寄存器的值,这些值在当前函数返回后还会被之前的函数接着使用62e: ec26 sd s1,24(sp) //同上630: 1800 addi s0,sp,48 //栈指针+48赋值给s0632: 87aa mv a5,a0 //伪指令 复制寄存器的值 a5=a0,a0为传递来的参数634: fcf42e23 sw a5,-36(s0) //*(sp-36)=a5638: fdc42783 lw a5,-36(s0) //a5=*(sp-36)63c: 0007871b sext.w a4,a5 //将a5符号扩展 并传递给a4640: 4789 li a5,2 //伪指令 load立即数2642: 00e7c463 blt a5,a4,64a <fib+0x22>//分支指令 如果a4<a5 则PC寄存器加上立即数,跳转到fib+0x22646: 4785 li a5,1 648: a025 j 670 <fib+0x48>//跳转64a: fdc42783 lw a5,-36(s0) // 即传递进来的参数赋值给a564e: 37fd addiw a5,a5,-1 //a5加上立即数-1650: 2781 sext.w a5,a5 //符号扩展652: 853e mv a0,a5 //复制寄存器的值654: fd5ff0ef jal ra,628 <fib>//跳转 即调用 f(n-1)658: 87aa mv a5,a0 //函数调用返回值保存到a565a: 84be mv s1,a5 //复制寄存器65c: fdc42783 lw a5,-36(s0) 660: 37f9 addiw a5,a5,-2662: 2781 sext.w a5,a5664: 853e mv a0,a5666: fc3ff0ef jal ra,628 <fib> 66a: 87aa mv a5,a0 // 65c-66a 同 64a-65866c: 9fa5 addw a5,a5,s1// a5=a5+s1 f(n-1)+f(n-2)66e: 2781 sext.w a5,a5670: 853e mv a0,a5672: 70a2 ld ra,40(sp) // 恢复成调用之前的状态674: 7402 ld s0,32(sp)676: 64e2 ld s1,24(sp)678: 6145 addi sp,sp,48 67a: 8082 ret //伪指令 PC=ra000000000000067c <main>:67c: 1141 addi sp,sp,-16 //将栈指针-1667e: e406 sd ra,8(sp) //保存函数返回地址680: e022 sd s0,0(sp) // 保存寄存器由被调用者保存,保存main函数被调用之前的保存寄存器的值682: 0800 addi s0,sp,16//栈指针+16赋值给s0684: 450d li a0,3 //a系列寄存器用户传递函数参数或者传递函数返回值686: fa3ff0ef jal ra,628 <fib>//跳转指令 将返回地址(68a)保存在ra寄存器中68a: 4781 li a5,0 //伪指令 load立即数68c: 853e mv a0,a5 //伪指令 复制寄存器的值68e: 60a2 ld ra,8(sp) //load ra=*(sp+8) 函数调用返回值690: 6402 ld s0,0(sp) //s0= *(sp) 恢复之前保存的s0的值692: 0141 addi sp,sp,16 //栈指针+16694: 8082 ret //函数返回 伪指令,实际是jalr 返回地址在机器指令指定的寄存器中
本文发布于:2024-02-02 11:11:36,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170684349743405.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |