Wednesday, July 6, 2016

disassembly at repl?

I realize that "I just discovered something amazing about LISP that other people have known about for 30 years" posts can be kinda irritating, but I'm going to make one anyway.


Apparently in some (all?) dialects of common lisp, one can create a new function at the REPL, ask for its assembly at the REPL, and get the assembly for the function one just typed.


Check this out.


CL-USER> (defun snarf (n) (+ 5 n))
SNARF
CL-USER> (disassemble 'snarf)
; disassembly for SNARF
; Size: 39 bytes. Origin: #x100606317C
; 7C:       498B4C2460       MOV RCX, [R12+96]                ; thread.binding-stack-pointer
                                                              ; no-arg-parsing entry point
; 81:       48894DF8         MOV [RBP-8], RCX
; 85:       BF0A000000       MOV EDI, 10
; 8A:       488BD3           MOV RDX, RBX
; 8D:       41BBD0010020     MOV R11D, 536871376              ; GENERIC-+
; 93:       41FFD3           CALL R11
; 96:       488B5DF0         MOV RBX, [RBP-16]
; 9A:       488BE5           MOV RSP, RBP
; 9D:       F8               CLC
; 9E:       5D               POP RBP
; 9F:       C3               RET
; A0:       0F0B10           BREAK 16                         ; Invalid argument count trap
NIL
CL-USER> (documentation 'disassemble 'function)
"Disassemble the compiled code associated with OBJECT, which can be a
  function, a lambda expression, or a symbol with a function definition. If
  it is not already compiled, the compiler is called to produce something to
  disassemble."
CL-USER>