objdump
查找了一些转储。我看到了很多指令(不是唯一的add
),最后还有一个额外的s
(adds
,subs
,...)。我对ARM文档有些了解,看来表示重要的意思,但我无法弄清楚到底是什么(我发现的文档对我来说似乎很晦涩)。
有人对这个额外的
s
的含义有一些了解在某些ARM指令的末尾?#1 楼
通常的ADD
不会更新标志。ADDS
不会更新标志。在arm信息中心请参阅更好的文档。
它在那写到:
如果S是指定后,这些指令将根据结果更新N,Z,C和V标志。
#2 楼
添加到ARM指令中的额外s
字符意味着APSR(应用处理器状态寄存器)将根据指令的结果进行更新。状态寄存器(APSR)包含四个标志
N
,Z
,C
和V
表示以下含义: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
评论
这与我在文档中阅读的内容有关,但是我不知道他们在谈论什么标志。您能否更详细地说明所触摸的标志,并举个例子,说明使用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