Трейсил на днях свой код. Раз код под x64 то использовал все 15 регистров. Учитывал что пологаться на rdx,rcx,r8,r9 нельзя, думал что все хорошо. Но как оказалось при вызове некоторых функций содержимое r10 изменяется, то есть он не является безопасным, у кого-нибудь были проблемы с регистрами r10-r15?
в мсдн недвузначно написано : кажись он при syscall'е используется и не сохраняется насклько я понял, вот к примеру SetForegroundWindow из юзер32: Код (Text): .text:0000000078C44FC0 SetForegroundWindow proc near .text:0000000078C44FC0 mov edx, 5Bh .text:0000000078C44FC5 jmp ZwUserCallHwndLock .text:0000000078C44FC5 SetForegroundWindow endp .. .text:0000000078C4ED50 ZwUserCallHwndLock proc near .text:0000000078C4ED50 mov r10, rcx .text:0000000078C4ED53 mov eax, 1020h .text:0000000078C4ED58 syscall .text:0000000078C4ED5A retn .text:0000000078C4ED5A ZwUserCallHwndLock endp далее пример кода который демонстрирует что при вызове МеssageBoxA херится r10: Код (Text): extrn MessageBoxA: PROC extrn wsprintfA: PROC public main .data _str db 256 dup (?) _format db "r10 value now equal to 0x%p",0 _hello db 'r10 set to 0ababababababh',0 .code main: sub rsp, 4 * 8 xor rcx, rcx lea rdx, _hello xor r8, r8 xor r9, r9 mov r10, 0ababababababh ; init r10 with our cookies call MessageBoxA ; call api lea rcx, _str lea rdx, _format mov r8, r10 call wsprintfA ; check our cookie xor rcx, rcx lea rdx, _str xor r8, r8 xor r9, r9 call MessageBoxA add rsp, 4 * 8 ret end у меня например результат 4a948290003 апд: зы проспамил тебе аську