ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

在 VS 2010/2012/2013/2015 中集成 yasm 1.3.0

2020-09-17 04:02:00  阅读:354  来源: 互联网

标签:vsyasm 1.3 yasm Visual VS Studio 2015


1、yasm 简介

yasm 支持 nasm 语法,同时支持 Windows、Linux、Mac OS 多个操作系统,对指令集(MMX、SSE、AVX等)的支持也还不错,

所以是 x86/amd64 上比较适合用于跨平台、交叉编译的汇编编译器。

 

yasm 的官网是:http://yasm.tortall.net/

 

环境:

Visual Studio 2010/2012/2013/2015

Windows 7/10, 32/64位系统

 

下载:http://yasm.tortall.net/Download.html

vsyasm (yasm 1.3.0)

关于 VC 2005/2008 上集成 yasm 的方法,由于这两个版本已经用得比较少,就不介绍了,请参阅 yasm 的官网。

 

2、VS 2012/2013/2015 修正版

2.1 关于 VC 2010/2012/2013/2015

官方提供的方法只适用于 VS 2010,对于 VS 2012/2013/2015 等新版本,存在一些小问题,

vsyasm 传进去的 $(Platform) 可能是 “Win32”,而 vsyasm 默认只支持小写的 “win32”,

所以会报错,本文采用一个老外自己修正和编译的 vsyasm 修正版本。

(这个错误官网已修正,但是在放出来的 1.3.0 Release 版还是未修正的版本,需要自己下载源码重新编译)

 

vsyasm 修正版作者的文章在这里(内含下载地址):

YASM integration with Visual Studio 2010, 2012 and 2013
http://www.megastormsystems.com/news/yasm-integration-with-visual-studio-2010-2012-and-2013

 

下载地址 (vsyasm 1.3.0 2015-06-09):

下面是 yasm-1.3.0_2015-06-09_64bits 解压后的截图:

注:官方的 vsyasm 1.3.0 压缩包里是没有 yasm.exe 的,上面的修正版里才有。

 

2.2 修正 vsyasm.props 文件

打开 vsyasm.props 文件,找到:

<ObjectFile>$(IntDir)</ObjectFile>

修改为:

<ObjectFile>$(IntDir)%(Filename).obj</ObjectFile>

 

3、配置 yasm

由于官方的版本只支持到 VS 2010,所以我们才用上一小节下载的版本:

yasm-1.3.0_2015-06-09_32bits (32位系统)

yasm-1.3.0_2015-06-09_64bits (64位系统)

 

3.1 安装 vsyasm.exe

如何让 Visual Studio 能找到 vsyasm.exe 文件? 有两种方法,个人推荐使用第二种方法。

(注:本文以 Visual Studio 2015 为例,其他版本请参考 2015 的方法,能顺便提到的我会提一下。)

3.1.1 第一种方法

