Clozure CLのLAPで遊んでみよう (1) — #:g1

Posted 2012-10-30 13:09:00 GMT

Lispの処理系では昔からアセンブリをS式の表現で書いたLAP(Lisp Assembly Program)というのがあったりします。
特に決まった書式もなく処理系によって使われ方もまちまちですが、CCLだとdisassembleの結果とLAPで関数を定義するccl::defx86lapfunction(x86)の書式が似ているので、色々便利かなと思って、ちょっと試してみました。
とりあえず1を返す関数で実験

(in-package :ccl)

(defun retone () 1)

(disassemble 'ccl::retone)
→
L0
         (leaq (@ (:^ L0) (% rip)) (% fn))       ;     [0]
         (testl (% nargs) (% nargs))             ;     [7]
         (jne L29)                               ;     [9]
         (pushq (% rbp))                         ;    [11]
         (movq (% rsp) (% rbp))                  ;    [12]
         (movl ($ 8) (% arg_z.l))                ;    [15]
         (leaveq)                                ;    [20]
         (retq)                                  ;    [21]
L29
         (uuo-error-wrong-number-of-args)        ;    [29]
出てきたLAPをdefx86lapfunctionのフォームにコピペして、それらしきもので置き換えてみる
(defx86lapfunction ret1 ()
  (check-nargs 0)
  (pushq (% rbp))     
  (movq (% rsp) (% rbp))
  (movl ($ '1) (% arg_z.l))
  (leave)                  
  (single-value-return))
適当解説:
         (leaq (@ (:^ L0) (% rip)) (% fn))       ;     [0]
はなんかのおまじない。
         (testl (% nargs) (% nargs))             ;     [7]
は0かどうかをテストしてるっぽいのに加え引数周りっぽいので(check-nargs 0)で置き換え
         (leaveq)                                ;    [20]
leaveqは無いとコンパイラに怒られるので、leaveに変更
         (retq)                                  ;    [21]
retqはどうもsingle-value-returnあたりっぽいので置き換え、というところです。
という感じで、disassemble
(disassemble 'ccl::ret1)
→
L0
         (leaq (@ (:^ L0) (% rip)) (% fn))       ;     [0]
         (testl (% nargs) (% nargs))             ;     [7]
         (jne L29)                               ;     [9]
         (pushq (% rbp))                         ;    [11]
         (movq (% rsp) (% rbp))                  ;    [12]
         (movl ($ 8) (% arg_z.l))                ;    [15]
         (leaveq)                                ;    [20]
         (retq)                                  ;    [21]
L29
         (uuo-error-wrong-number-of-args)        ;    [29]

同じものができました!
以上、特に落ちもなく

comments powered by Disqus