WIN64 & ml64.exe

Тема в разделе "WASM.X64", создана пользователем CnCVK, 9 авг 2006.

  1. CnCVK

    CnCVK New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2006
    Сообщения:
    108
    Помогите кто-нибудь!
    Проблема с прогой на асме под WIN64 (x64) (пишу тут,так как не обнаружил раздела WIN64:lol: )
    Использую ml64.exe из VS 2005:dntknw:
    Я уже ТРИ дня бьюсь над этим :dntknw:
    Проблема такая:даже простейшее приложение Hello world не работает
    Либо MessageBox вообще не появляется либо все по "тихому" :)
    Если он появляется то при попытке нажать на "крестик".... он исчезает (св.л.чь)
    В дебаггер показывает, что ошибка возникает глубоко в ComCtl32.DLL или UxTheme.DLL
    в SSE комманде=(
    Я смотрел устройство notepad.exe, winmine.exe - ничего не нашел
    Может быть ml64.exe глючит?!
    Помогите кто-нибудь, а то свихнусь скорооооооооо=)
     
  2. Colombo

    Colombo New Member

    Публикаций:
    0
    Регистрация:
    15 авг 2005
    Сообщения:
    20
    а че те так приспичило под вин64 ? юзай fasm.
     
  3. CnCVK

    CnCVK New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2006
    Сообщения:
    108
    Хочется "старья" (синтаксис у ml64.exe похож на 32-bit masm):)
    fasm - это круто:), только там все ручками надо прописывать (для PE64)(import-ы...)
    Тогда уж лучше в простом HEX редакторе делать...
     
  4. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    CnCVK
    Может, стек не выровнен? Покажи весь исходник.
     
  5. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    CnCVK
    Во-первых, приведи код. Во-вторых, что сложного в фасм?
    Код (Text):
    1. ;format PE GUI
    2. format PE64 GUI
    3. entry __start
    4.  
    5. ;include '%fasminc%\win32w.inc'
    6. include '%fasminc%\win64w.inc'
    7. include '%fasminc%\encoding\win1251.inc'
    8.  
    9. data import
    10.     library \
    11.         kernel32,'kernel32',\
    12.         user32,'user32'
    13.    
    14.     import kernel32,    ExitProcess,'ExitProcess'
    15.     import user32,      MessageBox,'MessageBoxW'
    16. end data
    17.  
    18. szApp    du 'Прога 1.0',0
    19. szText   du 'Кроссплатформенность типа',0
    20.  
    21. __start:
    22.     xor     ebx,ebx
    23.     invoke MessageBox,ebx,szText,szApp,MB_ICONINFORMATION
    24.     invoke ExitProcess,eax
     
  6. CnCVK

    CnCVK New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2006
    Сообщения:
    108
    Код (Text):
    1. includelib user32.lib
    2. includelib kernel32.lib
    3.  
    4. extrn __imp_MessageBoxA: QWORD
    5. extrn __imp_ExitProcess: QWORD
    6. MessageBox   EQU __imp_MessageBoxA
    7. ExitProcess    EQU __imp_ExitProcess
    8.  
    9. .data
    10.             dq 0
    11. mytit    db 'Stupid title!', 0
    12. mymsg db 'Hello World!', 0
    13. .code
    14. start:
    15.         mov  r9d, 30h
    16.         lea    r8,  mytit    
    17.         lea    rdx, mymsg
    18.         mov  rcx, 0          
    19.         call   MessageBox
    20.         mov  ecx, eax      
    21.         call   ExitProcess
    22. End
    Я попробовал fasm example вчера - всеравно падает при проходе курсора по кнопке закрытия MessageBox:dntknw:
    (Дело не в Windows - notepad.exe же работает!)
    Также я пробовал добавить этот код в notepad.exe - тоже не работает!
    Это интересно.Я думаю что проблема в стеке
    A SSE требует выравненого обращения к памяти?
     
  7. Dimson

    Dimson New Member

    Публикаций:
    0
    Регистрация:
    7 июл 2005
    Сообщения:
    59
    Адрес:
    Russia
    Что то я не понял в предыдущем листинге. Где параметры для MessageBox-а в стек заталкиваются? Вроде бы надо так:
    push 30h
    push r8
    push rdx
    push 0
    call MessageBox
     
  8. CnCVK

    CnCVK New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2006
    Сообщения:
    108
    Это же WIN64 !
    Первые 4 парама через регистры - остальные через стек:)
     
  9. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    CnCVK
    А место в стеке выделять не будешь?
     
  10. CnCVK

    CnCVK New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2006
    Сообщения:
    108
    это я взял из fasm example:dntknw:
    пробовал и sub esp,(8 * 4) и sub esp,100h:)
    перед MessageBox - нифига:dntknw:
     
  11. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105
    Какие еще ESP - это же 32-битный регистр.
    sub rsp, 28h

    ========================
    MessageBox в блокноте действительно без стека вызывается. Правда там MessageBoxW везде.
    выходят в блокноте вот так :

    mov ecx, eax
    call cs:exit
    ----------------------------
    Смотрю все в IDA64.
     
  12. CnCVK

    CnCVK New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2006
    Сообщения:
    108
    Нет в блокноте тоже со стеком...обрати внимание на начало функции там отводится место для 4 x qword:)
    Рука привычно набирает: esp, ecx, edx, eax - а rsp еще не привык:)
    Хотя это тоже должно работать:)
    Тамже.
     
  13. Colombo

    Colombo New Member

    Публикаций:
    0
    Регистрация:
    15 авг 2005
    Сообщения:
    20
    CnCVK ну что, как будеш извращаться с функциями содержащими SSE ? :p эт те не С1 :]
     
  14. CnCVK

    CnCVK New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2006
    Сообщения:
    108
    Да никак:) В AMD64 SSE используется везде для floating point.
    Самое интересное только я добавил в начало проги
    and rsp, 0FFFFFFFFFFFFFF00h
    все заработало:)
    Теперь другой вопрос: - Какой ALIGN правильный (может 16)?
    И выходит example в FASM неправильный!!!!
     
  15. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Где такое? Покажи.
     
  16. CnCVK

    CnCVK New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2006
    Сообщения:
    108
    Код (Text):
    1. ; Example of 64-bit PE program
    2.  
    3. format PE64 GUI
    4. entry start
    5.  
    6. section '.code' code readable executable
    7.  
    8.   start:
    9.  
    10.     mov r9d,0
    11.     lea r8,[_caption]
    12.     lea rdx,[_message]
    13.     mov rcx,0
    14.     call    [MessageBox]
    15.  
    16.     mov ecx,eax
    17.     call    [ExitProcess]
    18.  
    19. section '.data' data readable writeable
    20.  
    21.   _caption db 'Win64 assembly program',0
    22.   _message db 'Hello World!',0
    23.  
    24. section '.idata' import data readable writeable
    25.  
    26.   dd 0,0,0,RVA kernel_name,RVA kernel_table
    27.   dd 0,0,0,RVA user_name,RVA user_table
    28.   dd 0,0,0,0,0
    29.  
    30.   kernel_table:
    31.     ExitProcess dq RVA _ExitProcess
    32.     dq 0
    33.   user_table:
    34.     MessageBox dq RVA _MessageBoxA
    35.     dq 0
    36.  
    37.   kernel_name db 'KERNEL32.DLL',0
    38.   user_name db 'USER32.DLL',0
    39.  
    40.   _ExitProcess dw 0
    41.     db 'ExitProcess',0
    42.   _MessageBoxA dw 0
    43.     db 'MessageBoxA',0
    Из FASM (PE64DEMO)
    Тут не выделяется из стека (8 * 4) байт и стек не выровнен:dntknw:
     
  17. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Сомневаюсь. Работает и под отладчиком, и так. rsp на EP 0x7FF78.
     
  18. CnCVK

    CnCVK New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2006
    Сообщения:
    108
    Какую ось используещь?
    Может ты просто по кнопке "OK" шелкаешь?
    Попробуй закрыть через крестик:)
    И в мануалах microsoft и amd написано это.
     
  19. green

    green New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2003
    Сообщения:
    1.217
    Адрес:
    Ukraine
    Может работать из без этого, зависит от того, как использует вызываемая ф-ция свои аргументы.
    Например, если берется адрес регистрового аргумента, то компилятор С автоматически "приземляет" его на стек.

    А стек должен быть выровнен на 16 байт. Иначе, кажется, будут проблемы с системными вызовами.