Проблемы с r10

Тема в разделе "WASM.X64", создана пользователем Guest, 27 сен 2007.

  1. Guest

    Guest Guest

    Публикаций:
    0
    Трейсил на днях свой код. Раз код под x64 то использовал все 15 регистров. Учитывал что пологаться на rdx,rcx,r8,r9 нельзя, думал что все хорошо. Но как оказалось при вызове некоторых функций содержимое r10 изменяется, то есть он не является безопасным, у кого-нибудь были проблемы с регистрами r10-r15?
     
  2. rain

    rain New Member

    Публикаций:
    0
    Регистрация:
    22 апр 2006
    Сообщения:
    976
    в мсдн недвузначно написано :
    кажись он при syscall'е используется и не сохраняется насклько я понял, вот к примеру SetForegroundWindow из юзер32:
    Код (Text):
    1. .text:0000000078C44FC0 SetForegroundWindow proc near
    2. .text:0000000078C44FC0                 mov     edx, 5Bh
    3. .text:0000000078C44FC5                 jmp     ZwUserCallHwndLock
    4. .text:0000000078C44FC5 SetForegroundWindow endp
    5. ..
    6. .text:0000000078C4ED50 ZwUserCallHwndLock proc near
    7. .text:0000000078C4ED50                 mov     r10, rcx
    8. .text:0000000078C4ED53                 mov     eax, 1020h
    9. .text:0000000078C4ED58                 syscall
    10. .text:0000000078C4ED5A                 retn
    11. .text:0000000078C4ED5A ZwUserCallHwndLock endp
    далее пример кода который демонстрирует что при вызове МеssageBoxA херится r10:
    Код (Text):
    1. extrn MessageBoxA: PROC
    2. extrn wsprintfA: PROC
    3. public main
    4.  
    5. .data
    6.     _str db 256 dup (?)
    7.     _format db "r10 value now equal to 0x%p",0
    8.     _hello db 'r10 set to 0ababababababh',0  
    9.  
    10. .code
    11.    
    12. main:
    13.  
    14.     sub rsp, 4 * 8
    15.    
    16.     xor rcx, rcx
    17.     lea rdx, _hello
    18.     xor r8, r8
    19.     xor r9, r9
    20.     mov r10, 0ababababababh ; init r10 with our cookies
    21.     call MessageBoxA           ; call api
    22.  
    23.     lea rcx, _str
    24.     lea rdx, _format
    25.     mov r8, r10    
    26.     call wsprintfA          ; check our cookie
    27.  
    28.     xor rcx, rcx
    29.     lea rdx, _str
    30.     xor r8, r8
    31.     xor r9, r9
    32.     call MessageBoxA
    33.  
    34.     add rsp, 4 * 8
    35.     ret
    36. end
    у меня например результат 4a948290003

    апд:
    зы проспамил тебе аську :)
     
  3. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    im1111
    Доки не читаем, да?
     
  4. Guest

    Guest Guest

    Публикаций:
    0
    Читаем синенькие книжечки :)))
     
  5. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Кроме синеньких книжечек надо знать и правила ОС, под которую пишешь.
     
  6. Guest

    Guest Guest

    Публикаций:
    0
    Соглашусь, пропустил маленько. Обычно у меня до всех регситров не доходило дело или я писал на Си.