汇编5

标志寄存器

FLAGS

作用

  1. 用来存储相关指令的某些执行结果
  2. 用来为CPU执行相关指令提供行为依据
  3. 用来控制CPU的相关工作方式
    enter description here
    空位为未定义保留位

ZF

  1. flag的第六位是ZF,零标志位
  2. 它记录相关指令执行后,其结果是否为0。
  3. 如果结果为0,那么zf=1;如果结果不为0,那么zf=0。

PF

  1. flag的第2位是PF,奇偶标志位
  2. 记录相关指令执行后,结果的所有bit位中1的个数是否是偶数。
  3. 如果结果bit位中有 偶数个1,则pf=1,奇数个1,pf=0。

SF

  1. flag的第7位是 SF(symbol flag),符号标志位
  2. 它记录相关指令执行后,结果是否为负。
  3. 如果为负,sf=1;非负,则sf=0。

CF

  1. flag的第0位是CF,进位标志位
  2. 一般情况下,在进行无符号数运算的时候,它记录了运算结果的最高有效位向更高位的进位值,或从更高位的借位值。

OF

  1. flag的第11位是OF,溢出标志位
  2. OF记录了有符号数运算结果是否溢出。
  3. 如果溢出,OF=1,没有则OF=0。

adc

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

sub

很明显,之前有了带进位加法adc,这个就是带借位减法。
类sub但带了CF
功能:对象1=对象1-对象2-CF
enter description here

cmp

cmp是比较指令,cmp的功能相当于减法指令,但是不保存结果
功能:对象1-对象2,但不保存结果,不改变对象,只对标志寄存器进行重置
enter description here

test

Test命令将两个操作数进行逻辑与运算,并根据运算结果设置相关的标志位。但是,Test命令的两个操作数不会被改变。

条件转移指令

je(equl)

cmp后等于则转移(zf=1)

jne

cmp后不等于则转移(zf=0)


相对于无符号数

jb(below)

cmp后低于则转移(cf=1)

jnb

cmp后不低于则转移(cf=0)

ja(above)

cmp后高于则转移(cf=0&&zf=0)

jna

cmp不高于则转移(cf=1&&zf=1)


相对于有符号数

jl(less)

cmp后小于则转移

jnl

cmp后不小于则转移

jg(greater)

cmp后大于则转移

jng

cmp后不大于则转移

DF(definition flag)和串传送

df

也是flag之一
df=0 每次操作后si di递增
df=1 每次操作后si di递减
唯一可修改的标志位

cld

df清零

std

df置1

rep

rep movsb
相当于:
s:
movsb
loop s
(循环则需预先设置cx)

movsb

1、((es)*16+(di))=((ds)*16+(si))
2、如果df=0 则:
inc si
inc di
如果df=1 则:
dec si
dec di

movsw

按字操作,di和si增减单位为2字节
mov es:[di],word ptr ds:[si]
如果df=0 则:
add si,2
add di,2
如果df=1 则:
sub si,2
sub di,2

enter description here

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
code segment
start:
mov ax,data
mov ds,ax
mov si,0;指向W
mov es,ax
mov di,16;指向第一个0
mov cx,16
cld
rep movsb

mov ax,4c00h
int 21h
code ends
end start

pushf和popf

pushf的功能是将标志寄存器的值压栈,而popf就是将其出栈,扔入flag。
用于中断保护“现场”
popf可用于修改标志位

debug中显示的标志位

enter description here

---------------THEEND---------------