我是ARM的新手并为一个班级做作业。 我感到困惑的是双重条件,如果(x> 0& x< 100)做某事。
我想要做的是检查地址内存中是否有大写或小写字符。
我在这里找到了一个链接,但它不适用于ARM,似乎不能帮助我。
我尝试过类似的事情:
BGT r2, #0x60
BLT r2, #0x7B
但是假设有关于期望地址表达式的错误,所以我假设你无法将值直接与int进行比较。
编辑,修复我的状况,输入太快并且放错了GT LT箭头
答案 0 :(得分:2)
你不能在这样的指令中进行比较和分支。您需要使用单独的比较和分支指令。 (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
答案 1 :(得分:2)
我感到困惑的是双重条件......
您可以使用带优化的编译器和反汇编程序来查看它是如何实现它的。使用GNU工具,这是gcc
和objdump -S
。
if(x> 0&amp;&amp; x&lt; 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'运算符),条件代码允许在这些情况下进行条件比较,则更直接。
答案 2 :(得分:0)
在使用BLT或BGT之前,您需要进行比较。这个帖子:ARM Assembler - How do I use CMP, BLT and BGT?似乎有你想要的答案。