From 5bd60cfefd96be61db54e8f3131697cbb384803c Mon Sep 17 00:00:00 2001 From: Matiq Date: Mon, 24 Aug 2026 22:13:01 +0300 Subject: [PATCH] =?UTF-8?q?24t:=20exact=20semantics=20th2030=3Dmul=20/=20t?= =?UTF-8?q?h2270=3Dadd=20(with=20special=20cases);=20FUN=5F180563a60=20ide?= =?UTF-8?q?ntified=20as=20init-time=20dB-domain=20table=20builder=20(log?= =?UTF-8?q?=20x=208.68589);=20LUT-form=20vs=20softplus=20both=20fit=20driv?= =?UTF-8?q?e=20series=20=E2=80=94=20decomp=20required=20to=20discriminate;?= =?UTF-8?q?=20disasm=5Ffunc.py=20tool?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- handoff/BLOCKMAP_529fe0.md | 33 ++++++++++++++++++++++ scripts/disasm_func.py | 58 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 91 insertions(+) create mode 100644 scripts/disasm_func.py diff --git a/handoff/BLOCKMAP_529fe0.md b/handoff/BLOCKMAP_529fe0.md index d066d33..4b9ae96 100644 --- a/handoff/BLOCKMAP_529fe0.md +++ b/handoff/BLOCKMAP_529fe0.md @@ -287,3 +287,36 @@ ILT-резолв bigkernel-стабов даёт impl в 141100..141940 — вс использует закэшированный кернел; либо трассировать надо момент инициализации - Выход плагина НЕдетерминирован: md5 двух свободных рендеров различен при одинаковом rms (PRNG-дизеринг из LCG-прологов) — метрика только спектральная! + +## ДОПОЛНЕНИЕ 24t: ТОЧНЫЕ СЕМАНТИКИ СКАЛЯР-ОПОВ + опознание 563a60 + +Инструмент: scripts/disasm_func.py (полный дизасм функции с резолвом +RIP-констант инлайн). + +### Тела скаляр-трансформов (float-ветки): +| стаб/impl | семантика | спец-случаи | +|---|---|---| +| th2030→ffe0 | dst[i] *= scalar | scalar==1 → скип; ==0 → zero-fill | +| th2270→14c40 | dst[i] += scalar | scalar==0 → скип | +Оба: скалярный хвост + AVX2 основной цикл (vmulps/vaddps ymm). Двойные +ветки (1d30/22a0) аналогичны на sd/pd. + +### FUN_180563a60 = init-time ПОСТРОИТЕЛЬ таблицы (не per-bin!) +- Один caller: 1805636c2 (init-семейство). +- Константы пролога: xmm11=8.68589 (20/ln10 — ln⇒дБ!), xmm12=1/1024, + xmm14=0.5, xmm10=2, xmm9=−1, xmm6=1; вызов IAT 181a14cd0 (log-класс) + над double из [obj+0x4198], ×8.68589 → дБ, запись пар во вектор + ([obj+0xe0], рост через realloc 56c640). +- Вывод: строит дБ-доменную таблицу парами при param-rebuild — согласуется + с «LUT» ролью. Хвост с вирт. вызовом [rax+0x10] не декодирован. + +### Алгебра T1: обе формы фитуют серию драйва (8 точек недоопределены) +- softplus α·ln1p(L/β)+c: rms 0.016 (α=3.2193 β=0.4927 c=0.542) +- LUT-форма t=((dB−A)/(B−A))^γ·M: rms 0.029 (A=−36.2 B=20.0 γ=2.097 M=10.49) +Различить только декомпом тракта am/res→scratch или бОльшим числом точек. + +### Открытые микровопросы +1. Значение xmm7 на входе th2270 в FIR-цикле (52b5f6): трассировка от + 52a583; если mix^p=1 → «bands+=1» противоречит провалам ⇒ xmm7 иной + либо порядок аргументов иной. +2. Раскладка объекта-вектора (тег 6) для ops A–D. diff --git a/scripts/disasm_func.py b/scripts/disasm_func.py new file mode 100644 index 0000000..09d0b28 --- /dev/null +++ b/scripts/disasm_func.py @@ -0,0 +1,58 @@ +#!/usr/bin/env python3 +"""disasm_func.py — full-function disassembler with resolved RIP constants. +Usage: disasm_func.py [max_bytes] +Stops on int3-run after a ret. Prints resolved [rip+X] targets inline. +""" +import sys +import struct +from capstone import Cs, CS_ARCH_X86, CS_MODE_64 +from capstone.x86 import X86_OP_MEM, X86_REG_RIP + +BASE = 0x180000000 +_data = open('/home/m/re-tools/soothe_mem.bin', 'rb').read() + +def rd(va, n): + return _data[va - BASE: va - BASE + n] + +def main(): + va = int(sys.argv[1], 16) + maxb = int(sys.argv[2], 16) if len(sys.argv) > 2 else 0x4000 + code = rd(va, maxb) + md = Cs(CS_ARCH_X86, CS_MODE_64) + md.detail = True + out = [] + run_int3 = 0 + seen_ret = False + for ins in md.disasm(code, va): + line = '%08x %-22s %s %s' % (ins.address, ins.bytes.hex(), ins.mnemonic, ins.op_str) + note = '' + for op in ins.operands: + if op.type == X86_OP_MEM and op.mem.base == X86_REG_RIP: + tgt = ins.address + ins.size + op.mem.disp + note += ' ; ->%x' % tgt + b4 = rd(tgt, 8) + f32v = struct.unpack(' 1e-6 and abs(f32v) < 1e8: + note += ' f32=%.6g' % f32v + elif abs(f64v) > 1e-6 and abs(f64v) < 1e12: + note += ' f64=%.6g' % f64v + else: + note += ' u64=%x' % u64v + line += note + out.append(line) + if ins.mnemonic == 'ret': + seen_ret = True + run_int3 = 0 + elif ins.mnemonic == 'int3': + if seen_ret: + run_int3 += 1 + if run_int3 >= 4: + break + else: + run_int3 = 0 + print('\n'.join(out)) + +if __name__ == '__main__': + main()