fix: _x64_set_offset_for_jmps() for number label for ASM
authoryu.dongliang <18588496441@163.com>
Sat, 10 Jan 2026 14:57:01 +0000 (22:57 +0800)
committeryu.dongliang <18588496441@163.com>
Sat, 10 Jan 2026 14:57:01 +0000 (22:57 +0800)
asm/scf_dfa_inst.c
native/scf_instruction.h

index feb6422ad4813fb61d14567ec03a49c44d33e5aa..509ab66b5dc08f254ec9a88871499296202a461b 100644 (file)
@@ -841,7 +841,6 @@ int _x64_set_offset_for_jmps(scf_vector_t* text)
                                && (inst->OpCode->type < SCF_X64_JZ || inst->OpCode->type > SCF_X64_JMP))
                        continue;
 
-               int32_t  bytes = 0;
                uint32_t label = *(uint32_t*)(inst->code + inst->len - 4);
                uint32_t flag  = label & 0xff;
                label >>= 8;
@@ -885,6 +884,8 @@ int _x64_set_offset_for_jmps(scf_vector_t* text)
                        default:
                                break;
                };
+
+               inst->flag = flag;
        }
 
        while (1) {
@@ -900,36 +901,38 @@ int _x64_set_offset_for_jmps(scf_vector_t* text)
                                        && (inst->OpCode->type < SCF_X64_JZ || inst->OpCode->type > SCF_X64_JMP))
                                continue;
 
-                       int32_t  bytes = 0;
-                       uint32_t label = *(uint32_t*)(inst->code + inst->len - 4);
-                       uint32_t front = label & 0xff;
-                       label >>= 8;
+                       int32_t bytes = 0;
 
-                       if (front) {
-                               for (j = i + 1; j < text->size; j++) {
-                                       dst           = text->data[j];
+                       switch (inst->flag) {
+                               case 1:
+                                       for (j = i; j >= 0; j--) {
+                                               dst = text->data[j];
 
-                                       if (dst == inst->next)
-                                               break;
+                                               if (dst->len > 0)
+                                                       bytes -= dst->len;
+                                               else if (dst->bin)
+                                                       bytes -= dst->bin->len;
 
-                                       if (dst->len > 0)
-                                               bytes += dst->len;
-                                       else if (dst->bin)
-                                               bytes += dst->bin->len;
-                               }
-                       } else {
-                               for (j = i; j >= 0; j--) {
-                                       dst = text->data[j];
+                                               if (dst == inst->next)
+                                                       break;
+                                       }
+                                       break;
+                               case 2:
+                                       for (j = i + 1; j < text->size; j++) {
+                                               dst           = text->data[j];
 
-                                       if (dst->len > 0)
-                                               bytes -= dst->len;
-                                       else if (dst->bin)
-                                               bytes -= dst->bin->len;
+                                               if (dst == inst->next)
+                                                       break;
 
-                                       if (dst == inst->next)
-                                               break;
-                               }
-                       }
+                                               if (dst->len > 0)
+                                                       bytes += dst->len;
+                                               else if (dst->bin)
+                                                       bytes += dst->bin->len;
+                                       }
+                                       break;
+                               default:
+                                       break;
+                       };
 
                        scf_x64_OpCode_t* opcode = (scf_x64_OpCode_t*)inst->OpCode;
                        int n_bytes = 4;
index bd08f01b2ca4eb9e4318090eef5a2e8b3851facb..37c0b0ec1cb847ac0f504fb93cb6ffd0e2b61766 100644 (file)
@@ -66,6 +66,7 @@ struct scf_instruction_s
        int                 len;
        uint8_t             code[32];
 
+       int                 flag;  // asm jcc back or front
        int                 nb_used;
 };