当前位置: 首页 > article >正文

制作一个RISC-V的操作系统五-RISC-V汇编语言编程三

文章目录

  • 分析code/asm/add中的makefile
    • 相关命令
  • 算数运算指令
    • add
    • add2
    • sub
  • 练习5-1

分析code/asm/add中的makefile

makefile

EXEC = test

SRC = ${EXEC}.s

GDBINIT = ../gdbinit

include ../rule.mk

很明显还要去执行rule.mk

rule.mk

include ../../common.mk

.DEFAULT_GOAL := all
all:
	@${CC} ${CFLAGS} ${SRC} -Ttext=0x80000000 -o ${EXEC}.elf
	@${OBJCOPY} -O binary ${EXEC}.elf ${EXEC}.bin

.PHONY : run
run: all
	@echo "Press Ctrl-A and then X to exit QEMU"
	@echo "------------------------------------"
	@echo "No output, please run 'make debug' to see details"
	@${QEMU} ${QFLAGS} -kernel ./${EXEC}.elf

.PHONY : debug
debug: all
	@echo "Press Ctrl-C and then input 'quit' to exit GDB and QEMU"
	@echo "-------------------------------------------------------"
	@${QEMU} ${QFLAGS} -kernel ${EXEC}.elf -s -S &
	@${GDB} ${EXEC}.elf -q -x ${GDBINIT}

.PHONY : code
code: all
	@${OBJDUMP} -S ${EXEC}.elf | less

.PHONY : hex
hex: all
	@hexdump -C ${EXEC}.bin

.PHONY : clean
clean:
	rm -rf *.o *.bin *.elf

还要执行common.mk,然后按命令行中执行对应目标
common.mk

CROSS_COMPILE = riscv64-unknown-elf-
CFLAGS = -nostdlib -fno-builtin -march=rv32ima -mabi=ilp32 -g -Wall

QEMU = qemu-system-riscv32
QFLAGS = -nographic -smp 1 -machine virt -bios none

GDB = gdb-multiarch
CC = ${CROSS_COMPILE}gcc
OBJCOPY = ${CROSS_COMPILE}objcopy
OBJDUMP = ${CROSS_COMPILE}objdump

相关命令

QEMU -s 自动在模拟器启动是启动gdbserver,gdbserver与gdb通过网络连接。gdb server默认端口1234,然后等待gdb与之连接 -S参数代表 gdbserver启动调试程序后停止然后等待用户输入.-kernel ./可执行文件 代表要加载的镜像
gdb -q 启动把前面乱七八糟打印的东西去掉 -x 配置脚本 gdb启动时会运行该脚本

算数运算指令

乘除由M模块来扩展
RISC-V指令习惯源放后面 目的放前面

add

在这里插入图片描述
通过funct3和funct7和opcode来识别这是add指令
在这里插入图片描述
rsn对应第n个寄存器,里面存储的值是n
在这里插入图片描述
在这里插入图片描述

add2

对于4和-4的补码
符号扩展 只需按符号位扩展
零扩展(无符号扩展) 无论啥都扩展为0
对于4直接求出对应4的二进制编码为0100,(留一个为符号位)然后扩展由于是整数,左扩展0,为00000100
对于-4先求出对应4的二进制编码为0100,然后取反加1,为1100,然后符号位为1,左扩展1,为11111100

在这里插入图片描述
在这里插入图片描述

sub

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

练习5-1

  • 对 code/asm/sub 执⾏反汇编,查看 sub x5, x6, x7 这条汇编指令对应的机器指令的编码,并对照
    RISC-V 的 specificaion ⾃⼰解析该条指令的编码。
    0x407302b3对应二进制为0100000-00111-00110-000-00101-0110011
    在这里插入图片描述

  • 现知道某条 RISC-V 的机器指令在内存中的值为 b3 05 95 00,从左往右为从低地址到⾼地址,单位为
    字节,请将其翻译为对应的汇编指令。
    0x009505b3 对应二进制为0000000-01001-01010-000-01011-0110011
    add,x11,x10,x9
    在这里插入图片描述


http://www.kler.cn/news/159994.html

相关文章:

  • Python-炸弹人【附完整源码】
  • 【C/C++指针】指针*与引用的区别
  • 12.06 二叉树中等题2
  • 安网AC智能路由系统actpt_5g.data敏感信息泄露漏洞复现 [附POC]
  • 表单修改时取消disabled snippet
  • 【节日专栏】Python海龟绘制圣诞树代码
  • 0X05
  • 一、CSharp_Basic:什么是.Net平台?什么是.Net FrameWork?什么是C#?
  • C# Solidworks二次开发:获取零件的最小包容体方法详解
  • 关于mysql的lower_case_table_names引发的思考
  • C语言词法陷阱
  • 《C++ primer》 anki学习卡片txt输出101张,更新至第2章,截止2023年12月6日
  • 计算机操作系统3
  • C语言猜数字小游戏
  • java单人聊天
  • 模式识别与机器学习(七):集成学习
  • Python高级数据结构——并查集(Disjoint Set)
  • Multidimensional Scaling(MDS多维缩放)算法及其应用
  • docker安装mysql8
  • Python 模块的使用方法
  • 万宾科技监测设备,可燃气体监测仪特点一览
  • PostgreSQL有意思的现象:支持不带列的表
  • Java 数据结构篇-用链表、数组实现队列(数组实现:循环队列)
  • 【动手学深度学习】(六)权重衰退
  • 【Unity入门】声音组件AudioSource简介及实现声音的近大远小
  • 生成对抗网络——研讨会
  • SQL练习
  • QT-在ui界面中给QWidget增加Layout布局的两种方法
  • Tensorflow.js 入门学习指南
  • java内部类详解