首页 > 其他分享 >nju pa2

nju pa2

时间:2023-01-24 21:55:07浏览次数:52  
标签:pa2 0000 sp li a0 指令 nju addi

目录

其他资料:

https://github.com/riscv-non-isa/riscv-asm-manual/blob/master/riscv-asm.md

http://riscvbook.com/chinese/RISC-V-Reader-Chinese-v2p1.pdf

riscv中六种类型的指令

RTFSC

运行第一个客户程序

第一个客户程序即文档所说的dummy.c,键入命令后,会将dummy.c编译成基于rv64指令的二进制格式文件(后缀名为 .bin),作为nemu模拟器的镜像文件(img_file)

make ARCH=$ISA-nemu ALL=dummy run

实现指令

首先查看反汇编结果,看看需要实现哪些指令

0000000080000000 <_start>:
    80000000: 00000413            li  s0,0
    80000004: 00009117            auipc sp,0x9
    80000008: ffc10113            addi  sp,sp,-4 # 80009000 <_end>
    8000000c: 00c000ef            jal ra,80000018 <_trm_init>

0000000080000010 <main>:
    80000010: 00000513            li  a0,0
    80000014: 00008067            ret

0000000080000018 <_trm_init>:
    80000018: ff010113            addi  sp,sp,-16
    8000001c: 00000517            auipc a0,0x0
    80000020: 01c50513            addi  a0,a0,28 # 80000038 <_etext>
    80000024: 00113423            sd  ra,8(sp)
    80000028: fe9ff0ef            jal ra,80000010 <main>
    8000002c: 00050513            mv  a0,a0
    80000030: 00100073            ebreak
    80000034: 0000006f            j 80000034 <_trm_init+0x1c>

通过查询手册,可以知道li ret等指令都是伪指令,比如第一条指令

80000000: 00000413            li  s0,0

其十六进制内容为0x00000413,对应二进制为0000 0000 0000 0000 0000 0100 0001 0011,查询手册可知其为addi指令,而当伪指令li中的立即数小于4096时,的确会被编译器展开为addi指令,因此目前可以确定,反汇编结果的右边的指令只是为了方便阅读(生成反汇编指令的代码在disasm.cc中),我们在实现指令功能时,只需要看左边的十六进制内容即可

按照框架和文档提示,以及根据手册查询每条指令干了什么,然后填写代码即可

enum {
  TYPE_I, TYPE_U, TYPE_S, TYPE_J,
  TYPE_N, // none
};

#define immJ() do { *imm = SEXT(( \
(BITS(i, 31, 31) << 19) | \
BITS(i, 30, 21) | \
(BITS(i, 20, 20) << 10) | \
(BITS(i, 19, 12) << 11) \
) << 1, 21); Log(ANSI_FG_CYAN "%#lx\n" ANSI_NONE, *imm); } while(0)

static void decode_operand(Decode *s, int *dest, word_t *src1, word_t *src2, word_t *imm, int type) {
  // ...
  switch (type) {
		// ...
    case TYPE_J:                   immJ(); break;
  }
}

static int decode_exec(Decode *s) {
	// ...

  INSTPAT("??????? ????? ????? 000 ????? 00100 11", addi   , I, R(dest) = src1 + imm);
  INSTPAT("??????? ????? ????? ??? ????? 11011 11", jal    , J, s->dnpc = s->pc; s->dnpc += imm; R(dest) = s->pc + 4);
  INSTPAT("??????? ????? ????? 000 ????? 11001 11", jalr   , I, s->dnpc = (src1 + imm) & ~(word_t)1; R(dest) = s->pc + 4);

	// ...

  return 0;
}

标签:pa2,0000,sp,li,a0,指令,nju,addi
From: https://www.cnblogs.com/nosae/p/17066439.html

相关文章

  • nju pa
    PA目录PAPA1RTFSC优美地退出简易调试器单步执行si[N]打印寄存器infor扫描内存xNEXPR表达式求值pEXPRPA1RTFSC优美地退出makerun启动nemu后直接输入q退出,得......
  • OpenJudge 1.8.11 图像旋转
    11:图像旋转总时间限制:1000ms内存限制:65536kB描述输入一个n行m列的黑白图像,将它顺时针旋转90度后输出。输入第一行包含两个整数n和m,表示图像包含像素点的行数和......
  • Kerberos 身份验证在 ChunJun 中的落地实践
    ​​Kerberos​​,在古希腊神话故事中,指的是一只三头犬守护在地狱之门外,禁止任何人类闯入地狱之中。那么在现实中,Kerberos指的是什么呢?一、Kerberos介绍01Kerberos是什么......
  • [PA2013]Raper
    链接:https://www.luogu.com.cn/problem/P4694题目描述:有\(k\)个光盘要在\(n\)天之内加工完毕.有\(2\)个工厂\(A,B\),每一个光盘要先在\(A\)工厂加工,再在\(B\)工厂加工,......
  • OpenJudge 1.8.9 矩阵乘法
    09:矩阵乘法总时间限制:1000ms内存限制:65536kB描述计算两个矩阵的乘法。nm阶的矩阵A乘以mk阶的矩阵B得到的矩阵C是nk阶的,且C[i][j]=A[i][0]B[0][j]+A[i][1]B[1......
  • 开源共建 | 中国移动冯江涛:ChunJun(原FlinkX)在数据入湖中的应用
    ChunJun(原FlinkX)是一个基于Flink提供易用、稳定、高效的批流统一的数据集成工具。2018年4月,秉承着开源共享的理念,数栈技术团队在github上开源了FlinkX,承蒙各位开发者的合......
  • a_good_idea: NJUPT-CTF
    下载文件发现是一个png图片  然用r查看属性没有任何东西,就想利用010editor打开看看,发现在末尾FFD9之后有一堆负载文件 然后就像利用binwalk和foremost试一试,......
  • nunjucks模板语法
    循环语句server.jsconstKoa=require("koa");//引入koa构造函数constapp=newKoa();//创建应用constviews=require("koa-views");//引入koa-viewsconstnunju......
  • Nunjucks模板入门
    概述安装nunjucks代码实现server.jsconstKoa=require("koa");//引入koa构造函数constapp=newKoa();//创建应用constviews=require("koa-views");//引入k......
  • 致谢每一位ChunJun Contributor!这里有一份礼物等你领取!
    作为一个批流统一的数据集成框架,秉承着易用、稳定、高效的目标,ChunJun于2018年4月29日在Github上将内核源码正式开放。从还被叫作FlinkX,写下第一行代码开始,ChunJun已经走......