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

分析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
    在这里插入图片描述