• 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文件有错误的话,在输出中也能看到相应的提示,改掉错误就可以了。

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

  • 相关阅读:
    java native方法
    linux free命令
    gdb使用
    java锁——wait,notify,synchronized
    java面试——问题回溯
    (转)每天一个linux命令(44):top命令
    java面试——jvm
    java面试——多线程
    数据库面试总结
    CMakeLists.txt使用
  • 原文地址:https://www.cnblogs.com/achillis/p/5369658.html
Copyright © 2020-2023  润新知