ASSUME DS:seg1,CS:seg2
seg1 SEGMENT
;数据段代码定义
seg1 ENDS
seg2 SEGMENT
start:
MOV AX,seg1
MOV DS,AX ;将数据段加载到DS段寄存器里
;MOV AL,1H
;ADD AL,7fH;不带进位加法指令,改变标志位,但不加CF
;最高位未产生进位,CF=0
;奇数个1,PF=0
;低四位进位,AF=1
;结果不为0,ZF=0
;最高位为1,SF=1
;7FH=127D=0111 1111B
;+1=1000 0000B(-128)符号位溢出,OF=1
;是否溢出看目的操作数(AL/AX)是多少位的
;MOV AL,1H
;ADD AX,7FFFH
;7FFFH=32767D=0111 1111 1111 1111B
;+1=1000 0000 0000 0000B(-32768)符号位溢出,OF=1
;---------------------------------------------------
;带进位加法指令ADC
MOV AL,1H
ADC AL,7fH;上面的ADD指令已经将CF=1,所以AL的值应该是
;7FH+1H+CF(1H)=81H,如果是有符号数就为-127
;而最开始的ADD指令却是80H,
;但是如果只有ADC指令而无其他修改标志位的指令
;就会造成结果是80H,原因就在于8086汇编是先进行
;源操作数+目的操作数+CF,再根据结果改变标志位
;其实也可以这样想,没有结果,标志位该根据什么改变呢?
seg2 ENDS
END start
8086汇编关于溢出、ADC/ADD、of溢出标志位的问题
于 2023-03-16 17:59:17 首次发布