Win7 VS2015 NASM汇编语言环境配置
参考了以下两个博客文章
http://blog.csdn.net/x356982611/article/details/51260841
http://www.cnblogs.com/antoniozhou/archive/2008/10/23/1318287.html
首先到CodeProject下载NASM的VS配置文件
https://www.codeproject.com/Articles/410776/Integrating-a-compiler-assembler-in-VS-Using-NASM
解压3个配置文件到
C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V140\BuildCustomizations
也就是和masm的配置文件相同的位置
然后把NASM加入到系统环境变量
D:\nasm-2.13.01
新建一个控制台空工程,同之前MASM的一样,只不过这次选NASM
http://www.cnblogs.com/kileyi/p/7257852.html

建立1个cpp和1个asm文件
cpp01.cpp
#include <iostream>
extern "C" void nasm_function(void);
void main()
{
nasm_function();
system("pause");
}
asm01.asm
segment .text global _nasm_function _nasm_function: mov eax, 1234h ret
asm文件上,鼠标右键属性设置


需要注意的一点是,cpp和asm文件要放到NASMTest.vcxproj与.vcproj相同的目录下才能编译,不像MASM可以放在任意目录下,只要把文件添加到
工程就可以编译,NASM的不行,似乎只能放到根目录下才有效,原因不明,说不定可以设置,但是我没找到。
编译应该就能通过了。
有趣的是MASM可以在ASM汇编代码上下断点,而NASM的却不行。不太清楚怎么回事,不过反正可以在cpp函数前下断点,也差不了太多。
在cpp中的nasm_function函数处下断点,单步就能在寄存器中看到eax变成1234了
接下来搞个纯ASM的测试
pure01.asm
;filename: sayhellon.asm
;cmd> nasm -fcoff -Xvc sayhellon.asm
;cmd> link sayhellon.obj
extern _MessageBoxA@16 ;in user32.dll
extern _ExitProcess@4 ;in kernel32.dll
global SayHello
global _WinMain
[SECTION .drectve info align=8]
db " /subsystem:windows"
db " /out:sayhellon.exe"
db " /defaultlib:kernel32.lib"
db " /defaultlib:user32.lib"
db " /export:SayHello"
db " /entry:WinMain"
db " /merge:.rdata=.text",0
[SECTION .text USE32 align=16]
szTitle:
db "SayHello",0
szMsg:
db "Hello World!", 0
SayHello:
push 0 ;uType
push dword szTitle ;lpCaption
push dword szMsg ;lpText
push 0 ;hWnd
call _MessageBoxA@16
ret 16
_WinMain:
call SayHello
push 0
call _ExitProcess@4
编译应该就能通过,如果不行,手动设置下工程属性中的入口函数

============================================================
试了下x64不能编译,google了一阵发现是命令行参数的问题。要手动修改一下。
参考了以下例子
http://www.davidgrantham.com/nasm-console64/
64位命令行是类似这样调用的
nasm -f win64 ConsoleMessage64.asm -o ConsoleMessage64.obj
打开nasm.xml文件
搜索
Object File
字符串
把原fwin修改为
<EnumValue Name="0" DisplayName="Object File 32" Switch="-f win32" /> <EnumValue Name="1" DisplayName="Object File 64" Switch="-f win64" /> <EnumValue Name="2" DisplayName="LINUX ELF FORMAT" Switch="-f elf" /> <EnumValue Name="3" DisplayName="FLAT BINARY" Switch="-f bin" />
这样在asm文件上右键属性就可以选64位的参数来编译链接了


