comp.lang.lispを読んでいて「LISPが吐き出すネイティブコードを読む方法」が紹介された記事があったので、簡単なコードを見てみました。実行環境はiBook G3/800、Mac OS X 10.4.5。LISPはsbcl 0.9.7を使いました。
CL-USER> (defun adder (a b) (+ a b)) ADDER CL-USER> (compile 'adder) ADDER NIL NIL CL-USER> (disassemble 'adder) ; 48864F48: 92EF0004 STW $LRA,4($CFP) ; no-arg-parsing entry point ; 4C: 830F000C LWZ $A0,12($CFP) ; 50: 832F0010 LWZ $A1,16($CFP) ; 54: 3AF300A0 ADDI $LRA,$CODE,160 ; 58: 490001D2 BA #x10001D0 ; #x010001D0: all_threads_lock ; 5C: WORD #X00000000BYTE #X00, #X00, #X00, #X00 ; 60: WORD #X00002836BYTE #X00, #X00, #X28, #X36 ; possible LRA header ; 64: 7ED0B378 MR $CSP,$OCFP ; 68: 60000000 NOP ; 6C: 3A73FF60 ADDI $CODE,$CODE,-160 ; 70: 806F0000 LWZ $NL0,0($CFP) ; 74: 814F0004 LWZ $FDEFN,4($CFP) ; 78: 7DF07B78 MR $CSP,$CFP ; 7C: 7C6F1B78 MR $CFP,$NL0 ; 80: 3BEA0005 ADDI $LIP,$FDEFN,5 ; 84: 7FE803A6 MTLR $LIP ; 88: 7D535378 MR $CODE,$FDEFN ; 8C: 4E800020 BLR ; NIL
こんな感じです。そういえば僕はZ80とi80x86系しかアセンブリは読めないのでした。PowerPCのはよくわかりません。ディスアセンブルしたのに残念ながら読めません。同じことをMacBook Pro、Mac OS X 10.4.5、sbcl 0.9.11でやってみると、
; 116116B9: 8B55F4 MOV EDX, [EBP-12] ; no-arg-parsing entry point ; BC: 8B7DF0 MOV EDI, [EBP-16] ; BF: E87CEA9EEF CALL #x1000140 ; unboxed_region ; C4: 7302 JNB L0 ; C6: 8BE3 MOV ESP, EBX ; C8: L0: 8D65F8 LEA ESP, [EBP-8] ; CB: F8 CLC ; CC: 8B6DFC MOV EBP, [EBP-4] ; CF: C20400 RET 4 ; D2: 90 NOP ; D3: 90 NOP ; D4: 90 NOP ; D5: 90 NOP ; D6: 90 NOP ; D7: 90 NOP ; D8: 0F0B0A BREAK 10 ; error trap ; DB: 02 BYTE #X02 ; DC: 18 BYTE #X18 ; INVALID-ARG-COUNT-ERROR ; DD: 4D BYTE #X4D ; ECX ; DE: 0F0B0A BREAK 10 ; error trap ; E1: 02 BYTE #X02 ; E2: 18 BYTE #X18 ; INVALID-ARG-COUNT-ERROR ; E3: 4D BYTE #X4D ; ECX NIL;
こんな結果になりました。こっちのほうが見なれた雰囲気のコードです。うむ、満足。