OF在visual studio里叫OV,CF在visual studio里叫CY。
在寄存器和内存里永远只有0和1,可以理解为计算机是不知道正负的。11111110当作无符号数看待是254,当作有符号数看待是-2。是人按照约定的规则来评判一段内存或寄存器里的内容,才有所谓的无符号、正和负。
虽然计算机无所谓正负数,但人有所谓,这就是OF和CF产生的原因。
数字加减的过程中可能OF和CF会同时变化。把数字当有符号时要观察OF的变化而不用理会CF,把数字当作无符号时要观察CF的变化而不必理会OF。
OF和CF是否发生变化,还与目标操作数的容量有关系。
MOV AL,0x7EH
ADD AL,0x5BH
;结果AL=D9
以上结果OF=1溢出,CF=0没有进位(也可以理解为没有溢出)。
把7E和5B视为无符号,那么AL最大能表示FF(255),D9(217)可以放进AL寄存器。因为AL是8位,最大储存11111111,D9的二进制是11011001,用AL足够储存,无需进位因此CY=0。
当把一组二进制数视为有符号数,二进制第一位是0的视为正数,是1的视为负数。
把7E和5B视为有符号,按照补码标准它们都是正数,结果是+217。此时AL最大能表示7F(127),D9(217)无法表示。因为AL是8位寄存器,最多只能储存01111111(+127),D9的二进制11011001按照补码标准应该解读为-39,但这里属于有符号运算,必须把结果解读为+217,按补码标准只有011011001(9个位)才能表示,AL寄存放不下9个位,所以OV=1,提醒结果溢出。
mov al, 7EH
add ax, 5BH
由于ax是16位,011011001(+217)才9个二进制位,所以结果不溢出OV=0。
总结,溢出和进位本质是在指定大小的空间内,0和1不够存放,无法表示某个数字,必须使用上一级的空间。对于CPU空间是按8、16、32、64位寄存器逐级增加,对于内存空间则是按1、2、4、8字节逐级增加。