它检查在发生硬故障之前哪个堆栈指针处于活动状态,并给出指向堆栈寄存器开头的指针:
" tst lr, #4 \n"
" ite eq \n"
" mrseq r0, msp \n"
" mrsne r0, psp \n"
" ldr r1, [r0, #24] \n"
" ldr r2, handler2_address_const \n"
" bx r2 \n"
" handler2_address_const: .word prvGetRegistersFromStack \n"在没有任何更改的情况下,它会产生多个错误:
Error: unshifted register required -- tst r0,#4''
Error: selected processor does not support 'ite eq' in Thumb mode
Error: Thumb does not support conditional execution
Error: Thumb does not support conditional execution
Error: invalid offset, target not word aligned (0x00000002)
Error: invalid offset, value too big (0x00000002)我尝试过的:
用这种方法替换tst并删除IT
" mov r1, lr\n"
" lsr r0, r1, #3\n" // Replace tst with lsr and cmp
" cmp r0, #1\n"
" mrseq r0, msp\n" // <- Error: Thumb does not support conditional execution
" mrsne r0, psp\n" // <- Error: Thumb does not support conditional execution好的。启用称为统一语法的东西:
".syntax unified\n"
".thumb\n"
" mov r1, lr\n"
" lsrs r0, r1, #3\n" // tst gives "Can not honor suffix width" so replaced it with lsrs and cmp
" cmp r0, #1\n"
" ite eq\n" // <- Error: selected processor does not support `ite eq' in Thumb mode. If I remove it compiler states that mrseq must be in IT block
" mrseq r0, msp\n"
" mrsne r0, psp\n"
" ldr r1, [r0, #24]\n"
" ldr r2, handler2_address_const\n"
" bx r2\n"
" handler2_address_const: .word prvGetRegistersFromStack\n"这些错误的原因是什么?如何修复它们?仍然不知道是什么导致了对齐问题。
当然,某些指令在CM0上不受支持。但我不明白"Thumb不支持条件执行“的错误,以及没有条件执行该如何生活。
此外,当启用统一语法时,错误“不能遵守寄存器宽度”意味着什么,以及为什么会发生这种情况。据我所知,它是关于16/32位指令的。尝试添加.W后缀,但遇到另一个错误。
发布于 2019-11-27 20:23:15
Cortex-M0显然根本不支持谓词;没有条件执行。最明显的选择是分支。
您的lsrs序列看起来没有正确地实现测试正确的比特,或者测试单个比特。看起来它依赖于所有高位都为零。
通过使用一条移位指令,lsls r3, r0, #29 bpl .skip;https://godbolt.org/z/aphU5G 展示了一种在单个位上进行分支的巧妙方法: output -将位转移到符号位,在符号位上仅根据该位设置标志。r3目标可以是任何可编码的虚拟寄存器;您不关心值;您只需要设置标志即可。
https://stackoverflow.com/questions/59069490
复制相似问题