fra*_*rex 4 lisp memory assembly common-lisp nasm
嗨,我想了解是否可以将指令操作码“戳”到内存中或将它们转换为二进制程序。我在这里找到了一个废弃的 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))
Run Code Online (Sandbox Code Playgroud)
加工...
;; 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
Run Code Online (Sandbox Code Playgroud)
例如,Clozure Common Lisp 就内置了这个功能。这通常称为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))
Run Code Online (Sandbox Code Playgroud)
SBCL 可以做一些与VOP(虚拟操作)类似的事情。
http://g000001.cddddr.org/2011-12-08