print Naja binary instruction when dis-asm master
authoryu.dongliang <18588496441@163.com>
Thu, 29 Jan 2026 08:57:55 +0000 (16:57 +0800)
committeryu.dongliang <18588496441@163.com>
Thu, 29 Jan 2026 08:57:55 +0000 (16:57 +0800)
vm/scf_vm_naja.c
vm/scf_vm_naja_asm.c

index 12468b466d8be36fac067d08ca031bd1c430dbba..b4eabe45c1bcbddb7cda71291bcacaf0680c278c 100644 (file)
@@ -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;
index 63c64ea9a47bd279dc4da81745274dba0d3578f3..0ea09f2facc1d5e86fe259ab3b7023e1499e6f3b 100644 (file)
@@ -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) {