Win7 VS2015 NASM汇编语言环境配置

来源 http://www.cnblogs.com/kileyi/p/7387803.html

参考了以下两个博客文章

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

1
2
3
4
5
6
7
8
9
10
#include <iostream>
extern "C" void nasm_function(void);
void main()
{
    nasm_function();
    system("pause");
}

asm01.asm

1
2
3
4
5
6
7
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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
;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修改为

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<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部分不变

1
2
3
4
5
6
7
8
9
10
#include <iostream>
extern "C" void nasm_function(void);
void main()
{
    nasm_function();
    system("pause");
}

ASM去掉前面的下划线就行了

1
2
3
4
5
6
7
segment .text
global nasm_function
nasm_function:
    mov eax, 1234h
    ret

纯ASM如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
[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

转载于:https://www.cnblogs.com/lsgxeva/p/8947873.html

Win7 VS2015 NASM汇编语言环境配置相关推荐

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

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

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

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

  3. VS2015 ionic 开发环境配置纪要

    1)第一次安装Tools for Apache Cordova不成功,到Options检查依赖项,缺少Node等,重新下载了32为的nodeJs安装.然后运行VS安装程序,卸载Tools for Ap ...

  4. openCV2.4.13+VS2015+Cmake开发环境配置,解决nonfree问题

    我用的是opencv3.1.0,挺好用的,且和VS20115配置压迫简单很多.但是对于nonfree这个库不支持,所以我又下了一个opencv2.4.13的源代码包,用Cmake编译,工具下载:点击打 ...

  5. VS2015搭建汇编语言环境和代码高亮插件AsmDude

    没有什么是Visual Studio编辑不了的语言,汇编也是. 环境的搭建没什么难度,也不用花太多时间,网上方法一搜一大片,这里放一个 https://blog.csdn.net/yiftss/art ...

  6. AutoDesk CAD2018 ObjectArx + vs2015 +win10 (C++)环境配置

    1.从官网中下载 ObjectArxWizards  ,下载与cad版本一致 https://www.autodesk.com/developer-network/platform-technolog ...

  7. vs2015 驱动程序开发环境配置

    需要满足两个插件即可: Windows SDK WDK(windows Driver kit) 注意:两者版本一定要一致(不考虑最小版本号) 首先安装vs2015,Vs2015安装盘(带更新updat ...

  8. rea t插件 vscode_VSCode构建汇编语言环境(配置VSCode自动调用dosbox编译运行MASM/TASM程序)...

    首先,最简单的方法当然是直接安装vscode插件比如下面这个:根据里面的说明使用即可 MASM/TASM - Visual Studio Marketplace​marketplace.visuals ...

  9. DOSBox+MASM,汇编语言环境搭建

    1.下载DOSBox,安装: DOSBox, an x86 emulator with DOS 出现这个界面: 2.下载MASM包 Masm5.0 Masm5.0(windows x64位系统下汇编语 ...

最新文章

  1. 学习一个 Linux 命令:pstree
  2. 在vmware的Solaris虚拟机中安装vmtool
  3. Java基础学习总结(10)——static关键字
  4. Python Django CBV下的通用视图函数
  5. PHP从零开始--字段修饰符数据操作SQL语言
  6. 【直播间】移动互联网产品中如何用好HTML5?
  7. Step by Step-构建自己的ORM系列-ORM改进方案思考(上)
  8. Python入门经典学习1-乳腺癌分类问题
  9. silvaco学习之收敛
  10. 【YOLOv5-6.x】设置可学习权重结合BiFPN(Add操作)
  11. DAX: 用SWITCH函数替换嵌套IF函数
  12. 【Python蓝桥杯】印章 共有n种图案的印章,每种图案的出现概率相同。小A买了m张印章,求小A集齐n种印章的概率。
  13. 配音赚钱的软件有哪些 ?推荐以下这3个平台
  14. 关于partnerLinkType的相关实验
  15. 乐高计算机游戏泡泡龙的目标,乐高游戏教案
  16. 使用keil安装目录下的相关驱动进行安装
  17. 对勾函数_对勾函数-什么是对勾函数请问什么是对勾函数?如何使用 – 手机爱问...
  18. DFC开发平台的设计理念
  19. linux的shell命令的工作方式,工作中给力的shell命令
  20. 批量修改CloudFlare上的域名的DNS - by PHP

热门文章

  1. 【vue 项目】表单正则表达式校验1-32位,中文、英文、数字及特殊字符_-,必须以中文或英文字符开头等
  2. 批量进行图片处理,把图形处理成1024*1024,超过的裁剪,不足的用0补全
  3. 哪所学校人工智能计算机比较好,2021人工智能学校国内排名 哪个大学好
  4. 京东旗舰店商品详情数据采集接口代码对接教程
  5. 跳来跳去,最后竟成了“跳梁小丑”!
  6. 2022年区块链趋势分析:全球区块链解决方案支出将达到117亿美元
  7. ssm毕设项目新能源汽车销售管理系统gooct(java+VUE+Mybatis+Maven+Mysql+sprnig)
  8. 二阶龙格库塔公式推导_数值常微分方程-欧拉法与龙格-库塔法
  9. 华为鸿蒙产业链示意图,2021年中国华为产业链市场现状及应用分析(附产业链全景图)...
  10. java下载Excel表格(ajax处理流文件)