第11章 标志寄存器

本系列博文参考《汇编语言》 王爽

本章掌握知识点
(1)标志寄存器
(2)与标志寄存器相关的指令:adc、sbb、cmp、转移指令
(3)重点理解掌握,标志寄存器在cmp和je等转移指令配合使用中的作用。(类比高级语言中的if语句)


1 标志寄存器
标志寄存器
1.1 ZF标志
零标志位。它记录相关指令执行后,其结果是否为0.
如果结果为0,则zf=1。
如果结果不为0,那么zf=0。
1.2 PF标志
奇偶标志位。
它记录相关指令执行后,其结的所有bit位中1的个数是否为偶数。
如果1的个数为偶数,pf=1。
如果1的个数为偶数,pf=0。
1.3 SF标志
符号标志位。它记录有关指令执行后,其结果是否为负。
如果结果为负,sf=1。
如果结果非负,sf=0。
1.4 CF标志
进位借位标志位。
一般情况下,在进行无符号运算的时候,它记录了运算结果的最高有效位向更高位的进位值,或从更高位的借位值。
如果进位/借位,则CF=1。它假象有个更高为。
在这里插入图片描述1.5 OF标志
溢出标志位。
在进行有符号数运算的时候,如结果超过了机器所能表示的范围称为溢出。一般情况下,OF记录了有符号数运算的结果是否发生了溢出。
如果发生溢出,OF=1。
如果没有,OF=0。
1.6DF标志
方向标志位。在串处理指令中,控制每次操作后si、di的增减。
Df=0,每次操作后si、di递增;
Df=1,每次操作后si、di递减;
这个介绍,也稍微有点麻烦。详细可以看书上。
不过这是很好得传送方式。可以避免自己写传送函数

mov ax,data
mov ds,ax
mov si,0  ;ds:si  指向data:0000
mov es,ax
mov di,16  ;es:di 指向data:0010
mov cx,16  ;rep循环16次
cld     ;设置df=0,正向传播
rep movsb   

在运算的时候,是无符号数运算,还是有符号数运算,取决与你怎么看。仅看计算过程,它本身就包含两种信息
mov al,98
add al,99
下面是执行之前,和之后又标志寄存器的内容。
在这里插入图片描述
如果将其作为有符号数
我们关注点在SF和OF上。说明是有符号数溢出。而且是正向溢出(为什么是正向溢出??详细见书上。think-think)。
如果将其作为无符号数
我们关注点在CF上。CF=0,说明作为无符号数没有溢出。
至于是那种状态,完全取决与你怎么看。

在指令集合中,有的是影响标志寄存器。比如add、sub、div、inc、or、and等,它们大多是运算指令;有得没有影响:比如mov、push、pop等,它们大多是传送指令。

2 与寄存器相关得指令
2.1 pushf和popf指令
可以将寄存器压栈和从栈中弹出送入寄存器。
2.2 adc 指令
adc ax,bx
功能 (ax) = (ax) +(bx)+CF。可以实现超大数得相加
2.3 sbb指令
sbb ax,bx
功能 (ax) = (ax) -(bx)- CF

3 cmp指令和ja等转移指令
3.1 Cmp是比较指令,cmp的功能相当于减法指令,只是不保存结果。Cmp指令执行后,将对标志寄存器产生影响。其他相关指令通过识别这些被影响的标志寄存器来得知比较结果
Cmp指令格式:cmp 操作对象1,操作对象2

3.2 ja等转移指令
在这里插入图片描述可以看出,转移根据是无符号数得比较结果。
至于有符号数得比较,如何选择参数进行转移,看书上。(最好不要溢出)

4 实验
编写一个子程序,将以0结束的字符串中的小写字母转换成大写字母。

;-------------------------------

;大草
;2019/4/25
;天气:阴

;实验11 编写子程序
;将以0结束的字符串中的小写字母转换成大写字母

;描述如下
;名称:letterc
;功能:将0结束的字符串中的小写字母转换成大写字母
;参数:ds:si指向字符串的首地址
;--------------------------------

assume cs:code

data segment
    db "Wellcome Come To Masm Hei-Hei!",0
data ends


code segment
begin:mov ax,data
    mov ds,ax
    mov si,0
    
    call letterc
    
    mov ax,4c00h
    int 21h

letterc:;mov ch,0
    ;mov cl,ds:[si]
    ;jcxz ok 
    ;mov al,cl 
    
    mov al,ds:[si]  ;学会转移之后,就可以不使用以前的转移方法了。这样写,用用性和寄存器的使用,更好一些
    cmp al,0
    je ok
    cmp al,'a'
    jb next
    cmp al,'z'
    ja next
    and al,11011111B
    mov ds:[si],al
next:inc si 
    jmp letterc
ok:ret

code ends
end begin

参考文章
https://www.cnblogs.com/lanru/archive/2011/10/26/2225185.html
https://blog.csdn.net/dujiahei/article/details/45920673

发布了104 篇原创文章 · 获赞 134 · 访问量 17万+

猜你喜欢

转载自blog.csdn.net/sinat_38816924/article/details/89508932