zoukankan      html  css  js  c++  java
  • VS2010中编写x64汇编的具体方法

    编写涉及系统特性的一些底层程序,特别是ShellCode,不可避免地要采用直接编写汇编代码的方式。

    在目标平台为x86模式时,可以直接使用内联汇编,这个很多人都比较熟悉了,也非常地方便。

    但是当目标平台为x64时,微软不再允许直接内联汇编了,这给我们编程造成了一些不便。

    怎么解决这个问题呢? 一种办法是改用Intel的编译器,它仍然支持内联汇编。

    另一种办法还是用VS了,但是不能内联,需要把汇编部分单独写到一个asm文件里,然后在其它源文件中引用。

    我参考了一些网上的说明,在这里把过程写详细些,方便自己,也方便他人。

    主要过程:

    一、在asm文件中单独编写功能函数

    比如要实现一个64位的加法函数,原型如下:

    ULONG64 myAdd(ULONG64 u1,ULONG64 u2);
    

    那么新建一个文件,写入以下内容

    .CODE
    
    myAdd PROC
        add rcx,rdx
        mov rax,rcx
        ret
    myAdd ENDP
    
    END

    将以上内容保存为myadd.asm,然后加其加入到工程中。

    在其它需要引用该函数的源文件中,添加以下声明:

    #include "stdafx.h"
    #include <windows.h>
    
    //声明引用外部函数
    EXTERN_C ULONG64 myAdd(ULONG64 u1,ULONG64 u2);
    
    int _tmain(int argc, _TCHAR* argv[])
    {
        ULONG64 result = myAdd(0x111111111,0x333333333);
        printf("result = 0x%I64X
    ",result);
        return 0;
    }

      二、设置asm文件的生成方式

    在asm文件上点击右键,选择“属性”:

     

    然后点击左侧的“常规”,“从生成中排除”选择“否”,“项类型”选择“自定义生成工具”,然后点击应用。

     

    此时在“常规”下面就会出现“自定义生成工具”的条目。

    点击它,设置“命令行”为  ml64 /Fo $(IntDir)%(fileName).obj /c %(fileName).asm

    设置输出为 $(IntDir)%(fileName).obj, 该项必须配置,否则VS认为该文件没有设置输出就会不处理它,同时它也告诉链接器到哪里去找这个obj文件。

    上面的 $(IntDir)是一个宏,表示当前生成配置的目录,比如"x64Debug"。

    经过以上配置之后,asm文件编译生成的obj文件就会自动生成到相应配置的目录。

     

    三、生成工程

    全部配置完成以后,就可以愉快地生成工程了。正常的输出结果如下:

    1>------ 已启动生成: 项目: testasm, 配置: Release x64 ------
    1>生成启动时间为 2016/4/10 9:45:361>InitializeBuildStatus:
    1>  正在创建“x64Release	estasm.unsuccessfulbuild”,因为已指定“AlwaysCreate”。
    1>CustomBuild:
    1>  Performing Custom Build Tools
    1>   Assembling: myAdd.asm
    1>  Microsoft (R) Macro Assembler (x64) Version 10.00.40219.01
    1>  Copyright (C) Microsoft Corporation.  All rights reserved.
    1>  
    1>ClCompile:
    1>  stdafx.cpp
    1>  testasm.cpp
    1>Link:
    1>  正在生成代码
    1>  已完成代码的生成
    1>  testasm.vcxproj -> F:x64Program	estasmx64Release	estasm.exe
    1>FinalizeBuildStatus:
    1>  正在删除文件“x64Release	estasm.unsuccessfulbuild”。
    1>  正在对“x64Release	estasm.lastbuildstate”执行 Touch 任务。
    1>
    1>生成成功。
    1>
    1>已用时间 00:00:01.11
    ========== 生成: 成功 1 个,失败 0 个,最新 0 个,跳过 0 个 ==========

     如果没什么意外的话,就会生成成功了。如果你编写的asm文件有错误的话,在输出中也能看到相应的提示,改掉错误就可以了。

    至此,又可以愉快地使用汇编了呢~

  • 相关阅读:
    Atitit 趋势管理之道 attilax著
    Atitit 循环处理的新特性 for...else...
    Atitit 2017年的技术趋势与未来的大技术趋势
    atitit 用什么样的维度看问题.docx 如何了解 看待xxx
    atitit prj mnrs 项目中的几种经理角色.docx
    Atitit IT办公场所以及度假村以及网点以及租房点建设之道 attilax总结
    Atitit 工具选型的因素与方法 attilax总结
    Atitit.团队文化建设影响组织的的一些原理 法则 定理 效应 p826.v4
    Atiitt 管理方面的误区总结 attilax总结
    Atitit 未来趋势把控的书籍 attilax总结 v3
  • 原文地址:https://www.cnblogs.com/achillis/p/5369658.html
Copyright © 2011-2022 走看看