繁体   English   中英

SUB指令在汇编AVR中如何工作

[英]how does the SUB instruction work in assembly AVR

SUB 指令在 AVR 汇编中是如何工作的? 是否需要两个恭维并添加它,还是 function 不同? 如果我减去两个 8 位数字,比如 1 - 2 并且答案是 -1,我应该期望 1 的二进制补码还是其他值?

编辑:我不知道在考虑高于 128 的数字时如何考虑这个问题,我对双恭的理解是你可以数到的数字的一半,但是如果我给出 SUB 指令来做:

2 - 255

位操作是什么样的? 我的理解是 255 的二进制补码需要 9 位(100000001),它只是在 8 位系统中溢出吗? 数学看起来像:

00000010 + 00000001 = 00000011

汇编语言不做减法,机器代码也不做减法,处理器中的逻辑做。 是的,它确实使用加法来做减法。

2 - 255

从小学

2 - 255 = 2 + (-255)

我们从第一学期的编程中知道 class,反转并加一个

2 - 255 = 2 + (-255) = 2 + ~255 + 1

现在用加法器很容易做到

         1
  00000010
+ 00000000
===========

 000000001
  00000010
+ 00000000
===========
  00000011

现在这看起来很奇怪,但是如果您正在考虑带有 255 之类的数字的 8 位,那就是 -1 符号。 所以 2 - (-1) = 2 + 1 = 3。这是有道理的。 二进制补码的美妙之处在于我们可以使用相同的逻辑而不关心无符号或有符号,对于相同的位模式,您会得到相同的答案。

正如评论 255 中指出的那样,8 位数字只能是无符号的。 但相同的位是-1。

你的例子很难想象。 因为它都工作相同的 4 位在这里比 8 更容易描述。所以 0 到 15 或 -8 到 7 用于无符号或有符号。

所以如果我们做 12 + 5 我们会得到 17 但这是一个无符号溢出,让我们试试:

     0
  1100
 +0101
======


 11000
  1100
 +0101
======
  0101

设置了执行,所以我们有一个无符号溢出。

-7 - 4 = -11 怎么样

 10011
  1001
+ 1100
=======
  0110

这是6,但是:查看msbit的进位和进位。 它们不一样,所以这是一个有符号溢出。 另一种说法是查看操作数的 msbits 和结果,如果操作数 msbits 相同但结果不同,则它是有符号溢出。

如果我们有另一个位 10110 是 1001+1 = 1011 所以 -11。

它适用于 8 位或 32 位或 64 位或 128 位。 乘法和除法可以有有符号和无符号,但是由于二进制补码的性质,加法和减法,位模式使用加法器,对于有符号或无符号没有什么特别的。 关心的是程序员,而不是逻辑。

现在,当涉及到级联时,这确实很重要,尤其是减法。 上面没有显示,你可以自己试试,但是当做无符号时,msbit 的进位当然是无符号溢出,但如果处理器使用标志,那就变成进位标志。 但是对于减法,1(并且没有符号溢出)意味着不借。 数学不需要借用(如果你用手写而不是倒置并添加一件事)。 这很好,但一些处理器将其反转并使进位标志成为减法的借用标志。 其他人不反转并使其成为不借用标志进行减法。 如果有借位减法,那么它们是否反转与如何处理 lsbit 进位有关。 现在这被隐藏在逻辑中并且“正常工作”,但是既然你问这些事情是如何工作的。

此外,更好的处理器文档(阅读:ARM)向您显示了一个条件表以及哪些标志是什么。 如果进位是借位而不是借位进行减法,则处理器之间的处理器将不同,因为减法用于比较指令...

只要您减去两个相等类型的数据,减法运算就可以工作。 这意味着您可以减去signed - signedunsigned - unsigned 您不能混合有符号和无符号类型。

第一种情况:

; xl, yl is considered as signed 
ldi xl, 2     ;first op  = 2
ldi yl, 255   ;second op = -1
sub xl, yl    ;result    = 3  because (2-(-1))
brvs overflow ;test if overflow occurred (no it's false now)

第二种情况:

; xl, yl is considered as unsigned 
ldi xl, 2     ;first op  = 2
ldi yl, 255   ;second op = 255
sub xl, yl    ;result    = invalid   because 2-255 is negative 
brlo overflow ;test if first operand is lower as second (yes it's true now)

如果你真的想减去 2 - 255,你必须为两个数字使用两个字节。 因为结果是 -253 而一个字节的有效范围只有 -128 到 127

; xh:xl, yh:yl is considered as signed 
ldi xh, 0
ldi xl, 2     ;first op  = 2
ldi yh, 0
ldi yl, 255   ;second op = 255
sub xl, yl
sbc xh, yh    ;result is -235 (0xFF03)
brvs overflow ;test if overflow occurred (no it's false now)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM