简短背景: BRLO (分支机构,如果下)指令说明为1。如果C标志== 1;2.执行分支。执行分支如果Rd < Rr (从CP指令)
我的问题是:我会用4位数来演示.假设Rd = Rs =3= 0011。从上文第2点开始,不应发生分支。CP指令执行Rd - Rr.如果我们在减法中使用两个补码,则有0011 - 0011 = 0011 + 1100 + 0001 = 0000,C-标志= 1。因此,上面第1点与第2点相矛盾。
假设我错了:我在哪里搞砸了?
谢谢
发布于 2019-06-06 12:01:47
简而言之,给出相同结果的运算并不总是等价的操作。因此,您的假设,即0011 - 0011 = 0011 + 1100 + 0001,将具有相同的进位标志值-是错误的。
尽管A+ (~B + 1)给出了与and相同的结果,但结果并不相同,也不会以相同的方式更新标志。
事实上,你忘了一件事。在你的例子中:
0011 + 1100 + 0001 = 0000 -错了。因为0011 + 1100 + 0001 = 1__0000
您忘记了A+ (~B + 1)仅在考虑两个补码溢出时才等于A。
现在,您可以看到进位标志在这两个操作中都是完全相反的。事实上,A+ ~B +1在第一次或第二次加法中都会有溢出,而且只有在and没有借入(底流)的情况下才会发生溢出。
当执行加法C标志时,意味着溢出已经发生,也就是说,应该从最左边位的左边执行一个溢出。
也就是说,如果您要添加:
0110
+ 1101
----
10011
^^^^ the result
^ the carry flag这意味着,如果在一个较长的数字上进行加法,由多个寄存器组成,则必须在较高的部分中添加一个。例如。
add r16, r18 // adds r18 to r16, C flag is set only when overflow happened
adc r17, r19 // adds r19 to r18, and add one if C flag is set. updates the C flag by the overflow again
// in result r17:r16 = r17:r16 + r19:r18当进行减法时,C标志表示借用发生在最左边位的左边,因此数字的较高部分应该减少1。
* * - borrow positions
0110
- 1101
----
0001
^ carry flag is set when borrowed at left from the leftmost positions.在汇编程序中有sbc指令,这使得减法作为sub指令,但是如果设置了进位标志,则结果会减少一个。
sub r16, r18 // subtracts r18 from r16, C flag is set only when underflow happened
sbc r17, r19 // subtracts r19 from r18, and subtracts one more if C flag is set. updates the C flag by the underflow again
// in result r17:r16 = r17:r16 - r19:r18因此,回答您的问题:当您从自身减去数字时,进位标志的值将被清除,因为没有发生下溢。
AVR体系结构有一个简单的分支机制。它有8个标志位,每个分支指令只根据来自这些分支的一个比特的值来生成分支。
因此,BRLO和BRCS都是同一机器代码的助记符,如果设置了进位标志,就会产生分支。只有当从较低的值减去较高的无符号值时,才会设置进位标志。
如果要进行签名比较,则必须使用BRLT指令,它查看S标志,它等于标志N和V的独占OR。当操作结果为负号(设置了更高的位)时,将设置N标志。V标志表示已发生签名溢出。它们的排他性或组合意味着从较小的数字中减去更大的有符号数。
https://stackoverflow.com/questions/56446161
复制相似问题