关于进位和溢出,我一直分不清楚,直到最近重新学习汇编语言,我对这两个概念产生了新的理解。
下面是代码,我把说明放在代码注释中了。
;//数据传输示例
.386
.model flat, stdcall
.stack 4096
ExitProcess PROTO, dwExitCode:DWORD
.data
.code
main PROC
;// 前提:CPU不知道一个数是“有符号”还是“无符号”,这些概念是程序员定义的,程序员可以“选择性”地忽略一些标志位。
;// 进位是无符号数的概念
mov eax, 0
mov al, 0FFh ;// 255
add al, 1 ;// CF = 1
;// 溢出是有符号数的概念
mov eax, 0
mov al, +127 ;// 7F
add al, 1 ;// OV = 1, CF = 1
;// 可以这样理解:0FF是255,已经超出了有符号数的最大范围+127,所以它只能是无符号数255,因此没有溢出
;// 对于+127,显式指定这是个有符号数,而且的确在范围内,因此这就是有符号数,就有溢出的概念
;// 另外对于+127,加1也会产生进位,这是因为 +127 是“有符号”还是“无符号”由程序员决定,
;// 如果程序员认为这是一个无符号数,那么关心进位标志位,忽略溢出标志位;
;// 如果程序员认为这是一个有符号数,那么关心溢出标志位,忽略进位标志位。
INVOKE ExitProcess, 0
main ENDP
END main
这些理解是我个人思考的结果,不保证绝对准确!
如果我的理解不对,希望您能指出,非常感谢!