首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >臂装配中的双重条件

臂装配中的双重条件
EN

Stack Overflow用户
提问于 2013-11-05 11:38:00
回答 3查看 5K关注 0票数 1

我对ARM和为一个班级做作业非常陌生。我搞不懂的是一个双重条件,比如,如果(x >0 && x< 100)做某事。

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

我在这里找到了一个链接,但它不是给ARM的,似乎对我没有帮助。

我试过这样的方法:

BGT r2, #0x60

BLT r2, #0x7B

但是抛出了期望地址表达式的错误,所以我假设你不能将值stright与int进行比较。

编辑,修复了我的情况,我打字太快,并且放错了GT LT箭头

EN

回答 3

Stack Overflow用户

发布于 2013-11-05 11:49:10

你不能像那样在一条指令中同时做比较和分支。您需要使用单独的比较和分支指令。(ARM确实有一个“零上的比较和分支”,但在这里不适用。)

你想要更像这样的东西:

代码语言:javascript
复制
    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
票数 2
EN

Stack Overflow用户

发布于 2013-11-06 01:07:22

,我搞不懂的是一个双重条件。

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

if (x >0 && x< 100)

你需要汇编程序来检查这两个条件并设置一个标志。比方说x的值是r0

代码语言:javascript
复制
  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的典型特征。编译器将测试转换为更好地映射到底层指令集的内容。您的示例测试具有不同的操作符。

一些需要更少概念的代码更容易理解,

代码语言:javascript
复制
  if(x > 0 && y > 0)

这在汇编程序中转化为更直接的东西,

代码语言:javascript
复制
  cmp r0, #0
  cmpgt r1,#0
  movgt r0,#42 ; condition passed (here with signed conditions).

如果测试是针对相同的条件(通常是相同的“C”运算符),则更加直接,因为在这些情况下,条件代码允许条件比较。

票数 2
EN

Stack Overflow用户

发布于 2013-11-05 11:48:05

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19781523

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档