[英]How to determine when zero flag, sign flag, overflow flag and carry flag are set?
整个国旗的事情让我感到困惑。 网上的定义看起来很简单。 我似乎无法对这一切得到一个非常好的适用解释。
根据它们的定义, - carry:表示无符号整数溢出 - 溢出:表示有符号整数溢出 - 零:操作产生零 - 符号:操作产生负数
那么世界上下面的句子怎么样呢? - 以下说明将设置Sign标志:(这里的答案是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”来自哪里?我只是不明白。)
有人可以让我知道我在这里做错了什么以及正确的解决方法是什么? 谢谢。
这里的答案是252而不是负数。 那么为什么要设置标志旗?
由于无符号它是252,但是无符号不能有符号,因此符号标志仅与处理为有符号的数字相关。 无论你如何处理它,处理器总是处理它与sign标志签名。 因此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.因此结果为零,并且设置了零位。
另一个很好的指南: 了解Carry vs. Overflow条件/标志 。 它有一些很好的分步示例,带有4位数字,可以很容易地保持整个过程。 它还解释了无符号进位是在将这些位解释为无符号时要检查的内容,而有符号溢出是在将这些位解释为有符号时要检查的内容。
基于OP的评论:
这是否意味着当8个最低有效位的值为0时真正打开零标志,而不仅仅是“当操作产生0时”
你需要记住的关键是这是固定宽度的整数运算。 在8位寄存器中,0xFF + 1确实产生0。
在数学术语中,这是模运算 , 8位运算的模数为2 8 。
所以是的, 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只能在没有进位的情况下进行设置,那么你无法分辨出Above和Above-Equ-Equal之间的区别 。 因此,这可能是设计决策不能按照您的第一次猜测的方式进行的最具体原因。
这是签名的比较条件之一:
JLE Jump if less or equal (ZF=1 or SF ≠ OF).
完整的条件是在英特尔的insn set参考手册( x86标签wiki中的链接)中,在jcc
(跳转条件代码)指令列表下。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.