我对ARM和为一个班级做作业非常陌生。我搞不懂的是一个双重条件,比如,如果(x >0 && x< 100)做某事。
我要做的是检查地址存储器中的信息是大写还是小写。
我在这里找到了一个链接,但它不是给ARM的,似乎对我没有帮助。
我试过这样的方法:
BGT r2, #0x60
BLT r2, #0x7B
但是抛出了期望地址表达式的错误,所以我假设你不能将值stright与int进行比较。
编辑,修复了我的情况,我打字太快,并且放错了GT LT箭头
发布于 2013-11-05 11:49:10
你不能像那样在一条指令中同时做比较和分支。您需要使用单独的比较和分支指令。(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发布于 2013-11-06 01:07:22
,我搞不懂的是一个双重条件。
您可以使用带有优化的编译器和反汇编程序来查看它是如何实现这一点的。对于GNU工具,这是gcc和objdump -S。
if (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”运算符),则更加直接,因为在这些情况下,条件代码允许条件比较。
发布于 2013-11-05 11:48:05
您需要在使用BLT或BGT之前执行比较。这个帖子:ARM Assembler - How do I use CMP, BLT and BGT?似乎有你正在寻找的答案。
https://stackoverflow.com/questions/19781523
复制相似问题