新的CPP中调用ASM方法如下
CPP部分不变
#include <iostream>
extern "C" void nasm_function(void);
void main()
{
nasm_function();
system("pause");
}
ASM去掉前面的下划线就行了
segment .text global nasm_function nasm_function: mov eax, 1234h ret
纯ASM如下
[SECTION .drectve info align=8]
db " /subsystem:console"
db " /defaultlib:kernel32.lib"
db " /defaultlib:user32.lib"
db " /entry:main"
db " /merge:.rdata=.text",0
NULL EQU 0 ; Constants
STD_OUTPUT_HANDLE EQU -11
extern GetStdHandle ; Import external symbols
extern WriteFile ; Windows API functions, not decorated
extern ExitProcess
global main ; Export symbols. The entry point
section .data ; Initialized data segment
Message db "Console Message 64", 0Dh, 0Ah, 0
section .bss ; Uninitialized data segment
alignb 8
StandardHandle resq 1
Written resq 1
section .text ; Code segment
main:
and RSP, 0FFFFFFFFFFFFFFF0h ; Align the stack to a multiple of 16 bytes
sub RSP, 32 ; 32 bytes of shadow space
mov RCX, STD_OUTPUT_HANDLE
call GetStdHandle
mov qword [REL StandardHandle], RAX
add RSP, 32 ; Remove the 32 bytes
lea RSI, [REL Message]
xor RDI, RDI
.LengthLoop: ; Find the string length by searching for
cmp byte [RSI + RDI], 0 ; the null terminator
je .LengthDone
add RDI, 1 ; Maximum length, prevents buffer overrun
cmp RDI, 21 ; if there is no null terminator
jne .LengthLoop
.LengthDone:
sub RSP, 32 + 8 + 8 ; Shadow space + 5th parameter + align stack
; to a multiple of 16 bytes
mov RCX, qword [REL StandardHandle] ; 1st parameter
lea RDX, [REL Message] ; 2nd parameter
mov R8, RDI ; 3rd parameter
lea R9, [REL Written] ; 4th parameter
mov qword [RSP + 4 * 8], NULL ; 5th parameter
call WriteFile ; Output can be redirect to a file using >
add RSP, 48 ; Remove the 48 bytes
xor RCX, RCX
call ExitProcess
Win7 VS2015 NASM汇编语言环境配置的更多相关文章
- VS2015调用Matlab2017a环境配置(转载)
VS2015调用Matlab2017a环境配置 一定要在Debug+x64平台下进行配置,x64,x64,x64!!!* 1.配置环境变量 右键计算机—–>属性——>高级系统设置——> ...
- 新手一步一步OpenCV+Win7+Visual Studio 2013环境配置
地点:湖南大学软件大楼211 时间:2013.12.19 昨天导师布置了个任务,要求是找出用相机拍出同一移动场景下的两张照片,计算机能根据其中的差异计算场景移动的距离和旋转角度.据说以前很牛逼的师兄完 ...
- 【cocos 2d-x】VS2012+win7+cocos2d-x3.0beta2开发环境配置
本系列文章由@二货梦想家张程 所写,转载请注明出处. 作者:ZeeCoder 微博链接:http://weibo.com/zc463717263 我的邮箱:michealfloyd@126.com ...
- win7系统Java 开发环境配置
我的天啊,博客园写了两年九个月,终于有六个粉丝啦,哈哈哈哈哈哈哈哈哈,谢谢大家的关注 进入正题,java环境配置,我要学java了,人生在于瞎折腾. 久闻java大名,但是没接触过,但java环境配置 ...
- VS2010/VS2012/VS2015下openGL环境配置(转)
按:按照下述博文,三个例子均成功. https://blog.csdn.net/so_geili/article/details/51685005 请仔细阅读每一个字. 为了学习<OpenGL超 ...
- Win7 VS2015及MinGW环境编译矢量库agg-2.5和cairo-1.14.6
书接上文,昨天装了MinGW,主要原因之一是要用到MSYS,所以顺手把FFMPEG又编译了一遍. 回到主题,其实我是想编译矢量库,因为最近要学习一些计算几何算法,所以找个方便的2D画图库就很重要. 说 ...
- Opencv学习笔记1:安装opencv和VS2015并进行环境配置
用了Opencv一段时间了,简单记录一下opencv在vs2015下的配置. 第一部分:OpenCV3.2.0的下载 OpenCV官方下载地址: https://opencv.org/releases ...
- win7 + eclipse + cocos2dx 开发环境配置
最近想在win7上配置eclipse+cocos2dx开发环境,在安装之前一定要注意每项是32位还是64位,我选择的都是64位版本的,闲话少叙我们开始安装吧! 1.下载cocos2dx,我选择的是co ...
- OpenCV 学习笔记(7)vs2015+ffmpeg开发环境配置
参考教程 https://blog.csdn.net/HUSTLX/article/details/51014307 1.在http://ffmpeg.zeranoe.com/builds/ 下载最 ...
随机推荐
- 转wave 文件解析
转 1 WAVE 文件格式分析 WAVE 文件作为多媒体中使用的声音波形文件格式之一,它是以RIFF(Resource Interchange File Format)格式为标准的.每个WAVE文件的 ...
- 高性能mysql 第五章 索引部分总结
高性能索引 1.索引基础:索引的作用类似'目录'帮助Query来快速定位数据行. 1.1索引类型: 1.1.1 b-tree索引 b-tree(balance tree)索引:使用平衡树(非平衡二叉树 ...
- [SQL]T-Sql 递归查询(给定节点查所有父节点、所有子节点的方法)
T-Sql 递归查询(给定节点查所有父节点.所有子节点的方法) -- 查找所有父节点with tab as( select Type_Id,ParentId,Type_Name from Sys_ ...
- Redis 服务端配置——Could not connect to Redis at 127.0.0.1:6379: Connection refused
[root@centoszang 桌面]# redis-cli Could : Connection refused Could : Connection refused not connected& ...
- CSS笔试题
如何实现移动端9宫格 如何实现移动端下列8宫格 实现移动端图片画廊CSS样式 写一个简单的animation的css动画 美化select,radio,range样式,只需考虑谷歌浏览器,下面给出的是 ...
- Servlet】(2)有关Servlet实现的几个类:GenericServlet、HttpServlet、ServletConfig、ServletContext
一.GenericServlet 1.所有的成员方法: 1.在javaWeb项目中: 2.web.xml <?xml version="1.0" encoding=" ...
- Java中字段、属性、成员变量、局部变量、实例变量、静态变量、类变量、常量
首先看个例子: package zm.demo; public class Demo { private int Id;//成员变量(字段).实例变量(表示该Id变量既属于成员变量又属于实例变量) p ...
- 【Python】启动迅雷下载
import subprocess import base64 thunder_path = 'E:\Thunder\Program\Thunder.exe' def Url2Thunder(url) ...
- rpm梳理
- Visual Studio资源汇总
Visual Studio 2015:http://tieba.baidu.com/p/3442930798Visual Studio 2013:http://tieba.baidu.com/p/34 ...