主要观点:介绍 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) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。