汇编语言10之标志寄存器以及一些movadcsbb指令

8086CPU的flag寄存器的结构

]

空白的位没有意义,保留不用

有些指令的执行对标志位没有影响,例如movpushpop等等,他们大多数为传送指令

image-20210812154644757

标志位介绍

ZF:理解成是否为零

​ 运算结果为0标志位为1

​ 运算结果不为0标志位为0

PF:奇偶标志位,理解成结果是否有偶数个1

运算的结果中,如果有奇数个1,PF则为0

运算结果过中,如果有偶数个1,PF为1

SF:符号标志位,理解成结果是不是为负

结果过为负,SF=1

结果不为负数,SF=0

计算机以补码的形式进行计算操作,这种形式的计算实际上已经包含了两种意义。整个运算如果看成是有符号数,那么结果就是运算后有符号数的补码,标志位SF将会指示着运算结果的正负,如果看成是无符号数,那么结果一定就是运算后的无符号数,此时,SF是没有任何意义的

CF:进位标志位

无符号运算中,有可能产生最高有效位向更高有效位的进位。

减法操作也有可能出现借位情况,同样会表现在标志位的变换

OF:溢出标志位

有符号数的情况下,如果发生溢出,这个标志位将会被设置为1

通常会配合SF符号位的使用

DF:方向标志位

在串处理指令中,控制每次操作后si,di的增减

DF=0,每次操作后si递增,di递减

DF=1,每次操作后si,di递减

adc的指令

带进位加法指令

在进行加法运算的同时还会加上上次产生的进位

例如:

add al,bl
adc ah,bh

先计算低位的和

再利adc指令用计算高位加上的和上一次计算产生的进位

运用此方式可以计算任意位数的加法

sbb指令

带借位的减法指令

adc指令的原理类似,这个指令在使用的时候会自动减去上次计算产生的借位

cmp指令

cmp指令的功能相当于减法指令,但是这条指令不会保存计算结果,只会影响标志位寄存器的值

对于无符号数 :

cmp ax,bx

ZF=1(ax)=(bx)

ZF=0:(ax)!=(bx)

CF=1:(ax)<(bx)

CF:(ax)>=(bx)

CF=0&&ZF=0(ax)>(bx)

CF=1或ZF=1(ax)<=(bx)

对于有符号数来说:

cmp ah,bh

是否相等:

​ 观察ZF寄存器

大小关系:

​ 要要考虑是否溢出,需要同时观察OFSF:

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

]

movsb指令:

功能:以字节为单位传送,将ds:si指向的内存单元的字节送入es:di中,然后自动将si和di+1

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

(2)DF=0:(si) = (si)+1 (di)=(di)+1

DF=1:(si)=(si)-1 (di)=(di)-1

一次性传送一个字使用movsw

movsb和movsw只是字符传送的一个步骤

通常和rep一起使用,也就是rep movsb

rep作用是根据cx的值执行后面的串传送指令

设置DF

cld:设置DF为0

std:设置DS为1

复制操作步骤:

  • 设置ds
  • 设置es
  • 初始化si
  • 初始化di
  • 设置cx,cx用于指定串长
  • 使用cld/std,设置DF,用于指定复制的方向,
  • 使用``rep movsb执行复制`

PUSHF和POPF

将标志位寄存器的值压入栈中

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值