571
社区成员
发帖
与我相关
我的任务
分享将一个简单的C程序汇编成LoongArch或RISC-V汇编代码,并逐步分析程序的执行过程,深入理解存储程序计算机和函数调用堆栈框架在执行过程中所起的作用。
sudo apt-get install gcc-riscv64-linux-gnu
#include<stdio.h>
int add(int a, int b) {
return a + b;
}
int main() {
int a = 7;
int b = 5;
int c = add(a, b);
return 0;
}
.file "main.c"
.option pic
.text
.align 1
.globl add
.type add, @function
add:
addi sp,sp,-32 # sp = sp - 32 栈指针减8Byte
sd s0,24(sp) # *(sp + 24) = s0 将s0(main的栈底)存入(sp + 24)
addi s0,sp,32 # s0 = sp + 32
mv a5,a0 # a5 = a0
mv a4,a1 # a4 = a1
sw a5,-20(s0) # *(s0 - 20) = a5
mv a5,a4 # a5 = a4
sw a5,-24(s0) # *(s0 - 24) = a5
lw a4,-20(s0) # a4 = *(s0 - 20) a4=7
lw a5,-24(s0) # a5 = *(s0 - 24) a5=5
addw a5,a4,a5 # a5 = a4 + a5
sext.w a5,a5 #
mv a0,a5 # a0 = a5
ld s0,24(sp) # s0 = *(sp + 24) 栈底回到main的栈底
addi sp,sp,32 # sp = sp + 32 栈顶回到main的栈顶
jr ra # 跳转到ra(return address) main函数的mv a5,a0
.size add, .-add
.align 1
.globl main
.type main, @function
main:
addi sp,sp,-32 # sp = sp - 32
sd ra,24(sp) # *(sp + 24) = ra
sd s0,16(sp) # *(sp + 16) = s0
addi s0,sp,32 # s0 = sp + 32
li a5,7 # a5 = 7
sw a5,-28(s0) # *(s0 - 28) = a5
li a5,5 # a5 = 5
sw a5,-24(s0) # *(s0 - 24) = a5
lw a4,-24(s0) # a4 = *(s0 - 24)
lw a5,-28(s0) # a5 = *(s0 - 28)
mv a1,a4 # a1 = a4
mv a0,a5 # a0 = a5
call add # 调用add函数,ra的指向下一条指令
mv a5,a0 # a5 = a0
sw a5,-20(s0) # *(s0 -20) = a5
li a5,0 # a5 = 0
mv a0,a5 # a0 = a5
ld ra,24(sp) # ra = *(sp + 24)
ld s0,16(sp) # s0 = *(sp + 16)
addi sp,sp,32 # sp = sp + 32
jr ra # 跳转到ra(return address)
.size main, .-main
.ident "GCC: (Ubuntu 9.4.0-1ubuntu1~20.04) 9.4.0"
.section .note.GNU-stack,"",@progbits