Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly Visual Studio 2013中的程序集即使在启用Microsoft宏汇编程序后也未生成_Assembly_Visual Studio 2013 - Fatal编程技术网

Assembly Visual Studio 2013中的程序集即使在启用Microsoft宏汇编程序后也未生成

Assembly Visual Studio 2013中的程序集即使在启用Microsoft宏汇编程序后也未生成,assembly,visual-studio-2013,Assembly,Visual Studio 2013,我正在尝试运行一个非常基本的汇编文件来做一些数学运算并打印输出,没有什么挑战性。我遵循了一些地方给出的步骤,例如,但是我的构建仍然失败,关于语法的每一行都有错误。错误,例如: 1>c:\users\damian\documents\visual studio 2013\projects\test345\test345\source.asm(22): error C2061: syntax error : identifier 'dword' 1>c:\users\damian\doc

我正在尝试运行一个非常基本的汇编文件来做一些数学运算并打印输出,没有什么挑战性。我遵循了一些地方给出的步骤,例如,但是我的构建仍然失败,关于语法的每一行都有错误。错误,例如:

1>c:\users\damian\documents\visual studio 2013\projects\test345\test345\source.asm(22): error C2061: syntax error : identifier 'dword'
1>c:\users\damian\documents\visual studio 2013\projects\test345\test345\source.asm(24): error C2061: syntax error : identifier 'add'
1>c:\users\damian\documents\visual studio 2013\projects\test345\test345\source.asm(27): error C2061: syntax error : identifier 'pop'
1>c:\users\damian\documents\visual studio 2013\projects\test345\test345\source.asm(12): error C2061: syntax error : identifier 'main'

我试图运行的代码是。我尝试过从cpp编译更改为c编译,尝试过在链接器中设置入口点,尝试过右键单击project->Build Dependencies->Build Customizations并检查masm,但这些都没有任何不同。还有什么我遗漏的吗?

您试图汇编的代码使用NASM语法。您需要将VisualStudio配置为使用NASM

1) 安装NASM并将其路径添加到path环境变量。
2) 右键单击asm文件,然后选择属性->常规,然后为项目类型字段选择自定义生成工具。
3) 单击应用。
4) 在
Custom Build Tool
页面上,为命令行字段设置
nasm-f win32-o“$(ProjectDir)$(IntDir)%(Filename.obj”“%(FullPath)”

5) 将输出字段设置为
$(IntermediateOutputPath)%(文件名).obj

这将使NASM将程序集源文件组装成与visual studio兼容的对象文件。
但是我们还没有完成,您需要对程序集文件进行一些更改,然后才能使用MSVC的链接器进行链接。
1) MSVC的链接器要求函数以下划线开头,因此
main
变成
\u main

2) 声明导入的API时的命名约定也不同。因此,
extern printf
变成了
extern\uu imp\uu printf

3) 导入API的调用指令也不同<代码>调用printf变为
调用[\uu imp\uu printf]
。printf的地址将存储在一个导入表条目中,我们的指令将其解引用以查找printf的地址并调用它


尝试链接也会导致错误(
错误LNK2001:未解析的外部符号\u mainCRTStartup
)。我解决这个问题的方法是包含一个c文件和一个不做任何事情的伪函数。这样,CRT启动存根就会链接起来。(如果有更好的方法,请在注释中建议)。

不同的汇编程序使用不同的语法,即使它们为相同的指令集体系结构汇编代码。您正在使用MASM进行组装,但是您正在组装的代码使用NASM语法。好的,我如何解决这个问题?我能让VS使用NASM吗?也许吧,但我不知道怎么做。另一个选择是重写代码以使用MASM语法。MASM不是一个选项,但我想对某些人来说可能是。就我个人而言,我只是使用notepad++并定义了一个批处理文件来清理、链接和运行可执行文件,但我确实有点希望VS能够工作。