24t: exact semantics th2030=mul / th2270=add (with special cases); FUN_180563a60 identified as init-time dB-domain table builder (log x 8.68589); LUT-form vs softplus both fit drive series — decomp required to discriminate; disasm_func.py tool
This commit is contained in:
@@ -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.
|
||||
|
||||
@@ -0,0 +1,58 @@
|
||||
#!/usr/bin/env python3
|
||||
"""disasm_func.py — full-function disassembler with resolved RIP constants.
|
||||
Usage: disasm_func.py <VA> [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('<f', b4[:4])[0]
|
||||
f64v = struct.unpack('<d', b4[:8])[0]
|
||||
u64v = struct.unpack('<Q', b4[:8])[0]
|
||||
if abs(f32v) > 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()
|
||||
Reference in New Issue
Block a user