汇编第六日

flag寄存器:

ZF=1表示计算结果为0,反之

PF = 0表示计算结果二进制表示中1的个数为奇数,反之

SF = 0表示计算结果为正,反之

CF为1,在加法中表明结果出现仅为,在减法中表明结果出现借位,反之

OF = 1表示计算结果溢出,反之

 

对于无符号数,CPU用CF位记录计算结果是否产生进位

对于有符号数,CPU用OF位记录计算结果是否产生溢出

两者计算结果都用SF位记录符号

 

adc指令:带进位加法指令

例如:

 

sbb指令:带借位指令

sbb ah 0:(ah) = (ah) - 0 - (cf)

 

cmp ax, bx指令

实际上执行了(ax)-(bx),但是结果并不保存在ax中仅仅改变标志寄存器中相应的位

若 ax=bx 那么ZF = 1;反之

但是对于cmp ax, bx后发现SF = 1,即结果符号为负,能否说明(ax) < (bx)?

否,例如对于有符号数,ah = 22H(补码表示34),bh = 0A0H(补码表示-96)

(ah) - (bh) = 34 - (-96) = 130 = 82H,82H是-126的补码,所以SF = 1,但是ah明显大于bh

 

要考虑OF和SF得两者大小:

 

 

1.对于无符号数cmp,要检查ZF,CF位

2.对于有符号数cmp,要检查SF,OF,ZF位

 

对于标识寄存器中位的jmp指令,该指令可以配合cmp(无符号数)使用,cmp比较之前两对象大小会修改flag寄存器中对应位,之后使用对应的jmp指令实现跳转

je(e:equal,表明上面cmp两对象相等):ZF = 1转移,反之

jne(ne:not equal,表明上面cmp两对象不相等,下同):ZF = 0转移,反之

jb:CF  = 1转移,反之

jnb:CF  = 0转移,反之

ja:CF  = 1,ZF = 0转移,反之

jna:CF  = 1或ZF = 1转移,反之

 

DF标志位

DF = 0 si和di寄存器内容会递增1

DF = 1 si和di寄存器内容会递减1

例如:

movsb指令:以字节单位传递数据

实现:((es)*16+(di)) = ((ds)*16+(si))

之后如果DF = 0,di和si内容加1(1个内存单元);反之

movsw指令:以单位传递数据

实现:((es)*16+(di)) = ((ds)*16+(si))

之后如果DF = 0,di和si内容加2(2个内存单元);反之

 

rep movsb指令:

根据cx寄存器中字数,反复执行“movsb” (cx)次,实现(cx)个字节传递

 

cld指令:将DF置为0(clear)

std指令:将DF置为1(set)

 

pushf指令:将标志寄存器内容压栈

popf指令:将栈顶内容弹出标识寄存器

 

中断处理程序一直存在内存中,以防止CP随时调用

 

iret指令:将返回到中断前进程执行(将CS:IP出栈,flag出栈)

 

mov ax, 8 - 4 = mov ax, 4

 

设置TF = 1将产生单步中断,CPU将当前进程执行一条指令,之后去执行单步中断的中断处理程序(例如debug)

 

Done!!!

posted on 2017-08-06 21:34  chaunceyctx  阅读(156)  评论(0编辑  收藏  举报

导航