【发布时间】:2016-08-03 16:00:59
【问题描述】:
整个标志的事情让我很困惑。网络上的定义似乎很简单。对于这一切,我似乎无法得到一个非常好的适用解释。
根据他们的定义, - 进位:表示无符号整数溢出 - 溢出:表示有符号整数溢出 - 零:操作产生零 - 符号:操作产生一个负数
那么下面的句子到底是怎么回事? - 以下指令将设置标志标志:(这里的答案是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 而不是负数” 答案是 0xFC,可以看作 252 或 -4。 Intel手册中对符号标志的描述是“设置等于结果的最高有效位,即有符号整数的符号位。(0表示正值,1表示负值。) ". 0xFC 显然设置了最高有效位。
-
“我知道8位只能容纳255,但“0”是从哪里来的?” 256的8位最低有效位的值是多少?
-
@Michael 0。这是否意味着当第 8 个最低有效位的值为 0 时,零标志才真正打开,而不仅仅是“当操作产生 0 时”?
-
这个 SO 答案可能有助于理解。它是 4 位,但它同样适用于更宽的寄存器,如 8、16、32、64 等:stackoverflow.com/a/24002847/3857942
标签: assembly