在操作系统的环境变量里添加一个新的值叫 YASMPATH,并设置为 vsyasm.exe 所在的路径(路径必须以 "\" 结尾)。

例如,你的 vsyasm.exe 文件路径是 “D:\yasm_1.3.0\vsyasm.exe”,则 YASMPATH 的值应该设置为:

D:\yasm_1.3.0\

这种方法的好处是不用每个 Visual Studio 的目录下都拷贝一次。

3.1.2 第二种方法(推荐)

把 vsyasm.exe 放到 VC++ 编译器的 \bin 目录,不同的操作系统,不同版本的 Visual Studio 的 \bin 路径是不一样的。

在 64 位系统的 VS 2015 中,路径是:

C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin

在 32 位系统的 VS 2015 中,路径是:

C:\Program Files\Microsoft Visual Studio 14.0\VC\bin

然后把 vsyasm.exe 和 yasm.exe 拷贝到上面的 \bin 目录下。

其他版本的 Visual Studio 也是类似的,如下所示。

在 64 位系统中,路径是:

## VS 2010
C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin
## VS 2012
C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\bin
## VS 2013
C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin

在 32 位系统中,路径是:

## VS 2010
C:\Program Files\Microsoft Visual Studio 10.0\VC\bin
## VS 2012
C:\Program Files\Microsoft Visual Studio 11.0\VC\bin
## VS 2013
C:\Program Files\Microsoft Visual Studio 12.0\VC\bin

 

3.2 安装 vsyasm 支持文件

同样也有两种方法,跟上一小节类似,不过,依然还是推荐使用第二种方法。

3.2.1 第一种方法

如果你前面选择了第一种方法,那么你依然可以采用这种方法。

把 yasm.props,yasm.targets,yasm.xml 这3个文件拷贝到某个目录下面,例如前面用过的目录:

D:\yasm_1.3.0\

然后打开如下 Visual Studio 设置(以 Visual Studio 2015 为例)。

打开VS菜单:

'工具(T)' -> '选项(O) ...' -> '项目和解决方案' -> 'VC++ 项目设置' -> '生成自定义搜索路径':

英文版VS菜单:

'Tools(T)' -> 'Options(O) ...' -> 'Projects and Solutions' -> 'VC++ Project Settings' -> 'Build Customisations Search Path':

如下图所示:

 

其他 Visual Studio 版本的设置也类似。

3.2.2 第二种方法(推荐)

把 yasm.props,yasm.targets,yasm.xml 3个文件拷贝到 MSBUILD 自定义目录(MSBUILD customisation directory)下面。

在 64 位系统上,路径如下:

C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\BuildCustomizations

在 32 位系统上,路径如下:

C:\Program Files\MSBuild\Microsoft.Cpp\v4.0\BuildCustomizations

3.2.3 第三种方法

其实第三种方法跟第一种方法非常类似,这里就不讲了(其实你可以忽略),具体可以看 vsyasm 压缩包里的 readme.txt 文件。

 

3.3 配置自定义生成

首先,打开你的 Visual Studio 2015 项目,然后选中你的项目,例如我的项目是:StringMatch,接着点鼠标右键,

在弹出的菜单里找到 “生成依赖项...” -> “自定义生成...”,如下图所示:

(注:这个菜单项,在 VS 2010 里,右键菜单里就能看到,叫做 “生成自定义(B)...”,英文版叫做 “Build Customisations ...”。)

 

接着会弹出如下的窗口,勾选 “vsyasm” 即可,如图:

 

3.4 编译 yasm 文件

要编译 asm 文件,首先,你得在你的项目中添加一个后缀为 asm 的文件,右键单击 asm 文件,弹出菜单选择 “属性”,

然后选择:配置属性 -> 常规 -> 项类型,英文版如下:[Properties] -> [General] -> [Item Type] ,

在 “项类型” 的下拉列表里找到 [Yasm Assembler],如下图所示:

 

由于 yasm 并不能在汇编代码里区分是 Win32 还是 x64 模式,所以同一个项目里如果同时具有 Win32 和 x64 两种模式的汇编代码,

是不能同时都编译的,会报错的。解决方法是,我们可以使用自定义生成工具里提供的排除功能,

在 Win32 模式下排除所有 64 位汇编文件的生成,在 x64 模式下排除所有 32 位汇编文件的生成,如下图:

 

3.5 自定义“自定义生成工具”

除了上面的方式,我们还可以完全使用 “自定义生成工具” 来定义 vsyasm 的编译选项,这种方式可以编译 asm 文件,

但是链接的时候会报错,不推荐,仅供参考。方法如下:

 

VS自定义生成工具配置方法:


1、首先选中 .asm 后缀的汇编文件,点击鼠标右键:属性 -> 常规 -> 项类型 -> 自定义生成工具;
2、在 “自定义生成工具” 的设置中,“命令行” 填入如下内容(自行区分 32 或 64 位模式):

# 32位
vsyasm -i %(RootDir)%(Directory)\ -f win32 -o $(IntDir)%(Filename).obj %(FullPath)
# 64位 vsyasm -i %(RootDir)%(Directory)\ -f win64 -o $(IntDir)%(Filename).obj %(FullPath)

在 “输出设置” 里,填入如下内容:

$(IntDir)%(Filename).obj;%(Outputs)

 

4、编译选项

如果想用 yasm 手动编译汇编文件,可以参考如下命令:

把 test.asm 编译成包含 debug 信息的 Win32 目标文件 test.obj:

yasm -f win32 -g cv8 test.asm

把 test2.asm 编译成包含 debug 信息的 Win64 目标文件 test2.obj:

yasm -f win64 -g cv8 test2.asm

(注:Windows下支持的 debug 信息是 CodeView 8.0 格式,也就是 MSVC 8.0,VC 2005)

使用 Visual Studio C++ 的路径环境变量编译:

yasm -i %(RootDir)%(Directory)\ -f win32 -o $(IntDir)%(Filename).obj %(FullPath)
yasm -i %(RootDir)%(Directory)\ -f win64 -o $(IntDir)%(Filename).obj %(FullPath)

把 test3.asm 编译成包含 DWARF2 debug 信息的 AMD64 ELF 目标文件 test3.o:

yasm -f elf64 -g dwarf2 test3.asm

跟上面的一样的效果:

yasm -f elf -m amd64 -g dwarf2 test3.asm

把 test4.s (GAS 语法文件) 编译成包含 DWARF2 debug 信息的 32位的 x86 ELF 目标文件 test4.o:

yasm -p gas -f elf32 -g dwarf2 -o test4.o test4.s

编译 MacX OS 下的 asm:

yasm -f maco32 test.asm
yasm -f maco64 test.asm

 

5、其他

5.1 yasm 使用手册

yasm 的其他具体用法,可以参考:

官方用户手册 HTML 版:Yasm用户手册 (HTML 版) 

或者 PDF 版用户手册  :Yasm用户手册(PDF版)

5.2 yasm 语法

本文只讨论如何在 Visual Studio 中配置和安装 yasm,关于 yasm 如何编写 asm 代码请参考官方手册或者别的文章。

 

6、参考文章

【1】:http://yasm.tortall.net/ (yasm 官网)

【2】:https://github.com/yasm/yasm/ (yasm 官方 GitHub 仍有少量更新)

【3】:https://github.com/yasm/yasm/wiki (yasm 官方 GitHub 的 wiki)

【4】:http://www.megastormsystems.com/news/yasm-integration-with-visual-studio-2010-2012-and-2013

【5】:VS2013集成yasm 1.3.0 含Windows10/VS2015特别说明

【6】:Visual Studio自定义生成工具配置方法和相关vs系统变量含义

.

标签:vsyasm,1.3,yasm,Visual,VS,Studio,2015
来源: https://www.cnblogs.com/shines77/p/5656101.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有