大多数示例都有IT命令,如下所示:
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中。但如果他们是平等的,那就没有意义了。到底是怎么回事?
我编写了一个大拇指代码,检查哪个数字更大:
cmp r0, r1
ITE HS
movhs r0, r0
movlo r0, r1在这里我需要在IT块之前比较寄存器..。但为什么所有的例子都不包括一个比较,至少在手头上?是否有另一种方法可以为我的示例编写不包括比较的IT块?这些例子到底是怎么回事?
发布于 2018-10-06 16:39:57
标志是IT块内谓词指令的输入。是的,您确实在某个时候将cmp或adds或其他设置标志的指令放在it之前。以前不一定是对的。
您展示的示例用于文档化IT的拐角案例,而不是完整/完整的使用它实际执行特定操作的示例。
条件分支指令的文档通常也不会显示标记设置指令。
根据[医]手臂医生
除了CMP、CMN和TST之外,通常影响条件代码标志的16位指令在IT块中使用时不影响它们。
但其中一个示例清楚地表明,您可以在IT块中使用32位adds更改标志,这告诉我们允许进行常规的比较/测试指令。
文档没有清楚地说明,对it块中的标志的更改会对块内的后续谓词指令产生影响。@DanLewis的回答证实了这一点。
在ARM模式下,不需要IT块来执行谓词(每条指令中有4位编码谓词),因此标记设置指令显然会影响以后的指令。它在拇指模式下的工作方式是相同的,特别是因为IT在某些语法中是可选的。(一些汇编程序将为您插入统一的语法,如果组装为拇指模式。)
https://stackoverflow.com/questions/52681110
复制相似问题