王爽 《汇编语言》 第11章 标志寄存器 学习笔记

目录

一、标志寄存器PSW

1.ZF标志——零标志位

2.PF标志——奇偶标志位

3.SF标志——符号标志位(有符号运算)

4.CF标志——进位标志位(无符号运算)

5.OF标志——溢出标志位(有符号运算)

二、指令

1.adc指令——带进位加法指令

2.sbb指令——带借位减法指令

3.cmp指令——比较指令

(1)无符号数比较

(2)有符号数比较

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

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

5.DF标志和串传送指令

(1)DF标志

(2)串传送指令

6.pushf 和 popf

三、标志寄存器在Debug中的表示


一、标志寄存器PSW

标志寄存器简称flag

其他寄存器是整个起作用的,而flag寄存器是按起作用的。

flag寄存器的结构:
 

1.ZF标志——零标志位

ZF标志为第6位,记录相关指令(如add,sub,mul,div,inc,or,and等)执行后,结果是否为0

若为0,则zf=1;若不为0,则zf=0

2.PF标志——奇偶标志位

PF为第二位,记录相关指令执行后,其结果的所有bit位中1的个数是否认为偶数。

若为偶数,pf=1;若为奇数,pf=0

3.SF标志——符号标志位(有符号运算)

SF为第7位,记录相关指令执行后,其结果是否为负。

若为负,sf=1;若非负,sf=0

4.CF标志——进位标志位(无符号运算)

CF为第0位,记录了运算结果的最高有效位向更高位的进位值,或从更高位的借位值

例:

(1)进位

mov al,98h
add al,al  ;执行后,(al)=30h,CF=1
add al,al  ;执行后,(al)=60h,CF=0

(2)借位

mov al,97h
mov al,98h   ;执行后,(al)=FFH,CF=1
sub al,al    ;执行后,(al)=0,CF=0

5.OF标志——溢出标志位(有符号运算)

OF是第11位,溢出标志位,记录了有符号数运算的结果是否发生了溢出。

如果发生了溢出,OF=1;如果没有发生溢出,OF=0

二、指令

1.adc指令——带进位加法指令

语法:adc 操作对象1,操作对象2

功能:操作对象1=操作对象1+操作对象2+CF

例:adc ax,bx 实现的功能是 (ax)=(ax)+(bx)+CF

用途:对很大的数据进行运算

(1)计算1EF000H+201000H,结果放在ax(高16位中)和bx(低16位中)

mov ax,001EH
mov bx,0F000H
add ax,bx
adc ax 0020H

(2)计算1EF0001000H+2010001EF0H,结果放在ax(最高16位),bx(次高16位),cx(低16位)中

mov ax,001EH
mov bx,0F000H
mov cx,1000H
add cx,1EF0H
adc bx,1000H
adc ax,0020H

2.sbb指令——带借位减法指令

语法:sbb 操作对象1,操作对象2

功能:操作对象1=操作对象1-操作对象2-CF

例:计算003E1000H-00202000H,结果放在ax,bx中

mov bx,1000H
mov ax,003EH
sub bx,2000H
sbb ax,0020H

3.cmp指令——比较指令

语法:cmp 操作对象1,操作对象2

功能:计算操作对象1-操作对象2,但不保存结果,只设置标志寄存器

(1)无符号数比较

执行:cmp 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,则(ax)<=(bx)

(2)有符号数比较

执行: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)

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

条件转移指令,指可以根据某种条件决定是否修改IP,如jcxz

大多数条件转移指令都检测标志寄存器的相关标志位,通常和cmp相配合使用

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

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

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

je          等于则转移            zf=1

jne        不等于则转移        zf=0

jb          低于则转移            cf=1

jnb        不低于则转移        cf=0

ja          高于则转移            cf=0且zf=0

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

例:

(1)编程实现:若(ah)=(bh),则(ah)=(ah)+(ah),否则(ah)=(ah)+(bh)

    cmp ah,bh
    je s
    add ah bh
    jmp short ok
s:  add ah,ah
ok: ...

(2)编程实现:统计data段中数值为8的字节的个数,用ax保存统计结果

        mov ax,data
        mov ds,ax
        mov bx,0
        mov ax,0
        mov cx,8
    s:  cmp byte ptr [bx],8
        jne next
        inc ax
next:   inc bx
        loop s

5.DF标志和串传送指令

(1)DF标志

DF为第10位,方向标志位,在串处理指令中,控制每次操作后si、di的增减

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

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

如何设置df:

cld:将df设置为0

std:将df设置为1

(2)串传送指令

传送一个字节:movsb

功能:

相当于以下操作:

mov es:[di],byte ptr ds:[si]

如果 df=0
inc si
inc di

如果df=1
dec si
dec di

传送一个字:movsw

一般来说,movsb和movsw都和rep配合使用:

rep movsb

相当于:

s:  movsb
    loop s    

例:

用串传送指令,将data段中的第一个字符串复制到它后面的空间中

data segment
    db 'Welcome to masm!'
    db 16 dup (0)
data ends

复制的代码如下:

mov ax,data
mov ds,ax
mov si,0
mov es,ax
mov di,16
mov cx,16
cld
rep movsb

6.pushf 和 popf

pushf是将标志寄存器的值压栈

popf是从栈中弹出数据,送入标志寄存器中

三、标志寄存器在Debug中的表示

标志        值为1的标记        值为0的标记

of                OV                        NV

sf                NG                        PL

zf                ZR                        NZ

pf                PE                        PO

cf                CY                        NC

df                DN                        UP

你可能感兴趣的:(王爽《汇编语言》笔记,学习,笔记,汇编)