汇编语言 第十一章 标志寄存器

标志寄存器   flag

标志寄存器只有一个,16位,有9个标志位,剩余7个位置默认为0,未被使用。

  • 0-CF  (carry flag进位标志) (CY:   CF = 1;    NC:CF = 0)(carry、no carry)判断过程是否有进位或者借位,cf = 1表示有进位或借位,cf = 0表示没有。cf的标志只对无符号数有意义。inc指令和dec指令不影响CF位
  • 2-PF(parity flag奇偶标志)(PE:PF = 1;    PO:PF = 1)(even、odd)判断结果的所有位中1的个数是否为偶数,pf = 1表示1的个数为偶数;pf = 0表示1的个数为奇数,注意不是判断数本身的奇偶,而是1的个数的奇偶。  
  • 4-AF(auxiliary flag辅助标志)(AC:AF = 1;    NA :AF = 0)(AC、NO AC)  
  • 6-ZF(zero flag零标志)(ZR:ZF = 1;    NZ:ZF = 0)(zero、not zero)   判断结果是否为0,zf = 1表示结果为0;zf = 0表示结果为1。
  • 7-SF(sign flag符号标志)(NG:SF = 1;    PL:SF = 0)(negative、positive)判断结果是否为负,sf = 1表示结果为负;sf = 0表示结果非负(判断依据是最高位是否为1)如果把数据当作无符号数,SF的值没有意义,虽然相关指令影响了SF的值。
  • 8-TF(trap flag陷阱标志)
  • 9-IF(iinterrupt flag中断标志)(EI:IF = 1;DI:IF = 0)(enabled、disabled
  • 10-DF(direction flag方向标志)(DN:DF = 1;    UP:DF = 0)(decrement、increment)控制每次操作后si、di的增减(为1时减,decrease),df = 0 每次操作后si、di递增;df = 1 每次操作后si、di递减。cld指令将df复位0,std指令将df置1
  • 11-OF(overflow flag溢出标志)(OV:OF = 1;    NV:OF = 0)(overflow、not overflow)两个有符号数的运算:将运算全部转换成加,正+负不会产生溢出;负+负变成正,正加正变成负产生溢出    of的溢出只对有符号数有意义

起标志作用,用来存储某些指令的执行结果 或者 为执行某些指令提供依据

只有运算指令对标志寄存器有影响(add、sub、mul、div、inc、dec、or、and、xor)(加减乘除、自增自减、与、或、异或)。

mov、push、pop等传送指令对标志寄存器没有影响

adc指令

带进位加法指令,指令格式:adc 操作对象1,操作对象2    功能:操作对象1 = 操作对象1 + 操作对象2 + CF

加法可以分两步来进行:①低位相加;②高位相加再加上低位相加产生的进位值; 利用adc指令,可以实现任意位数的加法。

sbb指令

带借位减法指令,指令格式:sbb 操作对象1,操作对象2    功能:操作对象1 = 操作对象1 - 操作对象2 - CF

cmp比较指令:

指令格式:cmp 操作对象1,操作对象2   功能:计算操作对象1 - 操作对象2 ,但并不保留结果,不改变操作对象的值,只对标志位有影响。

cmp ax,bx可能产生的6种情况以及对应的转移指令:

  • (ax) = (bx),则zf = 1;    对应指令为 je 等于则转移(equal)
  • (ax) ≠ (bx),则zf = 0;    对应指令为jne 不等于则转移(not equal)
  • (ax) < (bx),则cf = 1;    对应指令为jb 小于则转移(below)
  • (ax)  ≥ (bx),则cf = 0;    对应指令为jnb 不小于则转移(not below)
  • (ax)  > (bx),则cf = 0且zf = 0;    对应指令为ja 大于则转移(above)
  • (ax)  ≤ (bx),则cf = 1或zf = 1;    对应指令为jna 不大于则转移(not above)(是否转移完全由对应标志位决定,即使两数关系不一定如此)

根据sf、of判断大小:

  • sf = 1, of = 0,则ax < bx
  • sf = 1, of = 1,则ax > bx
  • sf = 0, of = 0,则ax ≥ bx
  • sf = 0, of = 1,则ax < bx (无溢出时,关系正常;有溢出时,关系相反且不能取等)

串传送指令movsb:

b表示Byte,一次传送一个字节。格式:movsb    功能:将ds:[si]的内容复制到es:[di],同时根据df的值增减si和di    movsw是传送一个字节

一般来说传送的都是较长单位,所以常与rep(repeat)配合使用。 rep movsb == s:movsb    loops,循环的次数由cx控制,一次传送cx个字节。

使用串传送指令的四个要素:

  1. 传送的原始位置:ds:si
  2. 传送的目的位置:es:di
  3. 传送长度:cx
  4. 传送方向:df

pushf和popf:

  • pushf:将标志寄存器的值压栈(push flag)
  • popf:从栈中弹出数据,送入标志寄存器中(pop flag)

 

posted @ 2021-10-26 22:38  海萌萌萌萌萌萌  阅读(596)  评论(0编辑  收藏  举报