文档章节

VS中使用X64汇编

simpower
 simpower
发布于 06/24 00:12
字数 836
阅读 13
收藏 0
点赞 0
评论 0

需要注意的是,在X86项目中,可以使用__asm{}来嵌入汇编代码,但是在X64项目中,再也不能使用__asm{}来编写嵌入式汇编程序了,必须使用专门的.asm汇编文件来编写相应的汇编代码,然后在其它地方来调用这些汇编代码。

 

那么,如何在VS中使用X64的汇编呢?本例子将演示如何在汇编文件中使用.c或者.cpp源文件中定义的函数和变量,以及如何在.c或者.cpp中使用汇编文件中定义的函数。

 

首先使用VS(本例子中使用的是VS2013)file=》new=》project,创建一个console项目如下:x64_asm。

项目创建好了之后,默认是一个X86的开发编译环境:

                         

点击红框中的下拉箭头,选择Configure Manager…:

选择点击上图中的New:

选择上图中的x64,然后点击OK。这样,就将项目切换成了X64开发编译环境了:

                                     

然后,在项目中手动添加一个.asm文件,比如名称叫amd64xx.asm。

接着在VS左侧的项目名称下的Source Files上右键,选择add,existing item将该文件添加到source files中。

 

 

接下来,再添加一个func.cpp和func.h文件,在func.cpp里定义两个函数print1和print2,以及一个全局变量g_iValue,供amd64xx.asm中调用:

//func.cpp

#include "stdafx.h"

#include "func.h"

 

void print1(void)

{

    printf("hello world1\n");

}

 

void print2(void)

{

    printf("hello world2\n");

}

//func.h

#pragma once

extern "C"//防止函数被name mangling

{

 

    void print1(void);

    void print2(void);

    __int64 g_iValue =100;

}

 

然后再来实现amd64xx.asm如下。在amd64xx.asm中,实现了2个函数,声明在amd64xx.h中,并且引用了func.cpp中定义的print2和g_ivalue。

//amd64xx.h

extern "C" int __stdcall func1();

extern "C" void __stdcall func2();

 

//amd64xx.asm

EXTERN  print2:PROC;引用外部函数

EXTERN  g_iValue:DQ;引用外部变量

 

.DATA

 

val1 DQ ?;自己定义变量

 

.CODE

 

func1 PROC

 

mov r10, g_iValue;使用func.h中的外部变量

mov val1,r10;使用自定义变量

mov rax,val1

ret;如果不返回,那么会继续执行func2

FUNC1 ENDP

 

func2 PROC

CALL print2 ;调用func.cpp中的外部函数

ret

FUNC2 ENDP

END

 

编译amd64xx.asm需要做单独的设置:

在amd64xx.asm文件上单击鼠标右键,选择“属性(properties)”:

在Excluded From Build中选择No

在Item Type中选择Custom Build Tool

然后点击确定。

再次右键打开amd64xx.asm的properties属性:

这个时候会看见一个Custome Build Tool的选项,如下:

在Command Line处输入:ml64 /Fo $(IntDir)%(fileName).obj /c %(fileName).asm

在Outputs处输入:$(IntDir)%(fileName).obj;%(Outputs)

然后点击确定。

 

最后在x64_asm.cpp的main函数里调用amd64xx.asm中的func1和func2:

 

//x64_asm.cpp

#include "stdafx.h"

#include "amd64xx.h"

 

int _tmain(int argc, _TCHAR* argv[])

{

    printf("%d\n",func1());//amd64xx.asm中定义的func1

    func2();//amd64xx.asm中定义的func2

    return 0;

}

最后在项目名称上右键,选择build编译项目:

如果没有报错,那么就可以直接运行程序了:

 

 

此种方法,是学习Windows内核X64驱动,VT等的基础。

 

项目代码:点击下载

本文转载自:https://www.mallocfree.com/basic/asm/asm-4-x64.htm

共有 人打赏支持
simpower
粉丝 24
博文 456
码字总数 21045
作品 0
海淀
程序员
[分享] X64下调试工具(不断更新)

下面我已列了一下常用工具,欢迎大家补充 查壳工具: Exeinfo PE 推荐使用 www.exeinfo.xn.pl Detect It Easy http://pan.baidu.com/s/1dDnaS2d PE工具(X64的): StudyPe+ by zaas 推荐使用...

伽罗kapple
2016/01/25
26
0
Win32-DLL型调试器,注入dll即可调试

GIT传送门: http://git.oschina.net/codetimer/CTDBG 这个调试器是几年前调试游戏的时候做的,现在翻出来共享下。 代码基本上就是C代码,使用Vs编译 (version >= 2010) 过保护的功能只在W...

codetask
2016/11/16
25
0
VS2012下X64平台嵌入汇编程序

VS2012在win32平台编译的时候可以很好的支持汇编语言的嵌入。建立一个控制台应用程序,选择空项目。项目建立好之后添加一个.cpp文件。在cpp文件中写入如下代码: [cpp] view plain copy prin...

simpower
06/26
0
0
Windows 下编译 OpenSSL

