文章目录
- 分析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