簡體   English   中英

Poke操作碼進入內存

[英]Poke opcodes into memory

嗨,我試圖了解是否可以采取指令操作碼並將它們“戳”到內存中或將它們轉換為二進制程序。 我在這里找到了一個廢棄的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

例如Clozure Common Lisp就有這個內置功能。 這通常稱為LAPLisp匯編程序

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

我了解到它可以使用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 irc頻道)的專家幫助解決這個問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM