函数调用正常

This commit is contained in:
2025-04-17 15:35:32 +08:00
parent 1eb2785984
commit 333cc57c99
4 changed files with 86 additions and 37 deletions

View File

@@ -145,16 +145,10 @@ void ins_add(riscv_t* riscv, int rs2, int rs1, int rd) {
}
void ins_addi(riscv_t* riscv, int rs1, int imm, int rd) {
if (imm & (1 << 11)) {
imm |= 0xfffff800;
}
riscv->reg[rd] = riscv->reg[rs1] + imm;
riscv->reg[rd] = (int)riscv->reg[rs1] + imm;
}
void ins_addiw(riscv_t* riscv, int rs1, int imm, int rd) {
if (imm & (1 << 11)) {
imm |= 0xfffff800;
}
riscv->reg[rd] = riscv->reg[rs1] + imm;
}
@@ -167,9 +161,6 @@ void ins_and(riscv_t* riscv, int rs2, int rs1, int rd) {
}
void ins_andi(riscv_t* riscv, int rs1, int imm, int rd) {
if (imm & (1 << 11)) {
imm |= 0xfffff800;
}
riscv->reg[rd] = riscv->reg[rs1] & imm;
}
@@ -273,31 +264,37 @@ 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_wrb(addr);
}
void ins_lbu(riscv_t* riscv, int rs1, int imm, int rd) {
uint32_t addr = riscv->reg[rs1] + imm;
printf("lbu %08x,imm=%d\n",addr,imm);
riscv->reg[rd] = mem_wrb(addr);
}
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_wrh(addr);
}
void ins_lhu(riscv_t* riscv, int rs1, int imm, int rd) {
uint32_t addr = riscv->reg[rs1] + imm;
printf("lhu %08x,imm=%d\n",addr,imm);
riscv->reg[rd] = mem_wrh(addr);
}
void ins_lw(riscv_t* riscv, int rs1, int imm, int rd) {
uint32_t addr = riscv->reg[rs1] + imm;
printf("lw %08x,imm=%d\n",addr,imm);
riscv->reg[rd] = mem_wr(addr);
}
void ins_lwu(riscv_t* riscv, int rs1, int imm, int rd) {
uint32_t addr = riscv->reg[rs1] + imm;
printf("lwu %08x,imm=%d\n",addr,imm);
riscv->reg[rd] = mem_wr(addr);
}
@@ -315,24 +312,24 @@ void ins_or(riscv_t* riscv, int rs2, int rs1, int rd) {
}
void ins_ori(riscv_t* riscv, int rs1, int imm, int rd) {
if (imm & (1 << 11)) {
imm |= 0xfffff800;
}
riscv->reg[rd] = riscv->reg[rs1] | imm;
}
void ins_sb(riscv_t* riscv, int rs2, int rs1, int imm) {
uint32_t addr = riscv->reg[rs1] + imm;
printf("sb %08x,imm=%d\n",addr,imm);
mem_wrb(addr) = riscv->reg[rs2];
}
void ins_sh(riscv_t* riscv, int rs2, int rs1, int imm) {
uint32_t addr = riscv->reg[rs1] + imm;
printf("sh %08x,imm=%d\n",addr,imm);
mem_wrh(addr) = riscv->reg[rs2];
}
void ins_sw(riscv_t* riscv, int rs2, int rs1, int imm) {
uint32_t addr = riscv->reg[rs1] + imm;
printf("sw %08x,imm=%d\n",addr,imm);
mem_wr(addr) = riscv->reg[rs2];
}
@@ -357,16 +354,10 @@ void ins_slt(riscv_t* riscv, int rs2, int rs1, int rd) {
}
void ins_slti(riscv_t* riscv, int rs1, int imm, int rd) {
if (imm & (1 << 11)) {
imm |= 0xfffff800;
}
riscv->reg[rd] = (int)riscv->reg[rs1] < imm;
}
void ins_sltiu(riscv_t* riscv, int rs1, int imm, int rd) {
if (imm & (1 << 11)) {
imm |= 0xfffff800;
}
riscv->reg[rd] = riscv->reg[rs1] < (uint32_t)imm;
}
@@ -423,38 +414,51 @@ void ins_xor(riscv_t* riscv, int rs2, int rs1, int rd) {
}
void ins_xori(riscv_t* riscv, int rs1, int imm, int rd) {
if (imm & (1 << 11)) {
imm |= 0xfffff800;
}
riscv->reg[rd] = riscv->reg[rs1] ^ imm;
}
// 不需要做符号扩展
#define imm_u_type(_ins,_imm) {\
_imm = (_ins >> 12) << 12;\
}
// 20位符号扩展
#define imm_j_type(_ins,_imm) {\
_imm = ((_ins >> 21) & 0x3ff) << 1;\
_imm |= ((_ins >> 20) & 1) << 11;\
_imm |= ((_ins >> 12) & 0xff) << 12;\
_imm |= ((_ins >> 31) & 1) << 20;\
}
if(_imm&(1<<20)){\
_imm|=0xfff00000;\
}\
}
// 12位符号扩展
#define imm_i_type(_ins,_imm) {\
_imm = (_ins >> 20) & 0xfff;\
if(_imm&(1<<11)){\
_imm|=0xfffff000;\
}\
}
// 13位符号扩展
#define imm_b_type(_ins,_imm) {\
_imm = ((_ins >> 31) & 1) << 12;\
_imm |= ((_ins >> 7) & 0x1) << 11;\
_imm |= ((_ins >> 8) & 0xf) << 1;\
_imm |= ((_ins >> 25) & 0x1f) << 5;\
if(_imm&(1<<12)){\
_imm|=0xfffff000;\
}\
}
// 12位符号扩展
#define imm_s_type(_ins,_imm) {\
_imm = ((_ins >> 7) & 0x1f);\
_imm |= (_ins >> 25) << 5;\
if(_imm&(1<<11)){\
_imm|=0xfffff000;\
}\
}
#define imm_csr(_ins,_imm) {\
@@ -516,7 +520,7 @@ int riscv_decode(riscv_t* riscv, uint32_t ins) {
}
break;
case opcode_lb:
imm_i_type(imm, ins);
imm_i_type(ins, imm);
switch (funct3)
{
case 0x0:
@@ -539,7 +543,8 @@ int riscv_decode(riscv_t* riscv, uint32_t ins) {
}
break;
case opcode_sb:
switch(funct3){
imm_s_type(ins, imm);
switch (funct3) {
case 0x0:
ins_sb(riscv, rs2, rs1, imm);
break;
@@ -674,20 +679,59 @@ int riscv_init(riscv_t* riscv, uint32_t* rom, uint32_t rom_addr_base, uint32_t r
}
int riscv_print(riscv_t* riscv) {
printf("x0(zero): %08x\n", riscv->zero);
printf("x1(ra): %08x\n", riscv->ra);
printf("x2(sp): %08x\n", riscv->sp);
printf("x3(gp): %08x\n", riscv->gp);
printf("x4(tp): %08x\n", riscv->tp);
printf("x5(t0): %08x\n", riscv->t0);
printf("x6(t1): %08x\n", riscv->t1);
printf("x7(t2): %08x\n", riscv->t2);
printf("x8(fp): %08x\n", riscv->fp);
printf("x9(s0): %08x\n", riscv->s0);
printf("x10(s1): %08x\n", riscv->s1);
printf("x11(a0): %08x\n", riscv->a0);
printf("x12(a1): %08x\n", riscv->a1);
printf("x13(a2): %08x\n", riscv->a2);
printf("x14(a3): %08x\n", riscv->a3);
printf("x15(a4): %08x\n", riscv->a4);
printf("x16(a5): %08x\n", riscv->a5);
printf("x17(a6): %08x\n", riscv->a6);
printf("x18(s2): %08x\n", riscv->s2);
printf("x19(s3): %08x\n", riscv->s3);
printf("x20(s4): %08x\n", riscv->s4);
printf("x21(s5): %08x\n", riscv->s5);
printf("x22(s6): %08x\n", riscv->s6);
printf("x23(s7): %08x\n", riscv->s7);
printf("x24(s8): %08x\n", riscv->s8);
printf("x25(s9): %08x\n", riscv->s9);
printf("x26(s10): %08x\n", riscv->s10);
printf("x27(s11): %08x\n", riscv->s11);
printf("x28(t3): %08x\n", riscv->t3);
printf("x29(t4): %08x\n", riscv->t4);
printf("x30(t5): %08x\n", riscv->t5);
printf("x31(t6): %08x\n", riscv->t6);
}
int riscv_run(riscv_t* riscv) {
int ret = 0;
while(1) {
uint32_t instr = riscv->rom[(riscv->pc-riscv->rom_addr_base) >> 2];
printf("pc: %08x instr: %08x\n", riscv->pc, instr);
riscv->pc += 4;
if(riscv->pc >= riscv->rom_addr_base + riscv->rom_size){
uint32_t pc;
while (1) {
if(riscv->pc >= riscv->rom_addr_base + riscv->rom_size || riscv->pc < riscv->rom_addr_base){
printf("riscv run out of rom\n");
break;
}
ret=riscv_decode(riscv, instr);
for (int i = 0;i < 32;i++) {
printf("reg[%d]: %08x\n", i, riscv->reg[i]);
uint32_t instr = riscv->rom[(riscv->pc-riscv->rom_addr_base) >> 2];
printf("pc: %08x instr: %08x\n", riscv->pc, instr);
pc = riscv->pc;
ret = riscv_decode(riscv, instr);
riscv->zero = 0;
// 如果指令修改了pc则以修改后的为准如果pc未被修改则继续执行下一条指令
if (riscv->pc == pc) {
riscv->pc += 4;
}
riscv_print(riscv);
if(ret){
break;
}