关于ARM里面的CMP指令的个人理解

来源:互联网 发布:centos 7.2怎么样 编辑:程序博客网 时间:2024/05/29 03:13
首先先抱怨一句:...........看到书上这个描述(看附图)的时候我都彻底无语了,居然要这样理解CMP指令对C进位位的影响,好痛苦!!图片
也就是说,如果执行 CMP A,B 之后,如果 A >= B ,由于没有产生借位,所以BorrowFrom(R0 - shifter_operand) = 0,因此C Flag = 1,也就是C进位位被置1了。如果有借位,则C进位位清零。

不过也不能看书上这样写就真的是这样。为了证明一下这个结论,特地写了一段程序检验:
图片
从这里可以看到,R1 > R0 ,但是执行完 CMP R1,R0 之后却发现C进位位置1了(见左方的cpsr寄存器)。所以说,书上应该说的没错了。

在这里想提一下那个ARM指令的条件码(也是一个让我无语的地方,那个助记符的取名比x86的汇编指令要难记多了):
图片
其中留意到助记符CS/HS的含义是无符号数大于/等于,也表示C = 1,所以说执行完 CMP A,B 指令之后如果结果是 A >= B ,即满足‘无符号数大于等于’的条件, 所以CS/HS的条件得到满足,某些需要这个条件的指令可以执行了。同时由于  A >= B ,所以C = 1,这样书上所说的应该就是能说得通了。

综上所述,得到以下结论:
执行 CMP A,B ;     如果 A >= B 则C位置1,同时满足所谓的CS/HS条件(无符号数大于/等于)