参考了以下两个博客文章

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/

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汇编语言环境配置的更多相关文章

  1. VS2015调用Matlab2017a环境配置(转载)

    VS2015调用Matlab2017a环境配置 一定要在Debug+x64平台下进行配置,x64,x64,x64!!!* 1.配置环境变量 右键计算机—–>属性——>高级系统设置——> ...

  2. 新手一步一步OpenCV+Win7+Visual Studio 2013环境配置

    地点:湖南大学软件大楼211 时间:2013.12.19 昨天导师布置了个任务,要求是找出用相机拍出同一移动场景下的两张照片,计算机能根据其中的差异计算场景移动的距离和旋转角度.据说以前很牛逼的师兄完 ...

  3. 【cocos 2d-x】VS2012+win7+cocos2d-x3.0beta2开发环境配置

    本系列文章由@二货梦想家张程 所写,转载请注明出处. 作者:ZeeCoder  微博链接:http://weibo.com/zc463717263 我的邮箱:michealfloyd@126.com ...

  4. win7系统Java 开发环境配置

    我的天啊,博客园写了两年九个月,终于有六个粉丝啦,哈哈哈哈哈哈哈哈哈,谢谢大家的关注 进入正题,java环境配置,我要学java了,人生在于瞎折腾. 久闻java大名,但是没接触过,但java环境配置 ...

  5. VS2010/VS2012/VS2015下openGL环境配置(转)

    按:按照下述博文,三个例子均成功. https://blog.csdn.net/so_geili/article/details/51685005 请仔细阅读每一个字. 为了学习<OpenGL超 ...

  6. Win7 VS2015及MinGW环境编译矢量库agg-2.5和cairo-1.14.6

    书接上文,昨天装了MinGW,主要原因之一是要用到MSYS,所以顺手把FFMPEG又编译了一遍. 回到主题,其实我是想编译矢量库,因为最近要学习一些计算几何算法,所以找个方便的2D画图库就很重要. 说 ...

  7. Opencv学习笔记1:安装opencv和VS2015并进行环境配置

    用了Opencv一段时间了,简单记录一下opencv在vs2015下的配置. 第一部分:OpenCV3.2.0的下载 OpenCV官方下载地址: https://opencv.org/releases ...

  8. win7 + eclipse + cocos2dx 开发环境配置

    最近想在win7上配置eclipse+cocos2dx开发环境,在安装之前一定要注意每项是32位还是64位,我选择的都是64位版本的,闲话少叙我们开始安装吧! 1.下载cocos2dx,我选择的是co ...

  9. OpenCV 学习笔记(7)vs2015+ffmpeg开发环境配置

    参考教程 https://blog.csdn.net/HUSTLX/article/details/51014307 1.在http://ffmpeg.zeranoe.com/builds/  下载最 ...

随机推荐

  1. 刘志梅 201771010115 《面向对象程序设计(java)》 第七周学习总结

    实验七 继承附加实验 实验时间 2018-10-11 1.实验目的与要求 (1)进一步理解4个成员访问权限修饰符的用途: 即将类中的域标记为private,而方法标记为public.任何声明为priv ...

  2. 使用Go编写WebAssembly

    I. Install go 1. down https://golang.org/dl/ go1.12.3.windows-amd64.zip 2. set path (1) GOROOTvar na ...

  3. H5的本地存储技术及其与Cookie的比较

    第一部分: H5的本地存储技术 HTML5 提供了两种在客户端存储数据的新方法.先看下面的例子: 例1:var mySelection = {name:"car", amount: ...

  4. HashMap与Hashtable

    1. 1)       Hashtable继承自Dictionary类,HashMap是map接口的一个实现类(继承自AbstractMap抽象类) 2)       在HashMap中,null可以 ...

  5. python3:实现字符串的全排列(无重复字符)

    最近在学一些基础的算法,发现我的数学功底太差劲了,特别是大学的这一部分,概率论.线性代数.高数等等,这些大学学的我是忘得一干二净(我当时学的时候也不见得真的懂),导致现在学习算法,非常的吃力.唉!不说 ...

  6. 阿里云服务器 CentOS 安装Mysql 5.6

    下载:https://dev.mysql.com/downloads/file/?id=471181   第一步: 安装mysql5姿势是要先安装带有可用的mysql5系列社区版资源的rpm包 [ro ...

  7. ABAP-加密解密

    report zco_test. data:o_encryptor type ref to cl_hard_wired_encryptor, o_cx_encrypt_error type ref t ...

  8. Sybase采用load table加载文本数据中的部分字段数据

    LOAD TABLE语句实现从数据文件中装载部分列数据的方法.转载自:https://www.cnblogs.com/lizm166/p/8116475.html(有修改) LOAD TABLE:从数 ...

  9. 手写注解实现SpringMVC

    参考:https://www.cnblogs.com/Shock-W/p/6617068.html

  10. 双网卡Iptables端口转发

    当前场景如下 跳板机A是双网卡,有一个内网IP和一个公网IP 内网IP: 10.0.10.30 外网IP:  58.68.255.123 内网机器:10.0.30.88,可以和10.0.10.30通讯 ...