python编译汇编,x64汇编文件的编译步骤

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

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

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

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

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

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

主要过程:

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

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

1

ULONG64

myAdd(

ULONG64

u1,

ULONG64

u2);

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

.CODE

myAdd PROCaddrcx,rdxmovrax,rcxretmyAdd ENDP

END

48304ba5e6f9fe08f3fa1abda7d326ab.png

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

e4a4488f8a417d323384572c6f58ef4c.png

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

#include "stdafx.h"#include

//声明引用外部函数

EXTERN_C ULONG64 myAdd(ULONG64 u1,ULONG64 u2);int _tmain(int argc, _TCHAR*argv[])

{

ULONG64 result= myAdd(0x111111111,0x333333333);

printf("result = 0x%I64X\n",result);return 0;

}

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

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

c2d80d2188e291ae4cafb15f99f52e7a.png

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

59846cacdcf78597ba30f8407bb7f06e.png

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

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

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

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

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

3010cdd5ceb94450d919d75953008e27.png

三、生成工程

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

48304ba5e6f9fe08f3fa1abda7d326ab.png

1>------ 已启动生成: 项目: testasm, 配置: Release x64 ------

1>生成启动时间为 2016/4/10 9:45:36。1>InitializeBuildStatus:1>正在创建“x64\Release\testasm.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.cpp1>testasm.cpp1>Link:1>正在生成代码1>已完成代码的生成1> testasm.vcxproj ->F:\x64Program\testasm\x64\Release\testasm.exe1>FinalizeBuildStatus:1>正在删除文件“x64\Release\testasm.unsuccessfulbuild”。1>正在对“x64\Release\testasm.lastbuildstate”执行 Touch 任务。1>

1>生成成功。1>

1>已用时间 00:00:01.11

========== 生成: 成功 1 个,失败 0 个,最新 0 个,跳过 0 个 ==========

PeachPy 是一个用于编写高性能汇编内核的 Python 框架,可在汇编中编写模块。 它自动化了一些细节,并允许使用 Python 生成重复的汇编代码序列。PeachPy 旨在简化编写优化的汇编内核,同时保留传统的汇编所有优化机会。一些特性:用于 Windows,Unix 和 Golang 程序集的通用汇编语法.PeachPy 可以直接生成 ELF,MS COFF 和 Mach-O 对象文件以及 Golang 工具链的汇编列表自动适应不同的调用约定和 ABIs用于不同平台的功能可以从汇编相同的源生成支持 Microsoft x64 ABI, System V x86-64 ABI (Linux 和 OS X), Linux x32 ABI, Native Client x86-64 SFI ABI, Golang AMD64 ABI, Golang AMD64p32 ABI自动分配寄存器PeachPy 是灵活的,而且允许在同一代码中混合自动分配寄存器和硬编码寄存器汇编编程中常规任务的自动化:函数 prolog 和 epilog 由 PeachPy 生成数据常量的重复数据删除 (e.g. Constant.float32x4(1.0))分析在函数中使用的 ISA 扩展支持 x86-64 指令,最高可达 AVX-512 和 SHA包含 3dnow! , XOP, FMA3, FMA4, TBM 和 BMI2.不包括 x87 FPU 和大多数系统指令使用自动生成的测试 auto-generated tests 进行严格测试,以生成与 binutils 相同的操作码自动生成元数据文件具有模块依赖性的Makefile (-MMD 和-MF 选项)C 头文件生成的函数JSON 格式的函数元数据基于 Python 的元编程和代码生成多个指令流的复用(有助于软件流水线)兼容 Python 2 和 Python 3,CPython 和 PyPy在线 DEMO: PeachPy.IO 标签:PeachPy
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值