在 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
我正在尝试 运行 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