我尝试在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的内容没有影响。 非常感谢!
答案 0 :(得分:2)
写入寄存器的表达式实际上不会改变寄存器状态。在运行表达式之前,lldb保存寄存器状态,然后运行表达式,然后在完成后恢复寄存器状态。几乎在所有情况下,您都不希望对寄存器进行任何更改,以便运行一些复杂的表达式,以便在程序继续时继承,或者它只会崩溃。
如果您需要明确更改注册状态,则必须使用register read
。
我知道这不是你练习的重点,这个评论更多的是解释为什么这种方法不起作用。