【问题标题】:Double Conditions in ARM assemblyARM 汇编中的双重条件
【发布时间】:2013-11-05 03:37:59
【问题描述】:

我是 ARM 的新手,正在为一门课做作业。 我感到困惑的是双重条件,例如 if (x > 0 && x

我要做的是检查地址存储器中的信息是大写还是小写字符。

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

我尝试了类似的方法:

BGT r2, #0x60

BLT r2, #0x7B

但是会抛出关于期望地址表达式的错误,所以我假设您不能将值直接与 int 进行比较。

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

【问题讨论】:

  • 好的,所以如果你知道如何做一个条件,你可以改写你的条件,比如if (x > 0) { if (x < 100) { /* code here */ } }
  • 连续一个、两个、三个或十几个条件没有区别,它们都实现与一个条件相同。一次只做一个,不要担心做多个的技巧(当然除了大于或等于类型的东西,这实际上是一个单一的条件)。
  • 更重要的问题与管理无符号与有符号有关,这是较难的部分,更有可能做错。
  • bgt 是一个分支,只需要一个 PC 相对偏移量或一个寄存器。你的意思是mov(有条件地设置一个寄存器)还是你想要一个分支?我的回答假设您的意思是 mov 或其他一些非分支指令。

标签: assembly arm


【解决方案1】:

您不能在这样的一条指令中进行比较和分支。您需要使用单独的比较和分支指令。 (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

【讨论】:

  • 如果我希望它只在它的 && 而不是 || 的情况下进入 label_out,我该怎么做
  • 我在这里为另一个处理器写了一篇关于汇编语言条件分支的详尽教程:wiki.intellivision.us/… 事实证明,ARM 汇编语言和该处理器的汇编语言非常相似。只需在大多数地方将CMPRCMPI 替换为CMP,并交换参数顺序(即,将#123, R2 更改为R2, #123)。否则,基本原理都是一样的。
  • 您可能想跳到此处的“If-Then”部分:wiki.intellivision.us/… 对于您的复合 && 条件,如果任一条件测试为假,您想跳到 else。对于化合物 ||条件,如果任一条件测试为真,您想跳转到 then
【解决方案2】:

我很困惑的是双重条件......

您可以使用带有优化功能的编译器和反汇编器来查看它是如何实现的。使用 GNU 工具,这是 gccobjdump -S

如果 (x > 0 && x

您需要检查两个条件并设置标志的汇编程序。假设值 xr0.

  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”运算符),则更直接,因为条件代码允许在这些情况下进行条件比较。

【讨论】:

  • thumb ARM 的一个典型规则是大约三个条件指令大约等于一个分支。主动分析总是更好。
【解决方案3】:

您需要在使用 BLT 或 BGT 之前进行比较。这个帖子:ARM Assembler - How do I use CMP, BLT and BGT? 似乎有你想要的答案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-07-25
    • 1970-01-01
    • 1970-01-01
    • 2021-04-23
    • 1970-01-01
    • 2017-07-19
    • 2012-08-12
    • 2013-08-18
    相关资源
    最近更新 更多