From 5a2bf5d9cc7fa7c1899996c68ceee906dd1c6388 Mon Sep 17 00:00:00 2001 From: "yu.dongliang" <18588496441@163.com> Date: Thu, 29 Jan 2026 16:57:55 +0800 Subject: [PATCH] print Naja binary instruction when dis-asm --- vm/scf_vm_naja.c | 21 +++++++++++++++------ vm/scf_vm_naja_asm.c | 10 +++++----- 2 files changed, 20 insertions(+), 11 deletions(-) diff --git a/vm/scf_vm_naja.c b/vm/scf_vm_naja.c index 12468b4..b4eabe4 100644 --- a/vm/scf_vm_naja.c +++ b/vm/scf_vm_naja.c @@ -2416,7 +2416,7 @@ static int __naja_call_reg(scf_vm_t* vm, uint32_t inst) int rd = (inst >> 21) & 0x1f; - naja->regs[NAJA_REG_LR] = naja->ip + 4; + naja->regs[NAJA_REG_LR] = SCF_VM_ADDR(vm, naja->ip + 4); if (naja_vm_dynamic_link == (void*)naja->regs[rd]) { @@ -2430,6 +2430,11 @@ static int __naja_call_reg(scf_vm_t* vm, uint32_t inst) naja->ip = naja->regs[NAJA_REG_LR]; + if (naja->ip >= (uint64_t)vm->text->data + && naja->ip < (uint64_t)vm->text->data + vm->text->len) { + naja->ip = SCF_ELF_ADDR(vm, naja->ip); + } + } else if (naja->regs[rd] < vm->text->addr || naja->regs[rd] > vm->text->addr + vm->text->len) { @@ -2453,6 +2458,11 @@ static int __naja_call_reg(scf_vm_t* vm, uint32_t inst) naja->fvec[7].d[0]); naja->ip = naja->regs[NAJA_REG_LR]; + + if (naja->ip >= (uint64_t)vm->text->data + && naja->ip < (uint64_t)vm->text->data + vm->text->len) { + naja->ip = SCF_ELF_ADDR(vm, naja->ip); + } } else { NAJA_PRINTF("call r%d, %#lx\n", rd, naja->regs[rd]); naja->ip = naja->regs[rd]; @@ -2527,13 +2537,11 @@ static int __naja_ret(scf_vm_t* vm, uint32_t inst) { scf_vm_naja_t* naja = vm->priv; - naja->ip = naja->regs[NAJA_REG_LR]; int64_t sp = -naja->regs[NAJA_REG_SP]; - assert (sp >= 0); - if (naja->size > sp + STACK_INC) { - + if (naja->size > sp + STACK_INC) + { void* p = realloc(naja->stack, sp + STACK_INC); if (!p) { scf_loge("\n"); @@ -2544,6 +2552,8 @@ static int __naja_ret(scf_vm_t* vm, uint32_t inst) naja->size = sp + STACK_INC; } + naja->ip = naja->regs[NAJA_REG_LR]; + if (naja->ip >= (uint64_t)vm->text->data && naja->ip < (uint64_t)vm->text->data + vm->text->len) { naja->ip = SCF_ELF_ADDR(vm, naja->ip); @@ -2754,7 +2764,6 @@ static int __naja_vm_run(scf_vm_t* vm, const char* path, const char* sys) uint32_t inst = *(uint32_t*)(vm->text->data + offset); naja_opcode_pt pt = naja_opcodes[(inst >> 26) & 0x3f]; - if (!pt) { scf_loge("inst: %d, %#x\n", (inst >> 26) & 0x3f, inst); return -EINVAL; diff --git a/vm/scf_vm_naja_asm.c b/vm/scf_vm_naja_asm.c index 63c64ea..0ea09f2 100644 --- a/vm/scf_vm_naja_asm.c +++ b/vm/scf_vm_naja_asm.c @@ -1056,20 +1056,20 @@ static int __naja_vm_run(scf_vm_t* vm, const char* path, const char* sys) printf("\n%s: \n", s->name); int j; - for (j = 0; j < s->st_size; j+= 4) { + for (j = 0; j < s->st_size; j += 4) { uint32_t inst = *(uint32_t*)(vm->text->data + offset + j); naja_opcode_pt pt = naja_opcodes[(inst >> 26) & 0x3f]; + naja->ip = vm->text->addr + offset + j; + if (!pt) { - scf_loge("inst: %d, %#x\n", (inst >> 26) & 0x3f, inst); + scf_loge("%4d, %#lx: inst: %d, %08x\n", j, naja->ip, (inst >> 26) & 0x3f, inst); continue; } - naja->ip = vm->text->addr + offset + j; - - printf("%4d, %#lx: ", j, naja->ip); + printf("%4d, %#lx: %08x | ", j, naja->ip, inst); ret = pt(vm, inst); if (ret < 0) { -- 2.25.1