首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AVR对等号的减法是否设置SREG C-标志?

AVR对等号的减法是否设置SREG C-标志?
EN

Stack Overflow用户
提问于 2019-06-04 14:41:19
回答 1查看 453关注 0票数 0

简短背景: 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点相矛盾。

假设我错了:我在哪里搞砸了?

谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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标志时,意味着溢出已经发生,也就是说,应该从最左边位的左边执行一个溢出。

也就是说,如果您要添加:

代码语言:javascript
复制
  0110
+ 1101
  ----
 10011
  ^^^^ the result
 ^ the carry flag

这意味着,如果在一个较长的数字上进行加法,由多个寄存器组成,则必须在较高的部分中添加一个。例如。

代码语言:javascript
复制
 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。

代码语言:javascript
复制
 *  *  - borrow positions
  0110
- 1101
  ----
  0001
 ^ carry flag is set when borrowed at left from the leftmost positions.

在汇编程序中有sbc指令,这使得减法作为sub指令,但是如果设置了进位标志,则结果会减少一个。

代码语言:javascript
复制
 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个标志位,每个分支指令只根据来自这些分支的一个比特的值来生成分支。

因此,BRLOBRCS都是同一机器代码的助记符,如果设置了进位标志,就会产生分支。只有当从较低的值减去较高的无符号值时,才会设置进位标志。

如果要进行签名比较,则必须使用BRLT指令,它查看S标志,它等于标志NV的独占OR。当操作结果为负号(设置了更高的位)时,将设置N标志。V标志表示已发生签名溢出。它们的排他性或组合意味着从较小的数字中减去更大的有符号数。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56446161

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档