本章主要学习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”的展开。