嗨,我正在试图了解是否有可能采取指令操作码,并‘戳’到内存或涂片如何将它们转换为二进制程序。我在这里发现了一个废弃的lisp项目:http://common-lisp.net/viewvc/cl-x86-asm/cl-x86-asm/,它接受x86的asm指令并将它们转换成操作码(请参见下面的示例)。该项目没有进一步实际完成二进制可执行文件的创建。因此,我需要“手动”做任何想法都可以帮助我。谢谢。
;; 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))正在处理中...
;; 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发布于 2013-09-22 07:07:16
我了解到可以使用CFFI/FFI来完成,例如非常简单的asm代码:
(:movl 12 :eax)
(:ret)这将转换为以下八进制序列:#(184 12 0 0 0 195),在十六进制中是:#(B8 C 0 0 0 C3)。下一步是将其发送到内存中的位置,如下所示:
(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通道)的专家帮助解决这个问题。
发布于 2013-09-03 20:11:45
例如,就有这个内置的。这通常被称为LAP,Lisp组装程序。
见defx86lapfunction。
示例:
(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
https://stackoverflow.com/questions/18600170
复制相似问题