当前位置: 首页 > 知识库问答 >
问题:

比较符号和溢出标志如何确定操作数关系?

程祯
2023-03-14

基于比较有符号整数的跳转使用零、符号和溢出标志来确定操作数之间的关系。在具有两个有符号操作数的CMP之后,有三种可能的情况:

  1. ZF=1-目标=来源
  2. SF=OF-目的地

我很难理解场景2和场景3。我已经研究了可能的组合,并看到它们确实有效——但我仍然不明白它们为什么有效。

有人能解释为什么比较符号和溢出标志反映符号整数关系吗?

编辑:

似乎对我的要求有一些理解。基于签名比较的跳转使用零、符号和进位标志——这些包括JGJL等。

例如:

mov   al, 1
cmp   al, -1    
jg    isGreater

isGreater: 

进行跳转是因为Overflow标志=Sign标志(两者均为0),表明在有符号比较方面,目标操作数大于源操作数。

如果Overflow标志设置为1,Sign标志设置为0,则表示目标较小。

我的问题是——我只是想不通为什么这真的有效。

共有2个答案

邹举
2023-03-14

OF标志跟踪符号溢出,即符号的更改。
符号标志显然只是跟踪数字是否为负。
两个标志都监视目标操作数的符号或最高有效位(MSB)。

比较CMP指令执行减法。
如果A!=B并且两个操作数具有相同的符号,那么显然会发生以下情况(假设dword操作数)。

 100 -  200 = -100 (sign change OF=1 + SF=1, ergo A(100) < B(200)).
-100 - -200 =  300 (sign change OF=1 + SF=0, ergo A(-100) > B(-200)).

如果A和B有不同的迹象,则会发生以下情况。

-100 - 100 = -200 (no sign change, SF=1, OF=0, A < B)
100 - -100 = 200  (no sign change, SF=0, OF=0, A > B)

这是所有可能的场景,涵盖了SF<如您所见

唯一的例外是发生无符号溢出时<假设我们正在比较字节操作数(-128..127)。

126 - -126 = -4 (sign change OF=1 + SF=1, ergo A(126) < B(-126)) ***Oops.

但是,这将触发要设置的进位标志(CF),而非溢出操作不会。
这些不正确的结果仅在计算结果不适合操作数大小时才会发生,解决方案是密切关注进位标志,不要假设OF和SF处理所有可能的情况。

毋弘光
2023-03-14

执行有符号减法R=目标-源生成有符号结果。

假设没有溢出-通常的算术定律成立:如果R=目标-源

现在假设有一个溢出-让我们调用O最重要的非符号位,s是符号位<溢出条件意味着a)计算结果的O需要借用,结果的没有,或者b)结果的O不需要借用,结果的没有。

在情况a)中,由于结果不需要借用,操作数的两个s位为(1,0)(1,1)或(0,0)<由于结果的O需要借用,因此翻转第一个信源的位,我们必须排除第二个和第三个选项<因此操作数符号位为1和0(因此目标

在情况b)中,由于结果确实需要借用,操作数的两个s位为(0,1)<由于O不需要借用,因此第一个操作数的位没有更改,我们不需要考虑任何进一步的情况<因此操作数符号位为0和1(因此目标

概述:

  • 如果OF=0,则目标

总之OF=SF。

 类似资料:
  • 整个旗帜的事情让我很困惑。网络上的定义看起来很简单。对于这一切,我似乎找不到一个真正合适的解释。 根据它们的定义,-进位:表示无符号整数溢出-溢出:表示有符号整数溢出-零:由零产生的运算-符号:由负数产生的运算 那么下面的句子到底是怎么回事以下说明将设置符号标志:(这里的答案是252不是负数。那么为什么设置符号标志?) > 在8位寄存器中添加7Fh和05h设置溢出标志。(这里的答案是132。它不高

  • 我正在简单的C程序中试验无符号int数据类型和主方法参数。作为一个实验,我写了一个程序,从命令行获取一个int数作为main方法的参数,并对该数和0之间的每个整数求和。 例如,程序计算 f(n) = (1 2 3... n) 当 n 时有效 我开始注意到的第一件事是当f(n) 我手动发现数学上的最大值,我的程序生成的结果将是有效的(例如,在整数溢出之前),对于有符号整数为65535,对于无符号in

  • 我在教科书上读到... 加减法不能导致溢出。引用一下, “如果一个数字为正数,另一个为负数,则加法后不会发生溢出,因为将正数与负数相加会产生幅值较小(…)的结果。”。 然而,通过经历一些问题,情况似乎并非如此,我想确认我计算的不是错误。 例如,这适用于4位加法减法器,其中M=1(这意味着用B减法),A=0101(5)和B=1010(10)。 通过取B=0110(-10)的2s补码并将数字相加,可以

  • 二元比较操作符比较两个变量或是数值。注意整数和字符串比较的分别。 整数比较 -eq 等于 if [ "$a" -eq "$b" ] -ne 不等于 if [ "$a" -ne "$b" ] -gt 大于 if [ "$a" -gt "$b" ] -ge 大于等于 if [ "$a" -ge "$b" ] -lt 小于 if [ "$a" -lt "$b" ] -le 小于等于 if [ "$a"

  • 我知道,两个大于给定处理器总线大小的无符号整数的相加可以通过进位标志实现。通常,使用溢出标志的有符号整数也是如此。然而,Intel 8085只具有符号标志,而不具有溢出标志,因此它如何处理有符号整数算术?

  • 我有两段XML,其中一部分是: