整个旗帜的事情让我很困惑。网络上的定义看起来很简单。对于这一切,我似乎找不到一个真正合适的解释。
根据它们的定义,-进位:表示无符号整数溢出-溢出:表示有符号整数溢出-零:由零产生的运算-符号:由负数产生的运算
那么下面的句子到底是怎么回事以下说明将设置符号标志:(这里的答案是252不是负数。那么为什么设置符号标志?)
mov al,0FEh
sub al,2
>
在8位寄存器中添加7Fh和05h设置溢出标志。(这里的答案是132。它不高于255,为什么会出现溢出?)
在8位寄存器中添加0FFh和05h不会设置溢出标志。(答案是300,那么为什么没有溢出标志?它高于256)
在8位寄存器中添加5到0FBh设置零标志(这里的答案是256,而不是0。我知道8位只能容纳255,但“0”来自哪里?我只是不明白。)
有人能告诉我我做错了什么吗?正确的方法是什么?谢谢。
另一个很好的指南是:了解进位与溢出条件/标志。它有一些很好的4位数字分步示例,可以很容易地将整个事情记在脑子里。它还解释了在将位解释为无符号时要检查的是无符号进位,而在将位解释为有符号时要检查的是有符号溢出。
根据OP的评论:
这是否意味着当8个最低有效位的值为0时,零标志真正打开,而不仅仅是“当操作产生0时”
您需要记住的关键是,这是固定宽度整数算法。在8位寄存器中,0xFF 1确实产生0。
在数学方面,这是模算术,对于8位运算,模为28。
所以是的,ZF
是根据dst=(dst src)%0x100
设置的。
它是这样设计的,因为通常你只想知道寄存器是否为零,在一个开始为负数的寄存器上,是用inc向零计数,还是用一个开始为正的寄存器向零计数。
您仍然可以检查CF==0和ZF==1,以检测无进位零的情况。如果仅当dst和CF均为零时才设置ZF,则通常需要另一条指令来测试结果寄存器。
CF和ZF独立意味着cmp或sub之后的无符号条件代码的工作方式如下:
JA Jump if above (CF=0 and ZF=0).
JAE Jump if above or equal (CF=0).
JB Jump if below (CF=1).
JBE Jump if below or equal (CF=1 or ZF=1).
JC Jump if carry (CF=1).
JE Jump if equal (ZF=1).
我认为,如果ZF只能在没有进位的情况下设置,你就无法区分“高于”和“高于”或“等于”之间的区别。因此,这可能是设计决策不按您最初猜测的方式进行的最具体原因。
下面是一个有符号比较条件:
JLE Jump if less or equal (ZF=1 or SF ≠ OF).
完整的条件集在Intel的insn set参考手册(x86标签wiki中的链接)中,在jcc
(跳转条件代码)指令列表下。
这里的答案是252,不是负数。那么为什么要设置标志?
因为无符号是252,但是无符号不能有符号,所以符号标志只与作为有符号处理的数字相关。不管你如何处理,处理器总是以有符号标志的方式处理它。所以252超过127,所以它在2的补码中是负数,符号位被设置。
在8位寄存器中添加7Fh和05h会设置溢出标志。(这里的答案是132。它不高于255,为什么会有溢出?)
如您所说,当有符号数字会溢出时设置溢出。有符号的8位变量可以从-128到127。因此从127到132是溢出。
在8位寄存器中添加0FFh和05h不会设置溢出标志。(答案是300,那么为什么没有溢出标志?它高于256)
同样,溢出是有符号溢出。这会导致无符号溢出,因此将设置进位。
在8位寄存器中添加5到0FBh设置零标志(这里的答案是256,而不是0。我知道8位只能容纳255,但“0”来自哪里?我只是不明白。)
如你所说,8位可以上升到255。之后它溢出,最低的8位为0。所以结果为零,设置为零位。
我在教科书上读到... 加减法不能导致溢出。引用一下, “如果一个数字为正数,另一个为负数,则加法后不会发生溢出,因为将正数与负数相加会产生幅值较小(…)的结果。”。 然而,通过经历一些问题,情况似乎并非如此,我想确认我计算的不是错误。 例如,这适用于4位加法减法器,其中M=1(这意味着用B减法),A=0101(5)和B=1010(10)。 通过取B=0110(-10)的2s补码并将数字相加,可以
基于比较有符号整数的跳转使用零、符号和溢出标志来确定操作数之间的关系。在具有两个有符号操作数的CMP之后,有三种可能的情况: -目标=来源 -目的地 我很难理解场景2和场景3。我已经研究了可能的组合,并看到它们确实有效——但我仍然不明白它们为什么有效。 有人能解释为什么比较符号和溢出标志反映符号整数关系吗? 编辑: 似乎对我的要求有一些理解。基于签名比较的跳转使用零、符号和进位标志——这些包括、等
问题内容: 我的标志位有问题。我有一个变量来保存标志。首先,我为该变量设置了一些标志。稍后,我需要检查在该变量中设置了多少个标志。但是我不知道要这么做。 问题答案: 要检查是否设置了位值: 重要的是要注意,除非将其表示为All或None(并且不要使用按位逻辑进行比较;请使用),否则不应将其检查值为0,因为any 始终为0。
我知道,两个大于给定处理器总线大小的无符号整数的相加可以通过进位标志实现。通常,使用溢出标志的有符号整数也是如此。然而,Intel 8085只具有符号标志,而不具有溢出标志,因此它如何处理有符号整数算术?
问题内容: 我正在Kubernetes中运行一个容器化的Java应用程序。 为了使jvm保留根据容器规范的内存,必须设置标志。 如果这两个标志与Xms和Xmx标志一起设置,那么jvm的行为是什么?一个标志会覆盖另一个标志吗? 例如,如果我们 在一个容器中的容器中将请求限制为4Gi,将响应限制为4Gi,则在具有128Gi内存的主机中,JVM将保留多少内存? 问题答案: -Xmx标志将覆盖-XX:+
在8位寄存器中添加5到0FBh设置零标志 我是新来的,所以如果你是专家,请对我耐心。下面是我如何分解它的,但我显然做错了什么。也许我对零标志的理解是错误的? 在我的理解中,如果结果为0.0FB=251,则设置零标志;251 5 = 256; 二进制:0000000 100000000十六进制:100 这不是0,那么为什么设置零标志?