assembly - 有没有办法让 sbcl 打印出 CPU 寄存器的值?

标签 assembly common-lisp x86-64 cpu-registers sbcl

有没有办法让SBCL在我的程序中的某个点获取CPU寄存器的值并将其打印为整数?

我必须使用gdb吗?

最佳答案

是的,您可以使用 VOPs (Virtual Operations) 访问 CPU 寄存器。 .在 VOP 中,您也可以在汇编中编写代码,因此从这个意义上说,您可以使用诸如 gcc 扩展汇编之类的 VOP。

因此,这里有一个示例 VOP 和用于执行它的相关函数。 get-cpuid-eax VOP 接收两个无符号的 32 位参数作为输入,将它们存储在 eax 中。和 ecx , 执行 cpuid指令,并返回 eax 的值注册后cpuidget-cpuid-eax调用 VOP 的函数。 get-cpuid-eax函数然后将值存储在 *result* 中.您可以使用 (format t "~a" *result*) 轻松打印该值.

注意:有一些问题(SBCL 或我的代码中的错误?)导致此代码始终无法毫无问题地执行。重新编译和重新加载通常会有所帮助。我已经确认了cpuid eax两者输出 gccgdb 中扩展汇编并运行 x86-64 汇编程序.对于 eax 中的相同值,所有结果都相同和 ecx .

编辑:将函数和 VOP 名称更改为 get-cpuid-eax避免与变量名称混淆。

编辑:使用 slimv 固定代码格式。

(sb-vm::defknown get-cpuid-eax
((无符号字节 32) (无符号字节 32))
(无符号字节 32)
(sb-c::折叠 sb-c::flushable sb-c::movable))

(sb-vm::define-vop (get-cpuid-eax)
(:policy :fast-safe)
(:translate get-cpuid-eax)
(:args
(my-eax :scs (sb-vm::unsigned-reg) :target eax)
(my-ecx :scs (sb-vm::unsigned-reg) :target ecx))
(:arg-types sb-vm::unsigned-num sb-vm::unsigned-num)
(:暂时的
(:sc sb-vm::unsigned-reg :offset sb-vm::eax-offset)
eax)
(:暂时的
(:sc sb-vm::unsigned-reg :offset sb-vm::ecx-offset)
ecx)
(:结果
(我的结果:scs(sb-vm::unsigned-reg)))
(:result-types sb-vm::unsigned-num)
(:发电机
0
(sb-vm::move eax my-eax)
(sb-vm::move ecx my-ecx)
(sb-vm::inst cpuid)
(sb-vm::move my-result eax)))

(defun get-cpuid-eax (my-eax my-ecx)
(声明(类型(无符号字节 32)my-eax my-ecx)
(优化(速度3)(安全0)))
(defparameter *result* (get-cpuid-eax my-eax my-ecx)))

一些带有简短 VOP 的网站,我在编码时发现它们非常有用:

Dmitry Kaliyanov's article "Добавление примитивов виртуальной машины SBCL" ("Adding primitive virtual machines of SBCL", in Russian)

the Lisp code for Dmitry Kaliyanov's article (above)

Dmitry Ignatiev's blog entry: SBCL, x86, SSE (in Russian)

Christophe Rhodes' presentation slides (pdf): Unportable but fun: Using SBCL Internals

kurohuku's blog entry: "SBCLでCPUID" (in Japanese)

swap-bytes source code file sbcl-vops.lisp

希望这可以帮助。

关于assembly - 有没有办法让 sbcl 打印出 CPU 寄存器的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15350409/

相关文章:

lisp - lisp代码的解释

c - 汇编与 C 代码比较

windows - Win32 ASM 程序不向命令行打印任何内容

c++ - if 语句与 if-else 语句,哪个更快?

assembly - 在 Mac 上编写和学习汇编

macos - 如何让这个简单的程序集运行?

lisp - 如何检查另一端是否已从单个线程关闭我的套接字流?

common-lisp - setq vs 未声明的自由变量(常见的 lisp)

c - 使用 PAPI 从 perf_event_uncore 列表读取硬件计数器

opencv - OpenCV 2.0 是否针对 AMD 处理器进行了优化?