汇编网首页登录博客注册
fpamc的学习博客
博客首页博客互动【做检测题】论坛求助

我的博客

个人首页 |  我的文章 |  我的相册 |  我的好友 |  最新访客 |  文章收藏 |  论坛提问 |  友情链接 |  给我留言  
图片载入中
学习动态

[2012-05-02 19:45] 第十一章笔记

第十一章 标志寄存器(flag)
8086cpu的标志寄存器有16位,其中存储的信息通常被称为程序状态字(PSW-program state word)
flag寄存器是按位起作用的。
15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00 
0  0  0  0  of df if tf sf zf  0 af  0 pf  0 cf 

flag的第2位是PF,奇偶标志位。其结果最低有效字节中的所有bit位中1的个数是否为偶数,为偶数pf=1,为奇数pf=0

flag的第6位是ZF(zero flag),零标志位。如果结果为0,那么zf=1;如果结果不为0,那么zf=0。

flag的第7位是SF(sign flag),符号标志位。有符号数,如果结果为负,sf=1;如果非负,sf=0。

flag的第10位是DF(direction flag),方向标志位。在处理串指令中,控制每次操作后si、di的增减。
df=0 每次操作后si、di递增
df=1 每次操作后si、di递减

flag的第0 位是CF(carry flag),进位标志位。在进行 无符号数 运算的时候,运算结果有进/借位,CF=1

flag的第11位是OF(overflow flag),溢出标志位。在进行 有符号数 运算的时候,运算结果溢出,of=1

PS:以上英文全称扩展是自己猜的,不保证正确性!!

在计算机中1表示逻辑真,表示肯定;0表示逻辑假,表示否定。当然,是什么的决定权还是在编写者手里。

在8086cpu指令集中,有的指令(大多是进行逻辑或运算的运算指令)的执行是影响标志寄存器的,有的指令(大多是传送指令)的执行对标志寄存器没有影响。
add、sub、mul、div 、inc、or、and等运算指令影响flag 
mov、push、pop等传送指令对flag没影响

inc 和loop指令不影响CF位。

某些指令将影响标志寄存器中的多个标记位,这些被影响的标记位比较全面的记录了指令的执行结果,为相关的指令提供的了所需的依据。

对于位数为N的无符号数来说,其对应的二进制信息的最高位,即N-1位,就是他们的最高有效位,而假象存在的N位,就是相对于最高有效位的更高位。

adc指令,是带进位加法指令,它利用了CF位上记录的进位值。
指令格式:adc 操作对象1,操作对象2
功能:操作对象1=操作对象1+操作对象2+CF

加法可以分为两步来进行:①低位相加;②高位相加再加上低位相加产生的进位值。

sbb指令,是带进位加法指令,它利用了CF位上记录的借位值。
指令格式:sbb 操作对象1,操作对象2
功能:操作对象1=操作对象1-操作对象2-CF

cmp(compare)是比较指令,cmp的功能相当于减法指令,只是不保存结果,将对标志寄存器产生影响。
cmp指令格式:cmp 操作对象1,操作对象2
功能:计算操作对象1-操作对象2但不保存结果,仅仅根据计算结果对标志寄存器进行设置。
cmp ax,bx        如果(ax)=(bx),则zf=1
                如果(ax)≠(bx),则zf=0
                如果(ax)<(bx),则cf=1
                如果(ax)≥(bx),则cf=0
                如果(ax)>(bx),则cf=0并且zf=0
                如果(ax)≤(bx),则cf=1或zf=1
cpu在执行cmp指令的时候,也包含两种含义:进行无符号数运算和进行有符号数运算。所以利用cmp可以对无符号数进行比较,也可以对有符号数进行比较。

在cmp指令执行过程中,结果暂存在cpu内部的暂存器中。
我们应该在考查sf(得知实际结果的正负)的同时考查of(得知有没有溢出),就可以得知逻辑上真正结果的正负。

