Помогите кто-нибудь! Проблема с прогой на асме под WIN64 (x64) (пишу тут,так как не обнаружил раздела WIN64) Использую ml64.exe из VS 2005 Я уже ТРИ дня бьюсь над этим Проблема такая:даже простейшее приложение Hello world не работает Либо MessageBox вообще не появляется либо все по "тихому" Если он появляется то при попытке нажать на "крестик".... он исчезает (св.л.чь) В дебаггер показывает, что ошибка возникает глубоко в ComCtl32.DLL или UxTheme.DLL в SSE комманде=( Я смотрел устройство notepad.exe, winmine.exe - ничего не нашел Может быть ml64.exe глючит?! Помогите кто-нибудь, а то свихнусь скорооооооооо=)
Хочется "старья" (синтаксис у ml64.exe похож на 32-bit masm) fasm - это круто, только там все ручками надо прописывать (для PE64)(import-ы...) Тогда уж лучше в простом HEX редакторе делать...
CnCVK Во-первых, приведи код. Во-вторых, что сложного в фасм? Код (Text): ;format PE GUI format PE64 GUI entry __start ;include '%fasminc%\win32w.inc' include '%fasminc%\win64w.inc' include '%fasminc%\encoding\win1251.inc' data import library \ kernel32,'kernel32',\ user32,'user32' import kernel32, ExitProcess,'ExitProcess' import user32, MessageBox,'MessageBoxW' end data szApp du 'Прога 1.0',0 szText du 'Кроссплатформенность типа',0 __start: xor ebx,ebx invoke MessageBox,ebx,szText,szApp,MB_ICONINFORMATION invoke ExitProcess,eax
Код (Text): includelib user32.lib includelib kernel32.lib extrn __imp_MessageBoxA: QWORD extrn __imp_ExitProcess: QWORD MessageBox EQU __imp_MessageBoxA ExitProcess EQU __imp_ExitProcess .data dq 0 mytit db 'Stupid title!', 0 mymsg db 'Hello World!', 0 .code start: mov r9d, 30h lea r8, mytit lea rdx, mymsg mov rcx, 0 call MessageBox mov ecx, eax call ExitProcess End Я попробовал fasm example вчера - всеравно падает при проходе курсора по кнопке закрытия MessageBox (Дело не в Windows - notepad.exe же работает!) Также я пробовал добавить этот код в notepad.exe - тоже не работает! Это интересно.Я думаю что проблема в стеке A SSE требует выравненого обращения к памяти?
Что то я не понял в предыдущем листинге. Где параметры для MessageBox-а в стек заталкиваются? Вроде бы надо так: push 30h push r8 push rdx push 0 call MessageBox
Какие еще ESP - это же 32-битный регистр. sub rsp, 28h ======================== MessageBox в блокноте действительно без стека вызывается. Правда там MessageBoxW везде. выходят в блокноте вот так : mov ecx, eax call cs:exit ---------------------------- Смотрю все в IDA64.
Нет в блокноте тоже со стеком...обрати внимание на начало функции там отводится место для 4 x qword Рука привычно набирает: esp, ecx, edx, eax - а rsp еще не привык Хотя это тоже должно работать Тамже.
Да никак В AMD64 SSE используется везде для floating point. Самое интересное только я добавил в начало проги and rsp, 0FFFFFFFFFFFFFF00h все заработало Теперь другой вопрос: - Какой ALIGN правильный (может 16)? И выходит example в FASM неправильный!!!!
Код (Text): ; Example of 64-bit PE program format PE64 GUI entry start section '.code' code readable executable start: mov r9d,0 lea r8,[_caption] lea rdx,[_message] mov rcx,0 call [MessageBox] mov ecx,eax call [ExitProcess] section '.data' data readable writeable _caption db 'Win64 assembly program',0 _message db 'Hello World!',0 section '.idata' import data readable writeable dd 0,0,0,RVA kernel_name,RVA kernel_table dd 0,0,0,RVA user_name,RVA user_table dd 0,0,0,0,0 kernel_table: ExitProcess dq RVA _ExitProcess dq 0 user_table: MessageBox dq RVA _MessageBoxA dq 0 kernel_name db 'KERNEL32.DLL',0 user_name db 'USER32.DLL',0 _ExitProcess dw 0 db 'ExitProcess',0 _MessageBoxA dw 0 db 'MessageBoxA',0 Из FASM (PE64DEMO) Тут не выделяется из стека (8 * 4) байт и стек не выровнен
Какую ось используещь? Может ты просто по кнопке "OK" шелкаешь? Попробуй закрыть через крестик И в мануалах microsoft и amd написано это.
Может работать из без этого, зависит от того, как использует вызываемая ф-ция свои аргументы. Например, если берется адрес регистрового аргумента, то компилятор С автоматически "приземляет" его на стек. А стек должен быть выровнен на 16 байт. Иначе, кажется, будут проблемы с системными вызовами.