汇编语言中的状态标志符(CF、OF、SF、ZF)在运算(ADD、SUB、ADC、SBB)中的响应变化 详细解释: - SF标志位表示有符号数运算结果的正负性,有四种可能的情况: - 当结果的最高位为0,且操作数为正数时,SF为0; - 当结果的最高位为0,且操作数为负数时,SF为1; - 当结果的最高位为1,且操作数为正数时,SF为1; - 当结果的最高位为1,且操作数为负数时,SF为0。 - ZF标志反映结果是否为0,当结果不为0时,ZF为0。 以下是各种SUB运算下标志符的响应情况: - 无符号数和有符号数都溢出: - CF为1,说明无符号数运算存在溢出; - OF为1,说明有符号数运算存在溢出。 | 操作数 | 运算结果 | CF | OF | | --- | --- | --- | --- | | 114 | -147 | 1 | 1 | - 无符号数: - CF为0,说明没有发生解位; - OF为0,说明没有发生溢出。
无符号数有溢出
1
0110
0011
−
0111
1101
1110
0110
\begin{array}{r} {\color{Red} 1} \ 0110\ 0011\\ -0111\ 1101\\ \hline 1110\ 0110 \end{array}
1 0110 0011−0111 11011110 0110
无符号数:
99
−
125
=
230
99-125=230
99−125=230,同第一个情况,需要借位,故CF = 1
有符号数:
(
+
99
)
−
(
+
125
)
=
(
−
26
)
(+99)-(+125)=(-26)
(+99)−(+125)=(−26),两个同号数相减,无论结果是正数或负数,都不会发生溢出(与加法相反,因为两同号数相减可看作为两异号数相加),故OF = 0
同号两数相减,OF总为0
有符号数有溢出
1010
0110
−
0011
0110
0111
0000
\begin{array}{r} 1010\ 0110\\ -0011\ 0110\\ \hline 0111\ 0000 \end{array}
1010 0110−0011 01100111 0000
无符号数:
166
−
54
=
112
166-54=112
166−54=112,被减数大于减数,无需借位,故CF = 0
有符号数:
(
−
90
)
−
(
+
54
)
=
(
+
112
)
(-90)-(+54)=(+112)
(−90)−(+54)=(+112),负数减正数结果应该为负数,而结果却为正数,发生了溢出,OF = 1
无符号数和有符号数都正常
0010
0110
−
0001
0010
0001
0100
\begin{array}{r} 0010\ 0110\\ -0001\ 0010\\ \hline 0001\ 0100 \end{array}
0010 0110−0001 00100001 0100
无符号数:
38
−
18
=
20
38-18=20
38−18=20,被减数大于减数,无需借位,故CF = 0
有符号数:
(
+
38
)
−
(
+
18
)
=
(
+
20
)
(+38)-(+18)=(+20)
(+38)−(+18)=(+20),同号数相减,故OF = 0
借助标志符实现多位数之间运算
ADC
(add with carry)带进位加法指令
不是attack damage carry
格式:ADC DST, SRC
操作:(DST) ← (DST)+(SRC)+(CF)
其中上式中的CF为运算前CF标志位的值
用16位指令实现32位的双精度数的加法运算。设数A存放在目的操作数寄存器DX和AX,其中DX存放高位字;数B存放在寄存器BX和CX,其中BX存放高位字
;DX=2000H, AX=8000H, A=2000 8000H
;BX=4000H, CX=9000H, B=4000 9000H
ADD AX, CX ;低位字加法
ADC DX, BX ;高位字加法
-
ADD AX, CX
A X : 8000 H + C X : 9000 H A X = 1 1000 H \begin{array}{r} AX:\ 8000H \\ +\ CX:\ 9000H\\ \hline AX={\color{Red} 1} \ 1000H \end{array} AX: 8000H+ CX: 9000HAX=1 1000H
AX寄存器值为 1000 H 1000H 1000H,产生进位CF = 1 -
ADC DX, BX
D X : 2000 H + B X : 4000 H + C F : 1 B D X = 6001 H \begin{array}{r} DX:\ 2000H\\ +\ BX:\ 4000H\\ +\ CF:\qquad {\color{Red} 1} B\\ \hline DX=6001H \end{array} DX: 2000H+ BX: 4000H+ CF:1BDX=6001H
将CF值额外加上,即相当于加上了低位产生的进位,保证了结果的正确性,DX寄存器值为 6001 H 6001H 6001H
即 2000 8000 H + 4000 9000 H = 6001 1000 H 2000\ 8000H+4000\ 9000H=6001\ 1000H 2000 8000H+4000 9000H=6001 1000H
SBB
(subtract with borrow)带借位减法指令
格式:SBB DST, SRC
操作:(DST) ← (DST)-(SRC)-(CF)
其中上式中的CF为运算前CF标志位的值
用16位指令实现32位的双精度数的减法运算。设数A存放在目的操作数寄存器DX和AX,其中DX存放高位字;数B存放在寄存器BX和CX,其中BX存放高位字
;DX=2001H, AX=8000H, A=2001 8000H
;BX=2000H, CX=9000H, B=2000 9000H
SUB AX, CX ;低位字减法
SBB DX, BX ;高位字减法
-
SUB AX, CX
A X : 1 8000 H − C X : 9000 H A X = F 000 H \begin{array}{r} AX:\ {\color{Red} 1} \ 8000H \\ -\ CX:\quad 9000H\\ \hline AX=F000H \end{array} AX: 1 8000H− CX:9000HAX=F000H
AX寄存器值为 F 000 H F000H F000H,产生借位CF = 1 -
SBB DX, BX
D X : 2001 H − B X : 2000 H − C F : 1 B D X = 0000 H \begin{array}{r} DX:\ 2001H\\ -\ BX:\ 2000H\\ -\ CF:\qquad {\color{Red} 1} B\\ \hline DX=0000H \end{array} DX: 2001H− BX: 2000H− CF:1BDX=0000H
将CF值额外减去,即相当于减去了低位向高位借走的1,保证了结果的正确性,DX寄存器值为 0000 H 0000H 0000H
即 2001 8000 H − 2000 9000 H = 0000 F 000 H 2001\ 8000H-2000\ 9000H=0000\ F000H 2001 8000H−2000 9000H=0000 F000H
才疏学浅,盼君指点
推荐阅读
-
介绍YUV格式:YUV444、YUV422和YUV420解析
-
了解YUV和RGB的不同之处及其对YUV444、YUV422、YUV411和YUV420的介绍
-
踞觑yuv422、yuv420和yuv444间的差异
-
每周总结20130814——Android NDK环境的搭建和使用,YUV420SP格式图像的处理
-
在视频中,哪种色彩编码好:YUV420 还是 YUV444?
-
二、代码实现YUV420图像的水平拼接
-
重新表达该标题:编码格式YUV420的解释
-
为什么是YUV420?------- YUV数据格式解析
-
转换NV12为YUV420格式的百转工具
-
研究针对 YUV420 颜色空间的深度图像压缩