在 Visual Studio 中尝试 运行 组装时出现问题

Problem trying to run Assembly in Visual Studio

我正在尝试 运行 Visual Studio 2012 中的一些汇编代码,并在 C 中调用它只是为了测试目的。由于我没有编写汇编代码的经验,所以我不知道出了什么问题,所以非常感谢您的帮助!

我在尝试编译代码时遇到以下错误:

Error   5   error MSB3721: The command "ml.exe /c /nologo /Zi /Fo"Debug\callee.obj" /W3 /errorReport:prompt  /Tacallee.asm" exited with code 1. C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V110\BuildCustomizations\masm.targets 49  5   ProjetoASM
Error   2   error A2206: missing operator in expression C:\Users\Suporte\Desktop\ASM\ProjetoASM\ProjetoASM\callee.asm   18  1   ProjetoASM
Error   3   error A2206: missing operator in expression C:\Users\Suporte\Desktop\ASM\ProjetoASM\ProjetoASM\callee.asm   21  1   ProjetoASM
Error   4   error A2206: missing operator in expression C:\Users\Suporte\Desktop\ASM\ProjetoASM\ProjetoASM\callee.asm   8   1   ProjetoASM
Error   1   error A2022: instruction operands must be the same size C:\Users\Suporte\Desktop\ASM\ProjetoASM\ProjetoASM\callee.asm   15  1   ProjetoASM

以及汇编代码:

PUBLIC hello_from_asm
EXTERN puts:PROC

.model flat

.data

    msg    db 'Hello, world!',0xa    
    len    equ $ - msg

.code

hello_from_asm PROC
        mov     edx,len                  
        mov     ecx,msg                         
        mov     ebx,1                            
        mov     eax,4                         
        int     0x80                          

        mov     eax,1                            
        int     0x80                              
hello_from_asm ENDP

END

这应该会输出“Hello, world!”,因此也欢迎任何其他可能有用的想法。

完整性的 C 代码:

#include <stdio.h>

extern void hello_from_asm();

int main(){
    printf("Hello from C");
    hello_from_asm();
    return 0;
}

那些详细的 MASM 错误消息说明了一切。

mov     ecx,msg

您需要使用 MASM 风格。上面的指令试图在 32 位寄存器中加载 msg 的第一个字节。那是“大小不匹配”错误。
你需要的是在ECX中加载msg的地址。使用

mov ecx, offset msg

其他错误可能与无法识别 0x 十六进制前缀有关。尝试改用 h 十六进制后缀。 (0Ah, 80h)

上面的内容很容易更改,您的代码 assemble 没问题。但是不要 运行 它,因为 int 80h 指令是一个 Linux 系统调用,它不会在 Visual Studio 2012 (Windows) 上运行。

示例 32 位 Visual Studio |打印“Hello World”的 Masm 程序。我包括了最常见的指令。 “legacy_stdio_definitions.lib”用于 VS2015 及更高版本,因为 printf 和 scanf 已更改为与 C 编译器的输出内联。对于 VS2012,您可能不需要它。

        .686p                   ;enable instructions
        .xmm                    ;enable instructions
        .model flat,c           ;use C naming convention (stdcall is default)

;       include C libraries
        includelib      msvcrtd
        includelib      oldnames
        includelib      legacy_stdio_definitions.lib    ;for scanf, printf, ...

        .data                   ;initialized data
pfstr   db      "Hello world!",0dh,0ah,0
        .data?                  ;uinitialized data
        .stack  4096            ;stack (optional, linker will default)

        .code                   ;code 
        extrn   printf:near
        public  main

main    proc

        push    offset pfstr    ; 32-bit mode uses stack args
        call    printf
        add     esp,4           ; cdecl is caller-pops

        xor     eax,eax         ; return 0
        ret
main    endp

        end