(加减指令,既作为无符号数影响标志位CF,AF,又作为有符号数影响标志OF,SF。想了半天终于搞清楚了,CF标志反映最高位的进借位情况,而OF反映结果是否溢出,这里的结果是目的 *** 作数中的结果,进借位它是不管的。你这样想的原因是,考虑到CF为1,则肯定溢出了,但是目的 *** 作数中只能保存溢出后的值,丢掉了最高位,所以就不一定溢出了。看例子:
MOV
AX,7896H;
ADD
AL,AH;
;执行完后CF=1,AL=0EH,但是OEH不溢出,所以OF=0;
后面一句也不对吧。)
以上是我个人的理解。
以下是复制别人的理解:
CF
比较简单吧,
没有什么特别的
OF
表示的带符号数进行运算是否溢出
96+78,
一个是正数,
一个为负数,
相加肯定是不会有溢出的
OF
溢出只可能发生在两个相同符号的数值相加,
或者是不同符号数相减
如果是从算法判断上来看,
如果是在运算时,
次高位向最高位和最高位向
CF
位产生进位情形一致的话,
OF=0;
否则
OF=1
96
10010110
+78
01111000
10E
100001110
这里,
次高位和最高位都产生了进位,
情形一致,
所以
OF=0
16
00010110
+78
01111000
08E
10001110
这里,
次高位向最高位产生了进位,
而最高位没有向
CF
产生进位,
所以
OF=1
而且,
结果也是,
两个正数相加,
结果为负数了,
显然溢出
还有两种情况,
也是类似的
一个是都没有产生进位,
那应该是两个小的正数相加,
结果还是正数,
没有溢出;
另外就是次高位没有产生进位,
但最高位产生进位了,
这应该是两个负数相加,
由于次高为位没有产生进位,
所以,
最高位,
也就是符号位结果为
0,
是正数,
显然也是溢出了
CODE SEGMENT
ASSUME CS:CODE
X DB 0ABH,0CDH,0EFH
Y DB 0ACH,0CDH,0EEH
N EQU $-Y
Z DB N DUP(0)
START: PUSH CS
POP DS
PUSH CS
POP ES
MOV CX,N
MOV BX,0
CLC
@0:
MOV AL,X[BX]
SBB AL,Y[BX]
MOV Z[BX],AL
INC BX
LOOP @0
LEA SI,Z
MOV CX,N
CLD
@1: ; 从低字节到高字节依次显示
LODSB
CALL DSPAL
LOOP @1
MOV AH,4CH
INT 21H
;=============================
DSPAL PROC NEAR
PUSH AX
PUSH BX
PUSH CX
PUSH DX
PUSHF
MOV CX,2
MOV BX,AX
@DSPAL1:
ROR BL,1
ROR BL,1
ROR BL,1
ROR BL,1
MOV DL,BL
AND DL,0FH
CMP DL,9
JA @DSPAL2
ADD DL,30H
JMP @DSPAL3
@DSPAL2:
ADD DL,37H
@DSPAL3:
MOV AH,2
INT 21H
LOOP @DSPAL1
MOV AH,2
MOV DL,'H'
INT 21H
MOV DL,32
INT 21H
POPF
POP DX
POP CX
POP BX
POP AX
RET
DSPAL ENDP
CODE ENDS
END START
以上就是关于汇编语言中的加减法全部的内容,包括:汇编语言中的加减法、用汇编语言写一个多字节二进制数减法程序。要求以十六、等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)