From: yu.dongliang <18588496441@163.com> Date: Sat, 10 Jan 2026 14:57:01 +0000 (+0800) Subject: fix: _x64_set_offset_for_jmps() for number label for ASM X-Git-Url: http://baseworks.info/?a=commitdiff_plain;h=5d9875bacd3c48ca9af2809734525fa9ec70ea76;p=scf.git fix: _x64_set_offset_for_jmps() for number label for ASM --- diff --git a/asm/scf_dfa_inst.c b/asm/scf_dfa_inst.c index feb6422..509ab66 100644 --- a/asm/scf_dfa_inst.c +++ b/asm/scf_dfa_inst.c @@ -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; diff --git a/native/scf_instruction.h b/native/scf_instruction.h index bd08f01..37c0b0e 100644 --- a/native/scf_instruction.h +++ b/native/scf_instruction.h @@ -66,6 +66,7 @@ struct scf_instruction_s int len; uint8_t code[32]; + int flag; // asm jcc back or front int nb_used; };