我对 ARM 很陌生,正在为一门课做作业。我感到困惑的是双重条件,例如 if (x > 0 && x < 100) 做某事。
我想要完成的是检查地址存储器中的信息是否是大写或小写字符。
我在这里找到了一个链接,但它不适用于 ARM,而且似乎对我没有帮助。
我试过类似的东西:
BGT r2, #0x60
BLT r2, #0x7B
但是会抛出关于期望地址表达式的错误,所以我假设您不能将值直接与 int 进行比较。
已编辑,修复了我的状况,打字太快并放错了 GT LT 箭头
您不能在这样的一条指令中进行比较和分支。您需要使用单独的比较和分支指令。(ARM 确实有“零比较和分支”,但这不适用于这里。)
你想要更多类似的东西:
CMP r2, #100
BGT label_out
CMP r2, #0
BLT label_out
... do stuff
label_out: ; the branches come here if R2 < 0 || R2 > 100
我感到困惑的是双重条件......
您可以使用具有优化功能的编译器和反汇编器来查看它是如何实现的。使用 GNU 工具,这是gcc
和objdump -S
.
如果 (x > 0 && x < 100)
您需要检查两个条件并设置标志的汇编程序。假设值x在 中r0
。
sub r1, r0, #1 ; change zero test to minus.
cmp r1, #98 ; allow equal.
; condition 'ls' (lower and same) for true
movls r2, #42 ; set r2 to 42 if(x > 0 && x < 100)
; condition 'hi' (high unsigned) opposite flags
movhi r2, #24
这是任何 CPU 的典型特征。编译器将测试转换为更好地映射到底层指令集的东西。您的示例测试有不同的运算符。
一些需要较少概念的代码更容易理解,
if(x > 0 && y > 0)
这在汇编程序中转化为更直接的东西,
cmp r0, #0
cmpgt r1,#0
movgt r0,#42 ; condition passed (here with signed conditions).
如果测试是针对相同的条件(通常是相同的“C”运算符),则更直接,因为条件代码允许在这些情况下进行条件比较。
在使用 BLT 或 BGT 之前,您需要进行比较。此线程:ARM 汇编程序 - 如何使用 CMP、BLT 和 BGT? 似乎有你正在寻找的答案。