解决lb lh 指令没有进行符号扩展的问题
This commit is contained in:
35
cpu/riscv.c
35
cpu/riscv.c
@@ -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);
|
||||
|
Reference in New Issue
Block a user