【发布时间】:2018-10-06 16:32:55
【问题描述】:
大多数示例都有如下 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 块?这些示例中到底发生了什么?
【问题讨论】:
-
不幸的是,大多数解释都是为熟悉ARM汇编程序的程序编写的,试图使用THUMB2和
IT。在这种情况下,您之前已经设置了条件代码,这类似于几乎所有汇编器/机器体系结构中存在的“条件分支”指令。所以文档/示例通常假设您知道这一点,并且只显示需要添加到 ARM 代码(IT语句)的条件,然后解释IT编码(ITE与ITT等) .