这两个错误通常是由于使用了较为复杂的逻辑表达式或是指定了错误的寄存器导致的。对于“表达式过于复杂”的情况,可以尝试将逻辑运算或是寄存器指定拆分成更简单的形式,可以通过使用中间变量或是引入额外的指令来实现。至于“需要lo寄存器”的问题,则需要将对寄存器的使用限制在r0-r7之间,或是使用寄存器别名,如“ip”代表r12寄存器。
对于使用了stmfd sp!, [lr]指令的情况,需要注意的是,这是一条破坏性指令,会将原来的lr寄存器值保存在堆栈中。因此,需要在使用完lr寄存器后及时恢复其原有的值,否则可能会导致程序执行出错。以下是一个示例代码,演示了如何利用中间变量和寄存器别名来避免这些问题:
loop: ldr r1, [r0], #4 cmp r1, #0 str r1, [fp, #-4]! bne loop
mov ip, lr
stmfd sp!, {ip, fp, lr}
sub sp, sp, #16
// 其他指令
add sp, sp, #16
ldmfd sp!, {ip, fp, pc}