《汇编语言》学习(十一)标志寄存器

时间:2021-10-16 01:00:43

    本章主要学习X86汇编语言中的各个标志寄存器及其作用。我将在本文用一张思维导图总结它的知识点,并给出所有的习题答案。

一、知识图谱

《汇编语言》学习(十一)标志寄存器

二、习题

检测点11.1

sub al,al    ZF=1,PF=1,SF=0        al=00000000b
mov al,1 ZF=1,PF=1,SF=0 al=00000001b
push ax ZF=1,PF=1,SF=0 al=00000001b
pop bx ZF=1,PF=1,SF=0 bl=00000001b
add al,bl ZF=0,PF=0,SF=0 al=00000010b
add al,10 ZF=0,PF=1,SF=0 al=00001100b
mul al ZF=0,PF=1,SF=1 al=10010000b

这道题需要注意的是:

1)运算类的指令,如add、sub、mul、div、inc、dec、or、and等,它们会影响标志寄存器;而转移类的指令,如mov、push、pop不会影响标准寄存器。

2)SF记录的只是在计算机中存放的相应位数的结果的正负,不代表真正的结果正负。如al,只看第7位的值。


检测点11.2

sub al,al         CF=0,OF=0,SF=0,ZF=1,PF=1        al=00000000b
mov al,10H CF=0,OF=0,SF=0,ZF=1,PF=1 al=00000010b
add al,90H CF=0,OF=0,SF=1,ZF=0,PF=1 al=10100000b
mov al,80H CF=0,OF=0,SF=1,ZF=0,PF=1 al=10000000b
add al,80H CF=1,OF=1,SF=0,ZF=1,PF=1 ax=1 00000000b
mov al,0FCH CF=1,OF=1,SF=0,ZF=1,PF=1 al=11111100b
add al,05H CF=1,OF=1,SF=0,ZF=0,PF=1 ax=1 00000110b
mov al,7DH CF=1,OF=1,SF=0,ZF=0,PF=1 al=01111101b
add al,0BH CF=0,OF=0,SF=1,ZF=0,PF=1 al=10001000b

这道题除了需要同上一道题一样注意那两点外,还要考虑“进位或溢出”。此外,总结一下,不管是SF,还是ZF或PF,都只是存放相应位数的结果的正负。所以,这些标志寄存器,就单个而言,都是代表逻辑结果,不代表真实的结果。


检测点11.3

a.统计F000:0处32个字节中,大小在[32,128]的数据的个数

    mov ax,0f000h
mov ds,ax

mov bx,0
mov dx,0
mov cx,32
s:mov al,[bx]
cmp al,32
jb s0
cmp al,128
ja s0
inc dx
s0:inc bx
loop s


b.统计F000:0处32个字节中,大小在(32,128)的数据的个数

    mov ax,0f000h
mov ds,ax

mov bx,0
mov dx,0
mov cx,32
s:mov al,[bx]
cmp al,32
jna s0
cmp al,128
jnb s0
inc dx
s0:inc bx
loop s

    本题考察的是:cmp、标志寄存器的相关位、条件转移指令三者的配合应用。

注意:inc指令不改变标志寄存器。


检测点11.4

mov ax,0
push ax
popf ;all flags are 0
mov ax,0fff0h
add ax,0010h ;result = 1 00000000 00000000b
pushf
pop ax ;ax=0000 1000 0100 0101b
and al,11000101B ;ax=0000 1000 0100 0101b
add ah,11111000B ;ax=0000 1000 0100 0101b


    ax=845H


实验11

编写一个子程序,将包含任意字符,以0结尾的字符串中的小写字母转换为大写字母。

assume cs:codesg

datasg segment
db "Beginner's All-purpose Symbolic Instruction Code.",0
datasg ends

codesg segment
begin:mov ax,datasg
mov ds,ax
mov si,0
call letterc

mov ax,4c00h
int 21h

letterc:push si
push ax

sub ax,ax
s:mov al,[si]
cmp al,0
je ok
cmp al,61h
jb s0
cmp al,7ah
ja s0
and al,11011111b
mov [si],al
s0:inc si
jmp s

ok:pop ax
pop si
ret
codesg ends

end begin

说明:

1,本题考察多cmp指令、标志寄存器和条件转移指令的综合应用——确定字符的范围。

2,本题关于大小写转换的技术,可以参考第7章。

3,本题的测试字符串是“BASIC”的展开。