ARM程序集中的双重条件

时间:2013-11-05 03:38:00

标签: assembly arm

我是ARM的新手并为一个班级做作业。 我感到困惑的是双重条件,如果(x> 0& x< 100)做某事。

我想要做的是检查地址内存中是否有大写或小写字符。

我在这里找到了一个链接,但它不适用于ARM,似乎不能帮助我。

我尝试过类似的事情:

BGT r2, #0x60

BLT r2, #0x7B

但是假设有关于期望地址表达式的错误,所以我假设你无法将值直接与int进行比较。

编辑,修复我的状况,输入太快并且放错了GT LT箭头

3 个答案:

答案 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工具,这是gccobjdump -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?似乎有你想要的答案。