欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

汇编语言中的状态标志符(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,说明没有发生溢出。

最编程 2024-08-03 21:41:03
...
  • 无符号数有溢出
    1   0110   0011 − 0111   1101 1110   0110 \begin{array}{r} {\color{Red} 1} \ 0110\ 0011\\ -0111\ 1101\\ \hline 1110\ 0110 \end{array} 1 0110 00110111 11011110 0110
    无符号数: 99 − 125 = 230 99-125=230 99125=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 01100011 01100111 0000
    无符号数: 166 − 54 = 112 166-54=112 16654=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 01100001 00100001 0100
    无符号数: 38 − 18 = 20 38-18=20 3818=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 ;高位字加法
    
    1. 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

    2. 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 ;高位字减法
    
    1. 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

    2. 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 8000H2000 9000H=0000 F000H

    才疏学浅,盼君指点