关于PyAsm在Windows下的安装使用及bug修复

在《PyAsm-在python中嵌入汇编》我只是对PyAsm做了介绍,但是官方只有python24的安装包,虽然提供了源码,不过需要装 vs2003才能安装。另外,在文章里提到了一个小bug,这几天有空就研究了一下PyAsm的源码,终于找到了bug的位置,直接通过pyasm写大段 代码时,x86asm.py中的dispatchStatement是处理pyasm中大段汇编的代码,其中调用了AddInstruction来处理汇 编指令,但在AddInstruction没有添加过程头,所以就导致bug。我改了一下,把AddInstruction换成了AI,AI跟 AddInstruction一样的功能,只不过AI在第一次被调用的时候会添加过程头。

另外,还有一个问题就是INT3 和INT 3的区别。INT3是CC断点,而INT 3 则是3号中断,不一样。但是作者在处理指令的时候似乎还没想到什么好的办法来匹配INT3这中包含数字的指令。所以,如果要使用CC断点,只好修改一下代 码,只能用INTC替代INT3,另外我也注意到代码中的INT0实际上是INTO(字母O)。

在Python25中使用还需要修改一处位置,下边的patch给出了,将python24改成python25即可。

最后,关于excmem模块,自己编译一下就OK了。然后把pyasm文件夹拷贝到$PYTHON/Lib/site-packages/目录中即可。

好了,终于了却了心愿,希望修改没有引入其他的bug。

=== modified file 'x86asm.py'
--- x86asm.py   2008-12-08 08:33:16 +0000
+++ x86asm.py   2008-12-08 08:36:40 +0000
@@ -483,7 +483,7 @@


     def dispatchStatement(self,s):
-        self.AddInstruction(s)
+        self.AI(s)

     def DispatchString(self,s):
         s = s.strip()
@@ -557,4 +557,4 @@
     a.AI("MOV y,12")
     a.EP()

-    a.Compile()
/ No newline at end of file
+    a.Compile()

=== modified file 'x86cpToMemory.py'
--- x86cpToMemory.py    2008-12-08 08:33:16 +0000
+++ x86cpToMemory.py    2008-12-08 08:34:44 +0000
@@ -12,7 +12,7 @@
if sys.platform == 'win32':
     import win32api, pywintypes
     from sys import dllhandle
-    python24Handle = win32api.GetModuleHandle("python24")
+    python24Handle = win32api.GetModuleHandle("python25")

     def runtimeResolve(funcName):
         try:

=== modified file 'x86inst.py'
--- x86inst.py 2008-12-08 08:33:16 +0000
+++ x86inst.py 2008-12-08 08:42:34 +0000
@@ -702,7 +702,7 @@
i("3B /r", "CMP r16,r/m16", "Compare r/m16 with r16.")
i("3B /r", "CMP r32,r/m32", "Compare r/m32 with r32.")

-#i("CC", "INT 3", "Interrupt 3 - trap to debugger.")
+i("CC", "INTC", "Interrupt 3 - trap to debugger.")
i("CD ib", "INT imm8", "Interrupt vector number specified by immediate byte.")
i("CE", "INTO", "Interrupt 4 - if overflow flag is 1.")


1 # -*- coding:utf-8 -*-
2 # file: testsum.py
3 #   by: bluebanboom                 0(0
4 # mail: bluebanboom@gmail.com       ~
5 # date: 2008-12-08
6 # note:
7 from pyasm import pyasm
8 def main():
9          pyasm(globals(),r"""
10                  !CHARS hello_str 'Hello world!/n/0'
11                  !CHARS in_fmt 'ii/0'
12                  !CHARS out_fmt 'i/0'
13         
14                  !PROC sum PYTHON
15                  !ARG   self
16                  !ARG   args
17                  !LOCAL x
18                  !LOCAL y
19                  LEA EAX, x
20                  PUSH EAX
21                  LEA EAX, y
22                  PUSH EAX
23                  PUSH in_fmt
24                  PUSH args
25                  CALL PyArg_ParseTuple
26                  ADD ESP, 0xC
27                  MOV EAX, x
28                  MOV EBX, y
29                  ADD EAX, EBX
30                  PUSH EAX
31                  PUSH out_fmt
32                  CALL Py_BuildValue
33                  ADD ESP, 0x8
34                  !ENDPROC
35         """)  
36         print sum(5, 2)
37         print sum(2, 2)
38
39 if __name__ == "__main__":
40      main()
41

  • 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,CPythonPyPy在线 DEMO: PeachPy.IO 标签:PeachPy

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值