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 двух свободных рендеров различен при
|
- Выход плагина НЕдетерминирован: md5 двух свободных рендеров различен при
|
||||||
одинаковом rms (PRNG-дизеринг из LCG-прологов) — метрика только спектральная!
|
одинаковом 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