首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将操作码插入内存

将操作码插入内存
EN

Stack Overflow用户
提问于 2013-09-03 19:37:20
回答 2查看 618关注 0票数 4

嗨,我正在试图了解是否有可能采取指令操作码,并‘戳’到内存或涂片如何将它们转换为二进制程序。我在这里发现了一个废弃的lisp项目:http://common-lisp.net/viewvc/cl-x86-asm/cl-x86-asm/,它接受x86的asm指令并将它们转换成操作码(请参见下面的示例)。该项目没有进一步实际完成二进制可执行文件的创建。因此,我需要“手动”做任何想法都可以帮助我。谢谢。

代码语言:javascript
复制
 ;; assemble some code in it
(cl-x86-asm::assemble-forms 
  '((.Entry :PUSH :EAX)
    (:SUB :EAX #XFFFEA)
    (:MOV :EAX :EBX)
    (:POP :EAX)
    (:PUSH :EAX)
    (.Exit :RET))

正在处理中...

代码语言:javascript
复制
;; print the assembled segment
(cl-x86-asm::print-segment)

* Segment type DATA-SEGMENT
Segment size 0000000C bytes
50 81 05 00 0F FF EA 89
03 58 50 C3
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-09-22 07:07:16

我了解到可以使用CFFI/FFI来完成,例如非常简单的asm代码:

代码语言:javascript
复制
(:movl 12 :eax)
(:ret)

这将转换为以下八进制序列:#(184 12 0 0 0 195),在十六进制中是:#(B8 C 0 0 0 C3)。下一步是将其发送到内存中的位置,如下所示:

代码语言:javascript
复制
(defparameter pointer (cffi:foreign-alloc :unsigned-char :initial-contents #(184 12 0 0 0 195)))
;; and then execute it as such to return the integer 12:
(cffi:foreign-funcall-pointer pointer () :int)
=> result: 12

感谢#lisp (freenode通道)的专家帮助解决这个问题。

票数 2
EN

Stack Overflow用户

发布于 2013-09-03 20:11:45

例如,就有这个内置的。这通常被称为LAP,Lisp组装程序。

defx86lapfunction

示例:

代码语言:javascript
复制
(defx86lapfunction fast-mod ((number arg_y) (divisor arg_z))
  (xorq (% imm1) (% imm1))
  (mov (% number) (% imm0))
  (div (% divisor))
  (mov (% imm1) (% arg_z))
  (single-value-return))

SBCL可以与VOP ()做一些类似的工作。

http://g000001.cddddr.org/2011-12-08

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18600170

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档