571
社区成员
发帖
与我相关
我的任务
分享将一个简单的C程序汇编成LoongArch或RISC-V汇编代码,并逐步分析程序的执行过程,深入理解存储程序计算机和函数调用堆栈框架在执行过程中所起的作用。
编写测试代码如下:

执行:
riscv64-linux-gnu-gcc -S lab1.c -o lab1.s
得到 lab1.s 汇编代码如下:
.file "lab1.c"
.option pic
.text
.align 1
.globl g
.type g, @function
g:
addi sp,sp,-32 ;sp = sp-32, 栈顶指针sp, 分配g函数的栈空间
sd s0,24(sp) ;将栈底指针s0的值保存在sp+24指向的位置中
addi s0,sp,32 ;s0 = sp+32
mv a5,a0 ;将a0的值放进a5中,a0存放的是函数参数
sw a5,-20(s0) ;将a5的值存放到s0-20指向的位置中
lw a5,-20(s0) ;s0-20的值存在a5中
addiw a5,a5,3 ;将a5的值加3
sext.w a5,a5
mv a0,a5 ;将a5的值保存到a0,作为函数g的返回值
ld s0,24(sp) ;sp+24的值存入s0的位置中
addi sp,sp,32 ;sp = sp+32,恢复调用g函数之前的栈空间(f的栈空间)
jr ra ;无条件跳转,函数返回
.size g, .-g
.align 1
.globl f
.type f, @function
f:
addi sp,sp,-32 ;sp = sp-32, 栈顶指针sp, 分配f函数的栈空间
sd ra,24(sp) ;ra存放的是返回地址,保存在sp+24指向的位置中
sd s0,16(sp) ;将栈底指针s0的值保存在sp+16指向的位置中
addi s0,sp,32 ;s0 = sp+32
mv a5,a0 ;将a0的值放进a5中,a0存放的是函数参数
sw a5,-20(s0) ;将a5的值存放到s0-20指向的位置中
lw a5,-20(s0) ;s0-20的值存在a5中
mv a0,a5 ;将a5的值保存到a0
call g ;调用函数g
mv a5,a0 ;将a0的值保存到a5
mv a0,a5 ;将a5的值保存到a0,作为函数f的返回值
ld ra,24(sp) ;ra=sp+24,获取main函数的返回地址
ld s0,16(sp) ;s0=sp+16,指向main函数的栈空间
addi sp,sp,32 ;指向main函数栈空间栈顶
jr ra ;无条件跳转,函数返回
.size f, .-f
.align 1
.globl main
.type main, @function
main:
addi sp,sp,-16 ;修改栈顶指针sp=sp-16,构造函数栈空间
sd ra,8(sp) ;ra存放的是返回地址,将ra的值存放到sp+8位置中
sd s0,0(sp) ;将栈底指针s0的值保存在sp+16指向的位置中
addi s0,sp,16 ;s0 = sp + 16
li a0,8 ;8存到a0中
call f ;调用函数f
mv a5,a0 ;将a0的值保存到a5
addiw a5,a5,1 ;将a5的值加1
sext.w a5,a5
mv a0,a5 ;将a5的值保存到a0,作为返回值
ld ra,8(sp) ;取回旧的ra
ld s0,0(sp) ;取回旧的sp
addi sp,sp,16 ;回退栈帧
jr ra ;无条件跳转,函数返回
.size main, .-main
.ident "GCC: (Ubuntu 9.4.0-1ubuntu1~20.04) 9.4.0"
.section .note.GNU-stack,"",@progbits
学号SA22225134