Linux操作系统分析Lab1

weixin_45662787 2023-03-13 20:48:09

实验目标

将一个简单的C程序汇编成LoongArch或RISC-V汇编代码,并逐步分析程序的执行过程,深入理解存储程序计算机和函数调用堆栈框架在执行过程中所起的作用。

实验步骤

1.安装RISC-V的交叉编译器

sudo apt-get install gcc-riscv64-linux-gnu

2.编写一个简单的c程序

#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;
}

3.将c程序汇编成riscv的汇编代码并分析 

        .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

 

...全文
61 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

571

社区成员

发帖
与我相关
我的任务
社区描述
软件工程教学新范式,强化专项技能训练+基于项目的学习PBL。Git仓库:https://gitee.com/mengning997/se
软件工程 高校
社区管理员
  • 码农孟宁
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