Assembly ADD指令的结果是什么意思;环绕;如果大于参数的大小

Assembly ADD指令的结果是什么意思;环绕;如果大于参数的大小,assembly,x86,Assembly,X86,我正在学习Udemy的汇编语言冒险:完整课程 在解释ADD指令时,讲师说,如果ADD指令的结果大于参数的大小,则该结果将“环绕” 它环绕着什么意思 据我所知,在4位带符号的数字中,我不能添加两个(正)数字,这会导致数字大于7,或者结果溢出,从而改变符号位。这就是讲师的意思吗?基本上就是这个意思。如果添加两个数字,结果无法存储在目标中,则: 如果存在最重要的存储列*的进位,则将精确设置进位;及 如果结果的符号不正确**,则将完全设置溢出 因此,一般来说,进位用于将加法扩展到多个字,但如果处理有

我正在学习Udemy的汇编语言冒险:完整课程

在解释ADD指令时,讲师说,如果ADD指令的结果大于参数的大小,则该结果将“环绕”

它环绕着什么意思


据我所知,在4位带符号的数字中,我不能添加两个(正)数字,这会导致数字大于7,或者结果溢出,从而改变符号位。这就是讲师的意思吗?

基本上就是这个意思。如果添加两个数字,结果无法存储在目标中,则:

  • 如果存在最重要的存储列*的进位,则将精确设置进位;及
  • 如果结果的符号不正确**,则将完全设置溢出
因此,一般来说,进位用于将加法扩展到多个字,但如果处理有符号的数字,则要注意溢出,以检查结果是否不正确

我认为他指的是你所说的:如果你处理的是4位无符号数字,那么例如1001+1001=10010=进位集,结果0010。所以你把9和9相加,结果是2。从某种意义上说,结果一直上升到15,然后又回到0,然后又继续上升到2

如果你想象你处理的是有符号的数字,那么你实际上执行了(-7)+(-7),结果是2。将两个负数相加无法得到正结果,因此设置了溢出-符号不正确。你可以先降到-8,然后跳到7,然后继续降到2


*例如,好像它是任何其他长的加法:

1100 +
0101
----
0101 (result)
11   (carry)
最重要的列(位于左侧)生成进位。因此处理器将设置进位标志

**这里的逻辑很简单:

  • 如果两个正数相加产生负数,则设置溢出
  • 如果两个负数相加产生一个正数,则设置溢出
  • 否则,请重置溢出
所以你只要看看这两个数字的符号。如果符号相同,但结果的符号不同,则设置溢出。否则重置它

不存在正负数字的组合,当添加时,即使使用进位进行添加,也不会与目的地不符。用最极端的例子来尝试一下:

  • 127+(-128)=-1,这符合
  • 127+(任何比-128更接近于0的值)=介于-1和127之间的值,这符合
  • (任何比127更接近于0的值)+(-128)=介于-1和128之间的值,适合

虽然我理解了第二部分,但你的两个要点让我不知所措:如果从存储的最高有效位列到第一个隐式丢失列有进位,那么进位将被准确设置,这意味着什么?如果截断结果的效果是给人留下错误符号的印象,则将准确设置溢出。“精确设置”是什么意思?另外,如果我在al中加上两个溢出的数字,结果是否会在寄存器的ah部分“溢出”?哦,这些只是CPU用来决定如何设置其状态位的测试。我试着扩展一下。哦,“设定准确时间”有点像律师主义:如果我只是说“设定时间”,那么可能还有其他原因可以解释为什么会设定carry。但在这种情况下没有。就像我说“如果我冷了,我的窗户就会关上”;它也可以关闭,即使我很温暖,但不在家。如果我说“如果我真的很冷”,那么我已经承诺,如果你看到它关闭了,那么无论我在哪里,我都很冷。如果它没有关闭,那么无论我在哪里,我都不冷。Aquazi:如果您
添加al,
并且结果不适合8位,
ah
不会受到影响,因为指令中只指定了
al
。要将溢出值转换为
ah
,您需要显式地将右侧的8位值转换为16位值,
al
转换为
ax
(再次是8->16b),并添加ax,,这将使
ah
包含结果的上8位(对于两个8位值相加后的无符号数学,结果将始终适合9位,因此ah=0或1(与
add al时的进位相同,…
).两个有符号8位值将以ah=0或-1@Aquazi当有疑问时,运行一些调试器,打开任何可执行文件,大多数调试器都允许直接在其中写入少量指令,所以只需编写少量的
mov
来设置寄存器来测试值,然后将您有疑问的指令放在那里,然后单步执行。就像
moval,0C4h
添加al,al
->
al
将是
0x88
,CF=1,OF=0,ZF=0,SF=1,
ah
不变,等等。想想模,如下面所回答的,缩写形式,它会将较低的位剪掉。添加0xFF和0xFF无符号。如果允许无限个结果位,则得到0x1FE,但如果限制为8 in和8 out,则结果is FE是结果2^8或256的模。将结果中较低的8位像模一样剪掉。模是指如果限制为8位,并且您希望计数为0x1FE或510,则它会环绕多少。510/256是1余数254(0xFE)。有符号和无符号溢出标志进一步帮助查看它是否适合结果(进位=无符号溢出)想想十进制,99+99=198,但就像计算机一样,如果我将自己限制为两位数,结果是98,它超过了100/0的滚动点。