首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Cortex-m4 asm vs cortex M0 asm

Cortex-m4 asm vs cortex M0 asm
EN

Stack Overflow用户
提问于 2019-11-27 19:45:26
回答 1查看 518关注 0票数 0

它检查在发生硬故障之前哪个堆栈指针处于活动状态,并给出指向堆栈寄存器开头的指针:

代码语言:javascript
复制
" 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"

在没有任何更改的情况下,它会产生多个错误:

代码语言:javascript
复制
 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

代码语言:javascript
复制
" 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

好的。启用称为统一语法的东西:

代码语言:javascript
复制
".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后缀,但遇到另一个错误。

EN

回答 1

Stack Overflow用户

发布于 2019-11-27 20:23:15

Cortex-M0显然根本不支持谓词;没有条件执行。最明显的选择是分支。

您的lsrs序列看起来没有正确地实现测试正确的比特,或者测试单个比特。看起来它依赖于所有高位都为零。

通过使用一条移位指令,lsls r3, r0, #29 bpl .skiphttps://godbolt.org/z/aphU5G 展示了一种在单个位上进行分支的巧妙方法: output -将位转移到符号位,在符号位上仅根据该位设置标志。r3目标可以是任何可编码的虚拟寄存器;您不关心值;您只需要设置标志即可。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59069490

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档