如果没有溢出,逻辑上真正结果的正负=实际结果的正负
cmp ah,bh
sf=1,而of=0,则ah<bh
sf=1,而of=1,则ah>bh
sf=0,而of=1,则ah<bh
sf=0,而of=0,则ah≥bh

所有条件转移指令的位移都是[-128,127]

根据’无’符号数的比较结果进行转移的条件转移指令。
指令                     含义               检测的相关标志位
je  (jump equal)/jz       等于则转移         zf=1
jne (jump not equal)/jnz   不等于则转移       zf=0
jb  (jump below)/jnae     低于则转移         cf=1
jnb (jump not below)/jae   不低于则转移       cf=0
ja  (jump above)/jnbe     高于则转移         cf=0且zf=0
jna (jump not above)/jbe   不高于则转移       cf=1或zf=1

条件转移指令
CF:
jc   JC为根据标志位CF进行转移的指令      cf=1
jnc  JNC为根据标志位CF进行转移的指令     cf=0
SF:
js   JS是根据符号标志位SF进行转移的指令   sf=1
jns  JNS是根据符号标志位SF进行转移的指令 sf=0
OF:
jo   JO是根椐溢出标志位OF进行转移的指令  of=1
jno  JNO是根椐溢出标志位OF进行转移的指令of=0
PF:
jp/jpe 指令JP与JPE,它们是根据奇偶标志位PF进行转移的指令 pf=1
jnp/jpo指令JNP与JPO,它们是根据奇偶标志位PF进行转移的指令 pf=0

根据’有’符号数的比较结果进行转移的条件转移指令。
指令         含义                        检测的相关标志位
jg/jnle        大于则转移                 (ZF=0 且 SF=OF)
jge/jnl        大于或等于时短跳转          (SF=OF)
jl/jnge        小于时短跳转                (SF< >OF)
jle/jng        小于或等于时短跳转         (ZF=1 或 SF< >OF)
   
循环控制指令
loop          (CX)<--(CX)-1,(CX)< >0,则转移至标号处循环执行,直至(CX)=0,继续执行后继指令
loopz/loope    (CX)<--(CX)-1,(CX)< >0 且ZF=1时,转至标号处循环
loopnz/loopne  (CX)<--(CX)-1,(CX)< >0 且ZF=0时,转至标号处循环

只要是zf=1,就可以使得je指令发生转移
其他同理。

串传送指令(通常和rep指令做搭档)
格式:movsb(move string byte),(字节,串传送指令)
功能:将ds:si指向的内存单元中的字节送入es:di中,然后根据标志寄存器df位的值,将si和di递增1或递减1

格式:movsw(move string word),(字,串传送指令)
功能:将ds:si指向的内存单元中的字送入es:di中,然后根据标志寄存器df位的值,将si和di递增2或递减2

rep的作用是根据cx的值重复执行后面的串传送指令。由于每执行一次movsb指令si和di都会递增或递减指向后一个单元或前一个单元,则rep movsb就可以循环实现(cx)个字符的传送

cld指令:将标志寄存器的df位置0
std指令:将标志寄存器的df位置1

使用串传送指令进行数据的传送,需要给它提供一些必要的信息:
①传送的原始位置:ds:si;
②传送的目的位置:es:di;
③传送的长度:cx;
④传送的方向:df。

pushf的功能是将标志寄存器的值压栈,而popf是从栈中弹出数据,送入标志寄存器。
pushf和popf,为直接访问标志寄存器提供了一种方法。

标志位在debug中的表示
flag                of   df      sf   zf      pf   cf
值为1的标记         OV   DN      NG   ZR      PE   CY
值为0的标记         NV   UP      PL   NZ      PO   NC
    
[…]是闭区间,包括两端点的值  
(…)是开区间,不包括两端点的值
评论次数(0)  |  浏览次数(224)  |  类型(汇编笔记) |  收藏此文  | 
 
 请输入验证码  (提示:点击验证码输入框,以获取验证码