Здравствуйте хотел скомпилирывать свой код ml64.exe пишет Код (Text): Microsoft (R) Macro Assembler (x64) Version 10.00.30319.01 Copyright (C) Microsoft Corporation. All rights reserved. Assembling: delsvc.asm delsvc.asm(1) : error A2008:syntax error : . delsvc.asm(2) : error A2008:syntax error : . delsvc.asm(27) : error A2070:invalid instruction operands delsvc.asm(28) : error A2070:invalid instruction operands delsvc.asm(32) : error A2070:invalid instruction operands delsvc.asm(36) : error A2070:invalid instruction operands delsvc.asm(40) : error A2070:invalid instruction operands delsvc.asm(43) : error A2008:syntax error : start delsvc.asm(43) : error A2088:END directive required at end of file There has been an error while assembling this project. Для продолжения нажмите любую клавишу . . . код вроде коректный, собераю как Ml64.exe /c delsvc.asm сам компилятор вытащил из C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\amd64 , и чем отличается он и Microsoft Visual Studio 10.0\VC\bin\x86_amd64 ? Код (Text): .686 .model flat,stdcall option casemap:none includelib library\kernel32.lib includelib library\user32.lib includelib library\shell32.lib includelib library\Advapi32.lib .data? schSCManager dd ? .data szServiceName db "clr_optimization_v2.0.50666_32",0 .code start: OpenSCManagerA PROTO :DWORD,:DWORD,:DWORD push 0F003Fh push 0 push 0 call OpenSCManagerA mov schSCManager,eax OpenServiceA PROTO :DWORD,:DWORD,:DWORD push 10000h push offset szServiceName push schSCManager call OpenServiceA DeleteService PROTO :DWORD push eax call DeleteService CloseServiceHandle PROTO :DWORD push schSCManager call CloseServiceHandle ExitProcess PROTO :DWORD push eax call ExitProcess end start
код не корректный... читайте про регистры x64, выравнивание стека перед вызовом и собственно вызовы винапи функций...
спасибо, про регистеры все понятно а как быть с Код (Text): .686 .model flat,stdcall option casemap:none
дело не только в регистрах и вовсе не в прологе... вы взяли x86 код и пытаетесь его собрать (не портировать, а тупо собрать), это значит, что вы не знаете различий между x86 и x64... еще раз... прочтите про регистры (ну с этим все понятно), про стек (выравнивание перед вызовом и резервирование места для аргументов), и про порядок вызова апи-функции (фастколл)... это на мой взгляд минимальный набор знаний о x64, который лично мне позволяет "выживать" в суровом 64-битном мире))) лучше разберитесь с этим сейчас, чтоб потом с отладчиком меньше ковыряться...
Спасибо за ответ, Вас понял. Может быть дадите ссылки на рускоязычные статьи по этому делу или другой материал.В поисковике даже не смог найти эксэмплев masm64.
Насколько я понял из приведущих тем форума функцмя получает первые 4 парама через регистры - остальные через стек где можно почитать подробнее через какие именно регистры и тд. нашол эксемпл правда fasm Код (Text): sub rsp,8*5 ; reserve stack for API use and make stack dqword aligned mov r9d,0 lea r8,[_caption] lea rdx,[_message] mov rcx,0 call [MessageBoxA] не понял почему стек уменьшается на 8*5 если параметра всего 4 (8 бфйт * 5 параметров) и непонятны регистры типа r9d и r8, насколько я понимаю регистров R8 — R15 ... кароче непонятно ничего... или r9b это 32-ух битный аналог r9 ? зачем тогда так запутывать эксемпл ?
rcx, rdx, r8, r9... погугли на тему вызовов winapi в x64, обязательно что-нить найдется... на стек ещё помимо параметров ляжет адрес возврата, это и есть пятая восьмерка байт, которую нужно учесть при выравнивании... r9d - 32-битная часть r9... так опкод короче наверное... да и последний параметр месажбокса двордом является, это больше наглядность, чем запутывание)))
решил всетаки взять fasm помогите плиз , не работает Код (Text): format PE64 GUI entry start include 'win64a.inc' section '.code' code readable executable start: invoke MessageBoxA,0,message,caption,0 invoke ExitProcess,eax section '.data' data readable caption db 'Win64 assembly program',0 message db 'Hello World!',0 section '.idata' import data readable library kernel,'KERNEL32.DLL',\ user,'USER32.DLL' import kernel,\ ExitProcess,'ExitProcess' import user,\ MessageBoxA,'MessageBoxA'
fragment стек выравнивется на 16 байтную границу точка возврата на старте 8 байт добавляйте sub rsp, 8 после точки входа
Огромное спасибо за ответ! Но поясните пожалуйста зачем выранивать стек ? Это как то свзязано с fastcall ? Такой вот вопрос еще , фунция возвращает значение в rax ? Не могу перенести свой же код с masm32 в fasm64 :\ Непонимаю почему ругается fasm , в masm все работало нормально. http://pastebin.com/FeDy326X вызов такой Код (Text): invoke WriteFile,hFile,addr file,filelen,addr pBytesWritten,0 filelen = 260d file db 04dh, 05ah, 090h, 000h, 003h, 000h, 000h, 000h, 004h, 000h db 000h, 000h, 0ffh, 0ffh, 000h, 000h, 0b8h, 000h, 000h, 000h db 000h, 000h, 000h, 000h, 040h, 000h, 000h, 000h, 000h, 000h
Объясните мне пожалуйста как и для чего выравнивать стек. Хочу использовать регистры и стек а не пользоваца макросом invoke. Обязните на пальцах так сказать я ничего не понимаю.
но почему надо перед началом вызова функций в программе выравнивать стек , раньше такова небыло , и как понять на сколько ? Что значит иногда , я что телепат ? Можно попадробней и с картинками
Впечатление недодуманности всё-таки остаётся. А ну как кто YMM привлечёт? Там по идее надо на восемь байт ровняться...
Не спасибо в общих чертах конечно все понятно но возврат куда получается? И почему раньше на 32x stdcall такова небыло ?