当前位置: 首页 > 汇编 > 正文

汇编学习(六)8086汇编拾遗 (5)

8086 标志寄存器

8086 的最后一个比较重要的寄存器 标志寄存器

状态寄存器的三种作用:

@用来存储相关指令的某些执行结果

@用来为CPU执行相关指令提供行为依据

@用来控制CPU的相关工作方式

ZF标志:

记录相关指令执行后,其结果是否为0,结果为0,zf = 1,不为0 ,zf = 0.

PF标志:

奇偶效验寄存器,记录相关指令执行后,其中所有位中1 的个数是否为偶数,如果1是偶数,pf = 1,如果为奇数pf = 0.

SF标志:

记录相关指令执行后,其结果是否为负,如果为负,sf = 1,否则 sf = 0.在计算机看来,是不分数字的正负的,完全就是靠标志寄存器的SF 的标志的,决定正负数的运算。

CF标志:

进位标志:一般情况下,再进行无符号运算的时候,它记录了,运算结果的最高有效位,向更高有效位的进位或者借位。

OF标志:

溢出指令,再进行有符号数运算的时候,如果超过了机器所能表示的范围称为溢出。

adc 指令:

adc是带进位加法指令,它利用了CF位上记录的进位值。

指令格式:adc 操作对象1,操作对象2

实现功能:(ax) = (ax) + (bx) +CF

这条指令其实就是为了大数相而确定的,例如1EF000H + 201000H,结果高16位ax,低16位bx 中。

128位数字加法:

sbb 指令

带借位减法指令,它利用了CF位上记录的借位值

指令格式:

sbb   操作对象1,操作对象2

实现功能:(ax) = (ax) – (bx) -CF

 

cmp 比较指令

比较指令,其实采用的是减法原理比较的。

首先无符号比较:

很简单,参考是否借位就能比较了。

cmp ax,bx

zf = 1,ax = bx

zf = 0,ax != bx

cf = 1,ax < bx

cf = 0,ax >= bx

cf = 0 and zf = 0,ax > bx

cf = 1 or zf = 1 ax <= bx

对于有符号数的比较:

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

检测比较结果的条件转移指令

转移指令根据无符号的比较结果进行转移的条件转移指令

je   等与则转移   zf == 1

jne  不等与则转移   zf = 0

jb    低于则转移     cf = 0

jnb   不低于则转移 cf = 0

ja     高与则转移     cf = 0 zf = 0

jna    不高于则转移   cf = 1 或 zf = 1

DF 标志

向量标志位:在串指令中,控制每次操作后si,di的增减。

df = 0 每次操作后 si di 递增

df = 1 每次操作后si  di 递减

 

movsb  movsw 指令相当于以下的几步操作:

movsb :

((es)*16 + (di)) = ((ds)*16 + (si))

if(df == 0)

(si) = (si) +1

(di) = (di)+1

if(df == 1)

(si) = (si)-1

(di) = (di)-1

rep  :循环指令 ,一般和movsb  movsw 连用

如何决定df 的值,8086又有两个新的专门指令

cld : 设置df = 0

std:  设置df = 1

两个小例子:

将data段中的第一个字符串复制到它后面的空间中

使用传送指令,将F000H段中的最后16个字符复制到data 段中。

终于最后两个指令了,好累

pushf 和 popf

着两个命令是将标志寄存器压栈,弹栈送入寄存器标志中的命令。只有这两种放方法我们能访问寄存器。

debug 中寄存器的标志位:

标志                   1                       0

OF                 OV                    NF

DF                 DN                     UP

SF                  NG                    PL

ZF                  ZR                     NZ

PF                  PE                     PO

CF                  CY                    NC

编写一个程序将以0结尾的字符串小写变大写

 

 

 

 

本文固定链接: http://zmrlinux.com/2016/05/29/%e6%b1%87%e7%bc%96%e5%ad%a6%e4%b9%a0%ef%bc%88%e5%85%ad%ef%bc%898086%e6%b1%87%e7%bc%96%e6%8b%be%e9%81%97-5/ | Kernel & Me

该日志由 root 于2016年05月29日发表在 汇编 分类下, 你可以发表评论,并在保留原文地址及作者的情况下引用到你的网站或博客。
原创文章转载请注明: 汇编学习(六)8086汇编拾遗 (5) | Kernel & Me