简述 OpenSSL 是一个开源的第三方库,它实现了 SSL(Secure SocketLayer)和 TLS(Transport Layer Security)协议,被广泛企业应用所采用。对于一般的开发人员而言,在 Win32 OpenSSL 上下载...

千山万水
01/15
0
0
char* 和 char[] 的区别

一、代码 有关下面代码,p和q的区别是什么: 二、区别和解释 p和q的区别是: p 是一个指针,指向程序 只读数据段 的”Hello World”,不可以通过p[x] = x 来赋值,因为不能改变只读数据段的内...

yangbodong22011
03/18
0
0
256位NIST素域椭圆曲线运算优化细节之一(单个素数p的加减法)

在素域椭圆曲线运算过程中,256位加法和减法运算结果常常位于区间[0,p)之外的情形,需要做+p或是-p的运算 256位NIST素域椭圆曲线参数p的生成公式为: p = 2^256 − 2^224 + 2^192 + 2^96 − ...

safedead
2015/10/10
369
0
如何在 Windows 下编译 OpenSSL?

OpenSSL是一个开源的第三方库,它实现了SSL(Secure SocketLayer)和TLS(Transport Layer Security)协议,被广泛企业应用所采用。对于一般的开发人员而言,在http://slproweb.com/product...

鉴客
2013/12/24
10.6K
1
xmake v2.0.5,基于 Lua 的跨平台自动构建工具

新特性 为解释器作用域增加一些内建模块支持 针对windows x64平台,支持ml64汇编器 改进 增强ipairs和pairs接口,支持过滤器模式,简化脚本代码 为vs201x工程生成增加文件filter 移除core/to...

ruki
2016/10/31
1K
8
win32汇编和x64汇编?

win32汇编升到winx64汇编,转型容易吗?我指的是会win32汇编,还学x64汇编吗?我是初学,能不能直接学x64汇编语言,请推荐本书?

IIOWE
2014/10/01
833
3
openCV vs2013配置

让曾经也是小白的我来写一个VS一次配置永久使用OpenCV的终极小白教程: 说白了就是将VS第一次配置OpenCV的项目属性表保存下来,每次新建项目时引用即可。 目录 解压OpenCV 配置系统环境变量 ...

文剑Boy
2016/03/29
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

SpringBoot | 第十章:Swagger2的集成和使用

前言 前一章节介绍了mybatisPlus的集成和简单使用,本章节开始接着上一章节的用户表,进行Swagger2的集成。现在都奉行前后端分离开发和微服务大行其道,分微服务及前后端分离后,前后端开发的...

oKong
今天
2
0
Python 最小二乘法 拟合 二次曲线

Python 二次拟合 随机生成数据,并且加上噪声干扰 构造需要拟合的函数形式,使用最小二乘法进行拟合 输出拟合后的参数 将拟合后的函数与原始数据绘图后进行对比 import numpy as npimport...

阿豪boy
今天
1
0
云拿 无人便利店

附近(上海市-航南路)开了家无人便利店.特意进去体验了一下.下面把自己看到的跟大家分享下. 经得现场工作人员同意后拍了几张照片.从外面看是这样.店门口的指导里强调:不要一次扫码多个人进入....

周翔
昨天
1
0
Java设计模式学习之工厂模式

在Java(或者叫做面向对象语言)的世界中,工厂模式被广泛应用于项目中,也许你并没有听说过,不过也许你已经在使用了。 简单来说,工厂模式的出现源于增加程序序的可扩展性,降低耦合度。之...

路小磊
昨天
161
1
npm profile 新功能介绍

转载地址 npm profile 新功能介绍 npm新版本新推来一个功能,npm profile,这个可以更改自己简介信息的命令,以后可以不用去登录网站来修改自己的简介了 具体的这个功能的支持大概是在6这个版...

durban
昨天
1
0
Serial2Ethernet Bi-redirection

Serial Tool Serial Tool is a utility for developing serial communications, custom protocols or device testing. You can set up bytes to send accordingly to your protocol and save......

zungyiu
昨天
1
0
python里求解物理学上的双弹簧质能系统

物理的模型如下: 在这个系统里有两个物体,它们的质量分别是m1和m2,被两个弹簧连接在一起,伸缩系统为k1和k2,左端固定。假定没有外力时,两个弹簧的长度为L1和L2。 由于两物体有重力,那么...

wangxuwei
昨天
0
0
apolloxlua 介绍

##项目介绍 apolloxlua 目前支持javascript到lua的翻译。可以在openresty和luajit里使用。这个工具分为两种模式, 一种是web模式,可以通过网页使用。另外一种是tool模式, 通常作为大规模翻...

钟元OSS
昨天
2
0
Mybatis入门

简介: 定义:Mybatis是一个支持普通SQL查询、存储过程和高级映射的持久层框架。 途径:MyBatis通过XML文件或者注解的形式配置映射,实现数据库查询。 特性:动态SQL语句。 文件结构:Mybat...

霍淇滨
昨天
2
0
开发技术瓶颈期,如何突破

前言 读书、学习的那些事情,以前我也陆续叨叨了不少,但总觉得 “学习方法” 就是一个永远在路上的话题。个人的能力、经验积累与习惯方法不尽相同,而且一篇文章甚至一本书都很难将学习方法...

_小迷糊
昨天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部