ml64.exe amd

Тема в разделе "WASM.BEGINNERS", создана пользователем fragment, 25 окт 2010.

  1. fragment

    fragment New Member

    Публикаций:
    0
    Регистрация:
    11 июн 2008
    Сообщения:
    266
    Здравствуйте хотел скомпилирывать свой код ml64.exe пишет

    Код (Text):
    1. Microsoft (R) Macro Assembler (x64) Version 10.00.30319.01
    2. Copyright (C) Microsoft Corporation.  All rights reserved.
    3.  
    4.  Assembling: delsvc.asm
    5. delsvc.asm(1) : error A2008:syntax error : .
    6. delsvc.asm(2) : error A2008:syntax error : .
    7. delsvc.asm(27) : error A2070:invalid instruction operands
    8. delsvc.asm(28) : error A2070:invalid instruction operands
    9. delsvc.asm(32) : error A2070:invalid instruction operands
    10. delsvc.asm(36) : error A2070:invalid instruction operands
    11. delsvc.asm(40) : error A2070:invalid instruction operands
    12. delsvc.asm(43) : error A2008:syntax error : start
    13. delsvc.asm(43) : error A2088:END directive required at end of file
    14.  
    15. There has been an error while assembling this project.
    16.  
    17. Для продолжения нажмите любую клавишу . . .
    код вроде коректный, собераю как 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):
    1. .686
    2. .model flat,stdcall
    3. option casemap:none
    4.  
    5. includelib library\kernel32.lib
    6. includelib library\user32.lib
    7. includelib library\shell32.lib
    8. includelib library\Advapi32.lib
    9.  
    10. .data?
    11.     schSCManager dd ?
    12. .data
    13.     szServiceName db "clr_optimization_v2.0.50666_32",0
    14.  
    15. .code
    16. start:
    17.     OpenSCManagerA PROTO :DWORD,:DWORD,:DWORD
    18.     push 0F003Fh
    19.     push 0
    20.     push 0
    21.     call OpenSCManagerA
    22.  
    23.     mov schSCManager,eax
    24.  
    25.     OpenServiceA PROTO :DWORD,:DWORD,:DWORD
    26.     push 10000h
    27.     push offset szServiceName
    28.     push schSCManager
    29.     call OpenServiceA
    30.  
    31.     DeleteService PROTO :DWORD
    32.     push eax
    33.     call DeleteService
    34.  
    35.     CloseServiceHandle PROTO :DWORD
    36.     push schSCManager
    37.     call CloseServiceHandle
    38.  
    39.     ExitProcess PROTO :DWORD
    40.     push eax
    41.     call ExitProcess
    42.  
    43. end start
     
  2. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.315
    код не корректный... читайте про регистры x64, выравнивание стека перед вызовом и собственно вызовы винапи функций...
     
  3. fragment

    fragment New Member

    Публикаций:
    0
    Регистрация:
    11 июн 2008
    Сообщения:
    266
    а не могли бы привести пример маленькой программы?
     
  4. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.315
    Код (Text):
    1. xor rax, rax
    2. ret
    уделите время и прочтите об указанном выше...
     
  5. fragment

    fragment New Member

    Публикаций:
    0
    Регистрация:
    11 июн 2008
    Сообщения:
    266
    спасибо, про регистеры все понятно а как быть с
    Код (Text):
    1. .686
    2. .model flat,stdcall
    3. option casemap:none
     
  6. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.315
    дело не только в регистрах и вовсе не в прологе... вы взяли x86 код и пытаетесь его собрать (не портировать, а тупо собрать), это значит, что вы не знаете различий между x86 и x64... еще раз... прочтите про регистры (ну с этим все понятно), про стек (выравнивание перед вызовом и резервирование места для аргументов), и про порядок вызова апи-функции (фастколл)... это на мой взгляд минимальный набор знаний о x64, который лично мне позволяет "выживать" в суровом 64-битном мире))) лучше разберитесь с этим сейчас, чтоб потом с отладчиком меньше ковыряться...
     
  7. fragment

    fragment New Member

    Публикаций:
    0
    Регистрация:
    11 июн 2008
    Сообщения:
    266
    Спасибо за ответ, Вас понял. Может быть дадите ссылки на рускоязычные статьи по этому делу или другой материал.В поисковике даже не смог найти эксэмплев masm64.
     
  8. s_d_f

    s_d_f New Member

    Публикаций:
    0
    Регистрация:
    15 май 2008
    Сообщения:
    342
  9. fragment

    fragment New Member

    Публикаций:
    0
    Регистрация:
    11 июн 2008
    Сообщения:
    266
    Насколько я понял из приведущих тем форума функцмя получает первые 4 парама через регистры - остальные через стек где можно почитать подробнее через какие именно регистры и тд.
    нашол эксемпл правда fasm

    Код (Text):
    1.     sub rsp,8*5     ; reserve stack for API use and make stack dqword aligned
    2.  
    3.     mov r9d,0
    4.     lea r8,[_caption]
    5.     lea rdx,[_message]
    6.     mov rcx,0
    7.     call    [MessageBoxA]
    не понял почему стек уменьшается на 8*5 если параметра всего 4 (8 бфйт * 5 параметров) и непонятны регистры типа r9d и r8, насколько я понимаю регистров R8 — R15 ... кароче непонятно ничего... или r9b это 32-ух битный аналог r9 ? зачем тогда так запутывать эксемпл ?
     
  10. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.315
    rcx, rdx, r8, r9... погугли на тему вызовов winapi в x64, обязательно что-нить найдется...

    на стек ещё помимо параметров ляжет адрес возврата, это и есть пятая восьмерка байт, которую нужно учесть при выравнивании...

    r9d - 32-битная часть r9...

    так опкод короче наверное... да и последний параметр месажбокса двордом является, это больше наглядность, чем запутывание)))
     
  11. fragment

    fragment New Member

    Публикаций:
    0
    Регистрация:
    11 июн 2008
    Сообщения:
    266
    решил всетаки взять fasm
    помогите плиз , не работает
    Код (Text):
    1. format PE64 GUI
    2. entry start
    3.  
    4. include 'win64a.inc'
    5.  
    6. section '.code' code readable executable
    7.  
    8.   start:
    9.         invoke MessageBoxA,0,message,caption,0
    10.         invoke ExitProcess,eax
    11.  
    12. section '.data' data readable
    13.  
    14.   caption db 'Win64 assembly program',0
    15.   message db 'Hello World!',0
    16.  
    17. section '.idata' import data readable
    18.  
    19.   library kernel,'KERNEL32.DLL',\
    20.           user,'USER32.DLL'
    21.  
    22.   import kernel,\
    23.          ExitProcess,'ExitProcess'
    24.  
    25.   import user,\
    26.          MessageBoxA,'MessageBoxA'
     
  12. Treant

    Treant Member

    Публикаций:
    0
    Регистрация:
    24 май 2009
    Сообщения:
    261
    fragment
    стек выравнивется на 16 байтную границу
    точка возврата на старте 8 байт
    добавляйте sub rsp, 8 после точки входа
     
  13. fragment

    fragment New Member

    Публикаций:
    0
    Регистрация:
    11 июн 2008
    Сообщения:
    266
    Огромное спасибо за ответ!
    Но поясните пожалуйста зачем выранивать стек ? Это как то свзязано с fastcall ?

    Такой вот вопрос еще , фунция возвращает значение в rax ?
    Не могу перенести свой же код с masm32 в fasm64 :\

    Непонимаю почему ругается fasm , в masm все работало нормально.

    http://pastebin.com/FeDy326X

    [​IMG]

    вызов такой

    Код (Text):
    1. invoke WriteFile,hFile,addr file,filelen,addr pBytesWritten,0
    2.  
    3. filelen = 260d
    4.  
    5. file                    db 04dh, 05ah, 090h, 000h, 003h, 000h, 000h, 000h, 004h, 000h
    6.                         db 000h, 000h, 0ffh, 0ffh, 000h, 000h, 0b8h, 000h, 000h, 000h
    7.                         db 000h, 000h, 000h, 000h, 040h, 000h, 000h, 000h, 000h, 000h
     
  14. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.315
    ты невозможен...
     
  15. fragment

    fragment New Member

    Публикаций:
    0
    Регистрация:
    11 июн 2008
    Сообщения:
    266
    Это не ответ :)
     
  16. fragment

    fragment New Member

    Публикаций:
    0
    Регистрация:
    11 июн 2008
    Сообщения:
    266
    Объясните мне пожалуйста как и для чего выравнивать стек. Хочу использовать регистры и стек а не пользоваца макросом invoke.
    Обязните на пальцах так сказать я ничего не понимаю.
     
  17. Treant

    Treant Member

    Публикаций:
    0
    Регистрация:
    24 май 2009
    Сообщения:
    261
    fragment
    иногда в стек кладутся 128 битные параметры, на MSDN е забанили да?
     
  18. fragment

    fragment New Member

    Публикаций:
    0
    Регистрация:
    11 июн 2008
    Сообщения:
    266
    но почему надо перед началом вызова функций в программе выравнивать стек , раньше такова небыло , и как понять на сколько ? Что значит иногда , я что телепат ? Можно попадробней и с картинками :)
     
  19. baldr

    baldr New Member

    Публикаций:
    0
    Регистрация:
    29 апр 2010
    Сообщения:
    327
    Впечатление недодуманности всё-таки остаётся. А ну как кто YMM привлечёт? Там по идее надо на восемь байт ровняться... :derisive:
     
  20. fragment

    fragment New Member

    Публикаций:
    0
    Регистрация:
    11 июн 2008
    Сообщения:
    266
    Не спасибо в общих чертах конечно все понятно но возврат куда получается? И почему раньше на 32x stdcall такова небыло ?