我开始更加仔细地研究ARM汇编器,并从objdump查找了一些转储。我看到了很多指令(不是唯一的add),最后还有一个额外的saddssubs,...)。

我对ARM文档有些了解,看来表示重要的意思,但我无法弄清楚到底是什么(我发现的文档对我来说似乎很晦涩)。

有人对这个额外的s的含义有一些了解在某些ARM指令的末尾?

#1 楼

通常的ADD不会更新标志。
ADDS不会更新标志。
在arm信息中心请参阅更好的文档。
它在那写到:


如果S是指定后,这些指令将根据结果更新N,Z,C和V标志。


评论


这与我在文档中阅读的内容有关,但是我不知道他们在谈论什么标志。您能否更详细地说明所触摸的标志,并举个例子,说明使用add代替add确实有所不同吗?

–恐怖
2014年5月4日17:19

查看最新答案。

– w s
2014年5月4日在17:26

@perror如果需要另一个具体示例,请考虑循环while(-i){...}。实现它的一种方法是让sub reg#1后面跟一个显式比较为零(当reg变为0时将设置Z零标志),然后是一个谓词分支。使用subs reg,#1,Z标志被隐式更新,因此不需要显式比较。

– Iwillnotexist Idonotexist
2014年5月5日,3:19



#2 楼

添加到ARM指令中的额外s字符意味着APSR(应用处理器状态寄存器)将根据指令的结果进行更新。

状态寄存器(APSR)包含四个标志NZCV表示以下含义:



N == 0:结果大于或等于0,被认为是正数,因此N(负数)位是设置为0。

Z == 1:结果为0,因此Z(零)位设置为1。

C == 1:我们丢失了一些数据,因为结果没有可以容纳32位,因此处理器通过将C(进位)设置为1来表明这一点。

V = 0:从二进制补码有符号算术的角度来看,0xffffffff的确意味着-1,因此我们所做的操作是实际上(-1)+ 1 =0。该操作显然不会溢出,因此V(溢出)设置为0。

有关条件标志的更多信息可以在此处找到ARM体系结构中的s。

评论


还有一点:根据反汇编程序/设置,即使实际上有更新标志,也可以显示不带S后缀的Thumb-1指令(指令子集的短16位编码)。请参阅表4-9。

–伊戈尔·斯科钦斯基♦
2014年5月4日18:55

是因为这是该指令在Thumb模式下的默认行为,还是操作码确实不同,但助记符没有显示出差异?

–恐怖
2014年5月4日19:02

前者。在Thumb-1中,所有ALU指令都设置了标志,因此我猜创建者将后缀删除为“不必要”。使用Thumb-2,可以与ARM集完全等效,您可以选择是否设置标志。因此,改用UAL,并带有明确的S后缀。

–伊戈尔·斯科钦斯基♦
2014年5月4日20:05

N == 0的解释是否应大于或等于0 ...?

–贡特拉姆·布洛姆(Guntram Blohm)
2014年5月4日21:50

@GuntramBlohm:是的,你是对的。它是固定的。

–恐怖
2014年5月4日在22:12