【问题标题】:inline assembly in lldb expression evaluation?lldb表达式评估中的内联汇编?
【发布时间】:2025-12-13 10:25:01
【问题描述】:

我尝试在 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");

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

【问题讨论】:

    标签: lldb


    【解决方案1】:

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

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

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

    【讨论】:

    • 感谢 Jim 的澄清。您的意思是“注册写入”吗?另外,有没有办法像这样改变PC?
    • Arg,是的,“注册写入”。您可以通过“reg write pc”来更改 pc——“pc”是架构上程序计数器的任何寄存器的别名。或者您可以使用“线程跳转”,它允许您通过地址、偏移量或文件和行指定目标。我相信你知道自己在做什么,但我有责任指出——尤其是在混合使用 ARC 之类的情况下——跳动程序计数器可能对程序的健康非常危险......
    • 再次感谢。所以回到我最初的问题:组装确实有效,但我可以让它有用吗?我的意思是我需要编写一条指令,将结果移动到我可以从 lldb 访问的地方?正如您所解释的,寄存器已恢复,那么我可以将使用 MRC 检索的结果放在哪里?
    • 如果你能找到一个地方将结果粘贴到内存中,那么你可以使用“内存读取”将其重新取出。