汇编语言 第十一章 标志寄存器
标志寄存器 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个字节。
使用串传送指令的四个要素:
- 传送的原始位置:ds:si
- 传送的目的位置:es:di
- 传送长度:cx
- 传送方向:df
pushf和popf:
- pushf:将标志寄存器的值压栈(push flag)
- popf:从栈中弹出数据,送入标志寄存器中(pop flag)