主要观点:介绍 SBCL(Common Lisp 实现)的内部结构,通过实例和工具来探索 Lisp 对象在内存中的表示、实际编译的 Lisp 代码位置、特殊变量绑定等问题,同时假设读者熟悉 Lisp 和 x86 汇编,且已安装 SBCL。
关键信息:
- 用
(disassemble 'testfunc)可查看函数testfunc的反汇编代码,能了解参数传递和操作过程。 - 通过修改反汇编代码中的字节值,如将
0x42改为0x50,可改变testfunc的返回值。 sb-kernel:get-lisp-obj-address可获取 Lisp 对象的地址,但不建议在生产环境中使用。- Lisp 对象在内存中是“标记指针”形式,用最后几位表示类型,其余为实际指针。
- 如字符串在内存中以特定方式存储,可通过工具修改其内容。
src/runtime/genesis/constants.h文件描述了 SBCL 运行时中 Lisp 对象的布局。
重要细节:testfunc中MOV EDI, 66表明参数通过GENERIC-+处理,且修改字节值可改变结果。- 反汇编代码中的地址和内存操作细节,如
[RIP-122]等。 - 关于不同类型对象的标记和存储方式,如数字、函数指针、列表指针等。
- 对各种工具的使用示例,如
hexdump-address函数用于转储内存内容。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用。你还可以使用@来通知其他用户。