lldb表达式评估中的内联汇编?

inline assembly in lldb expression evaluation?

我尝试在 LLDB 的表达式中使用内联汇编,但它似乎不起作用。作为玩具示例,我在 ARM 上 运行:

(lldb) expr  __asm__ __volatile__("mov r0, 4");
(lldb) register read
General Purpose Registers:
        r0 = 0x00000003

实际上,我需要访问特殊的 CP15 c13 软件线程 ID 寄存器,并且无法在 LLDB 中找到其他方法 - 所以这里的想法将不胜感激。我想到了使用

expr  __asm__ __volatile__("MRC p15, 0, r0, c13, c0, 3");

它运行s,但对r0的内容没有影响。 非常感谢!

写入寄存器的表达式实际上不会改变寄存器状态。在 运行 一个表达式之前,lldb 保存寄存器状态,然后它 运行 是你的表达式,完成后恢复寄存器状态。在几乎所有情况下,您都不希望为了 运行 一些复杂的表达式在程序继续时被程序继承而对寄存器进行任何更改,否则它只会崩溃。

如果您需要显式更改寄存器状态,则必须使用register read

我知道这不是您练习的重点,此评论更多是为了解释为什么该方法不起作用。