Как собрать ассемблерный проект x64 в visual studio 2017/2019 - PullRequest
2 голосов
/ 09 января 2020

Следующий код работает, когда я устанавливаю 'debug' на 'x86'

.386
.model flat, stdcall
.stack 4096
ExitProcess PROTO, dwExitCode: DWORD

.data
     ; define your variables here
.code

main PROC
    ; write your assembly code herer
    mov eax ,3
    mov ebx ,8
    add eax, ebx

   INVOKE ExitProcess ,0
main ENDP
END main

, но не работает, когда я изменяю 'x86' на 'x64' u

также происходит сбой, если я пытаюсь использовать 64-битный регистр как rax

1 Ответ

4 голосов
/ 10 января 2020

Во-первых, пожалуйста, взгляните на мою статью "Как создать проект x64 / x86 с помощью отдельного файла сборки x64 / x86" .

Давайте через go пройдем сообщения об ошибках одно за другим (вы можете переместить курсор на строку ошибки, дважды щелкнув сообщение об ошибке):

A2008 syntax error : . test main.asm 1

Директива .386 допускается только в 32-битном MASM (ML.EXE). Это не разрешено в ML64 (ML64.EXE). ML64 «знает» все инструкции, которые он может знать.

A2008 syntax error : . test main.asm 2

Директива .MODEL разрешена только в 32-битном MASM (ml.exe). Это не разрешено в ML64 (ML64.EXE). ML64 по умолчанию использует плоскую модель и соглашение о вызовах x64 ( не C, BASI C, FORTRAN, PASCAL, SYSCALL или STDCALL).

A2008 syntax error : . test main.asm 3

Директива .STACK является версией c эпохи MS-DOS. Бесполезно, если вы соберетесь с ML за Windows (посмотрите здесь ). Это не разрешено в ML64.

A2008 syntax error : , test main.asm 4

В директиве PROTO ML64 не любит запятую между ключевым словом PROTO и первый параметр. Удалите его.

A2008 syntax error : INVOKE test main.asm 16

Директива INVOKE не разрешена в ML64 (пока). Замените INVOKE на CALL и заполните регистры в соответствии с соглашением о вызовах Microsoft x64 :

mov ecx, 0
call ExitProcess

A2008 syntax error : main test main.asm 18 A2088 END directive required at end of file test main.asm 18

Директива END не должна содержать дополнительную точку входа для ML64. Удалить "основной". Это также устраняет вторую ошибку. Установите точку входа в параметрах компоновщика Visual Studio в соответствии с моей статьей .

...