解决lb lh 指令没有进行符号扩展的问题

This commit is contained in:
2025-04-17 23:36:44 +08:00
parent 46d1e933f5
commit 29019b9b98
9 changed files with 166 additions and 22 deletions

View File

@@ -2,7 +2,12 @@
#include "riscv.h"
#include "debug.h"
#include "print.h"
#include "stdio.h"
#include "stdlib.h"
#include "errno.h"
#include "string.h"
#include "../main.h"
#define device_write(riscv,addr,value) \
for (int i = 0;i < riscv->device_num;i++) {\
@@ -251,7 +256,11 @@ void ins_jalr(riscv_t* riscv, int rs1, int imm, int rd) {
void ins_lb(riscv_t* riscv, int rs1, int imm, int rd) {
uint32_t addr = riscv->reg[rs1] + imm;
// printf("lb %08x,imm=%d\n",addr,imm);
riscv->reg[rd] = (int)mem_wb_read(riscv, addr);
uint32_t r=mem_wb_read(riscv, addr);
if(r&(0x80)){
r|=0xffffff00;
}
riscv->reg[rd] = r;
}
void ins_lbu(riscv_t* riscv, int rs1, int imm, int rd) {
@@ -263,7 +272,11 @@ void ins_lbu(riscv_t* riscv, int rs1, int imm, int rd) {
void ins_lh(riscv_t* riscv, int rs1, int imm, int rd) {
uint32_t addr = riscv->reg[rs1] + imm;
// printf("lh %08x,imm=%d\n",addr,imm);
riscv->reg[rd] = (int)mem_wh_read(riscv, addr);
uint32_t r=mem_wh_read(riscv, addr);
if(r&(0x8000)){
r|=0xffff0000;
}
riscv->reg[rd] = r;
}
void ins_lhu(riscv_t* riscv, int rs1, int imm, int rd) {
@@ -658,10 +671,7 @@ int riscv_run(riscv_t* riscv) {
return 0;
}
#include "stdio.h"
#include "stdlib.h"
#include "errno.h"
#include "string.h"
long get_file_size(FILE *stream)
{
@@ -693,11 +703,20 @@ riscv_t riscv = { 0 };
int thread_fun(void* t)
{
int argc;
char** argv;
argc = get_argv(&argv);
char *bin_name="riscv.bin";
if(argc>1){
bin_name=argv[1];
}
printf("riscv start\n");
FILE *file=fopen("riscv.bin", "rb" );
FILE *file=fopen(bin_name, "rb" );
if(file==NULL)
{
printf("open file error\n");
printf("open file %s error\n",bin_name);
return -1;
}
riscv.rom_size = get_file_size(file);