首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >关于汇编中IT条件代码的几个问题

关于汇编中IT条件代码的几个问题
EN

Stack Overflow用户
提问于 2018-10-06 16:32:55
回答 1查看 692关注 0票数 1

大多数示例都有IT命令,如下所示:

代码语言:javascript
复制
ITTE   NE        ; IT can be omitted
ANDNE  r0,r0,r1  ; 16-bit AND, not ANDS
ADDSNE r2,r2,#1  ; 32-bit ADDS (16-bit ADDS does not set flags in IT block)
MOVEQ  r2,r3     ; 16-bit MOV

ITT    AL        ; emit 2 non-flag setting 16-bit instructions
ADDAL  r0,r0,r1  ; 16-bit ADD, not ADDS
SUBAL  r2,r2,#1  ; 16-bit SUB, not SUB
ADD    r0,r0,r1  ; expands into 32-bit ADD, and is not in IT block

ITT    EQ        
MOVEQ  r0,r1
BEQ    dloop     ; branch at end of IT block is permitted

ITT    EQ
MOVEQ  r0,r1
BKPT   #1        ; BKPT always executes
ADDEQ  r0,r0,#1   

例如,我想看看示例中的最后一个IT块。我真搞不懂到底发生了什么。对于MOVEQ,我认为它是在检查r0 = r1,如果它们相等,则将r1移动到r0中。但如果他们是平等的,那就没有意义了。到底是怎么回事?

我编写了一个大拇指代码,检查哪个数字更大:

代码语言:javascript
复制
cmp r0, r1
ITE HS
movhs r0, r0
movlo r0, r1

在这里我需要在IT块之前比较寄存器..。但为什么所有的例子都不包括一个比较,至少在手头上?是否有另一种方法可以为我的示例编写不包括比较的IT块?这些例子到底是怎么回事?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-10-06 16:39:57

标志是IT块内谓词指令的输入。是的,您确实在某个时候将cmpadds或其他设置标志的指令放在it之前。以前不一定是对的。

您展示的示例用于文档化IT的拐角案例,而不是完整/完整的使用它实际执行特定操作的示例。

条件分支指令的文档通常也不会显示标记设置指令。

根据[医]手臂医生

除了CMP、CMN和TST之外,通常影响条件代码标志的16位指令在IT块中使用时不影响它们。

但其中一个示例清楚地表明,您可以在IT块中使用32位adds更改标志,这告诉我们允许进行常规的比较/测试指令。

文档没有清楚地说明,对it块中的标志的更改会对块内的后续谓词指令产生影响。@DanLewis的回答证实了这一点。

在ARM模式下,不需要IT块来执行谓词(每条指令中有4位编码谓词),因此标记设置指令显然会影响以后的指令。它在拇指模式下的工作方式是相同的,特别是因为IT在某些语法中是可选的。(一些汇编程序将为您插入统一的语法,如果组装为拇指模式。)

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

https://stackoverflow.com/questions/52681110

复制
相关文章

相似问题

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