汇编语言基本概念(续10)

前面学习了标志寄存器,标志寄存器针对一些特定操作结果给予了特定意义,显然我们可以想到利用这些特性,来进行程序判断和进位加减等。8086CPU设置了一些相关指令,这些指令可以进行带位操作,所谓带位操作就是对特定标志位进行判断。下面将讲述以下几种操作指令:

【1】adc 带进位加法指令,利用了CF位上记录的进位值,因此适用于无符号数加减。指令格式 adc 操作对象1 操作对象2 比喻 adc ax,bx相当于(ax)=(ax++(bx)+CF ,因此从形式来看adc指令比add指令多加了一个CF值。

image

从结果来看,adc指令只影响操作数1的结果,它不会影响上一次指令的结果,也就是说如果上一个指令产生了进位和借位值,下一个使用adc指令不会影响上一个指令的操作数,但是执行adc指令时,CF中是0还是1取决于前面的指令,如前面指令是SUB可能产生借位值1如是ADD则产生进位值1.如下图所示:

image

由上图可以看出,使用adc指令可进行带位计算,那为什么呢?我们小时候学习算术时有进位加法,什么意思呢?比喻说128+235首先5+8=13,因此个位为3,进一位到十位上,则2++1=6,这样后面就是带进位计算。所以计算机中也一样,存储器是有16位的,有高8位和低8位,因此,当计算出低8位有进位时,需要向高8位进位,也就是在高8位计算时,需要使用adc指令。使用这个原理,对任间大的数值都可以进行加减,因为我们都可以先进行低位,然后带进位到高位。

【2】sbb是带借位减法指令,同adc指令来类似sbb ax,bx实现的是(ax)=(ax)-(bx)-CF

image

【3】cmp是比较指令,cmp功能相当于减法指令,但结果不存储在任何寄存器中,但会影响相关的标志寄存器,如zf,pf,sf,cf,of。如cmp ax,ax,则zf=1 pf=1 sf=0 cf=0 of=0。因为不同的标志位表示一些特定的含义,如对无符数来说, 如下图所示:

image

对有符号数来说,比较得复杂,主要是有一个符号位,因为有符号位和溢出位,所有单凭一个SF并不能证明结果是否为负。具体有如下几种:

1)如果sf=1,of=0,说明无溢出,(ah)<(bh)

2)如果sf=1,of=1,有溢出(ah)>(bh)

3)如果sf=0,of=1,(ah)<(bh)

4)如果sf=0,of=0 (ah)>=(bh)

【4】检测比较结果的条件转移,前面的转移都是根据寄存器值进行转移,或者根据标号进行转移,实际上因为有标志寄存器不同的位表示一些特定含义,所以设计了一些特定指令用于根据标志位进行转移。如对无符号有如下:

image

【5】pushf和popf 功能是将标志寄存器中值入栈和出栈。占用两个字节。

D:\Temp\NPP593~1.BIN\tmp&gt;debug
-a
13FE:0100 mov ax,0
13FE:0103 push ax
13FE:0104 popf
13FE:0105 mov ax,fff0
13FE:0108 add ax,0010
13FE:010B pushf
13FE:010C
-a
13FE:010C pop ax
13FE:010D add al,c5
13FE:010F add ah,8
13FE:0112
-t

AX=0000  BX=0000  CX=0000  DX=0000  SP=FFEE  BP=0000  SI=0000  DI=0000 
DS=13FE  ES=13FE  SS=13FE  CS=13FE  IP=0103   NV UP EI PL NZ NA PO NC
13FE:0103 50            PUSH    AX                                
-t

AX=0000  BX=0000  CX=0000  DX=0000  SP=FFEC  BP=0000  SI=0000  DI=0000 
DS=13FE  ES=13FE  SS=13FE  CS=13FE  IP=0104   NV UP EI PL NZ NA PO NC
13FE:0104 9D            POPF                                      
-t

AX=0000  BX=0000  CX=0000  DX=0000  SP=FFEE  BP=0000  SI=0000  DI=0000 
DS=13FE  ES=13FE  SS=13FE  CS=13FE  IP=0105   NV UP DI PL NZ NA PO NC
13FE:0105 B8F0FF        MOV    AX,FFF0                           
-tt
  ^ Error
-t

AX=FFF0  BX=0000  CX=0000  DX=0000  SP=FFEE  BP=0000  SI=0000  DI=0000 
DS=13FE  ES=13FE  SS=13FE  CS=13FE  IP=0108   NV UP DI PL NZ NA PO NC
13FE:0108 051000        ADD    AX,0010                           
-t

AX=0000  BX=0000  CX=0000  DX=0000  SP=FFEE  BP=0000  SI=0000  DI=0000 
DS=13FE  ES=13FE  SS=13FE  CS=13FE  IP=010B   NV UP DI PL ZR NA PE CY
13FE:010B 9C            PUSHF                                      
-t

AX=0000  BX=0000  CX=0000  DX=0000  SP=FFEC  BP=0000  SI=0000  DI=0000 
DS=13FE  ES=13FE  SS=13FE  CS=13FE  IP=010C   NV UP DI PL ZR NA PE CY
13FE:010C 58            POP    AX                                
-t

AX=3047  BX=0000  CX=0000  DX=0000  SP=FFEE  BP=0000  SI=0000  DI=0000 
DS=13FE  ES=13FE  SS=13FE  CS=13FE  IP=010D   NV UP DI PL ZR NA PE CY
13FE:010D 04C5          ADD    AL,C5                             
-t

AX=300C  BX=0000  CX=0000  DX=0000  SP=FFEE  BP=0000  SI=0000  DI=0000 
DS=13FE  ES=13FE  SS=13FE  CS=13FE  IP=010F   NV UP DI PL NZ NA PE CY
13FE:010F 80C408        ADD    AH,08                             
-

你可能感兴趣的:(职场,寄存器,休闲)