第11章
检测点11.1
写出下面每条指令执行后,ZF、PF、SF等标志位的值。
分析
ZF
:零标志位,如果结果为0
,ZF=1
;反之ZF=0。PF
:奇偶标志位,二进制结果有多少个1,偶数个PF=1
,奇数个PF=0
。SF
:符号标志位,如果为负,有符号SF=1
,如果非负SF=0
。
答案
指令 | ZF | PF | SF | 解释 |
---|
sub al,al | 1 | 1 | 0 | 结果为0,有0个为1的bit位,非负 |
mov al,1 | 1 | 1 | 0 | 传送指令不影响标志位,注意此时al=1H |
push ax | 1 | 1 | 0 | push指令不影响标志位 ,把ax压栈 |
pop bx | 1 | 1 | 0 | pop指令不影响标志位 ,取出栈中数据,注意此时bx=1H |
add al,bl | 0 | 0 | 0 | al = 1H+1H = 2H 二进制结果为00000010B,结果不为0,有1个为1的bit位,非负 |
add al,10 | 0 | 1 | 0 | al = 2H + 10(十六进制0AH) = 0CH 二进制结果为00001100B,结果不为0,有2个为1的bit位,非负 |
mul al | 0 | 1 | 0 | al = 0CH * 0CH = 90H 二进制结果为10010000B,结果不为0,有2个为1的bit位,非负 |
检测点11.2
写出下面每条指令执行后,ZF、PF、SF、CF、OF等标志位的值
分析
ZF
:零标志位,如果结果为0
,ZF=1
;反之ZF=0。PF
:奇偶标志位,二进制结果有多少个1,偶数个PF=1
,奇数个PF=0
。SF
:符号标志位,如果为负,有符号SF=1
,如果非负SF=0
。CF
:进位
或者借位标志位
。OF
:进行有符号运算时,超过机器表示的范围
称为溢出OF=1。mov
等传送指令不改变标志位
。
答案
指令 | CF | OF | SF | ZF | PF | 说明 |
---|
sub al,al | 0 | 0 | 0 | 1 | 1 | 自身减自身 al =0 |
mov al,10H | 0 | 0 | 0 | 1 | 1 | mov 指令不改变标志位 al = 10H |
add al,90H | 0 | 0 | 1 | 0 | 1 | al = 10H + 90H = A0H , 无需借位; 8位范围是-128 ~ 127 未超过;为正,不为零;有2个1偶数个 |
mov al,80H | 0 | 0 | 1 | 0 | 1 | mov指令不改变标志位 al = 80H |
add all,80H | 1 | 1 | 0 | 1 | 1 | al = 80H + 80H = 100H , 8为寄存器只能存2位十六进制, al = 00H |
mov al,0FCH | 1 | 1 | 0 | 1 | 1 | mov指令不改变标志位 al = 0FCH |
add al,05H | 1 | 0 | 0 | 0 | 0 | al = 0FCH + 05H = 101H ,不能存3位十六进制,al = 01H |
mov al,7DH | 1 | 0 | 0 | 0 | 0 | mov指令不改变标志位 al = 7DH |
add al,0BH | 0 | 1 | 1 | 0 | 1 | al = 7DH + 0BH = 88H ,没有进位; 十进制是136((如果用补码表示为 255 - 136 + 1 = 120 加上负号最后是 -120)),超过-128 ~ 127 范围 ,所以 OF=1;不为零;偶数个二进制(10001000) |
检测点11.3
1、补全下面的程序,F000:0处的32个字节中,大小在[32,128]的数据的个数。
程序分析
- 预备知识
- [32,128]是闭区间,包括两端点的值
- dx寄存器存储统计的 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 ;小于32则跳转到s0代码段
cmp al,128
ja s0 ; 高于128则跳转到s0代码段
inc dx ;dx寄存器存储统计的 32 - 128的个数
s0:inc bx
loop s
补全下面的程序,F000:0处的32个字节中,大小在(32,128)的数据的个数。
程序分析
- (32,128)是开区间,不包括两端点的值。
- dx寄存器存储统计的 32 - 128范围外的个数
完整代码
mov ax,0f000h
mov dx,ax
mov bx,0
mov dx,0
mov cx,32
s:mov al,[bx]
cmp al,32
jna s0 ; 不高于32则跳转到s0代码段
cmp al,128
jnb s0 ; 不低于128则跳转到s0代码段
inc dx ;dx寄存器存储统计的 32 - 128范围外的个数
s0:inc bx
loop s
检测点11.4
下面的程序执行后:(ax)=?
- 参考图
(图1)
(图2)
assume cs:codesg
codesg segment
start:
mov ax,0
push ax ; ax压栈
popf ;弹出的即push进的AX的值,即将AX的值给了标志寄存器,此时标志寄存器的16位都是零
mov ax,0fff0h
add ax,0010h ;add完后结果是10000H,显然无符号数计算有进位,所以CF=1,无符号数对OF不起作用,所以OF=0
;值未变,SF=0,PF=1,ZF=1,DF=0,
;所以该指令执行完毕后,标志寄存器为:0000 0000 0100 0101,对照图1
pushf ;将标志寄存器的值压栈
pop ax ;将压入栈中的标志寄存器的值弹出给ax,此时二进制数据AX=0000 0000 0100 0101 , 十六进制AX=47H,对照图2
and al,11000101b ; 01000101 & 11000101 ,“与”都为1时就是1 执行完毕后,al=0100 0101 = 45H
and ah,00001000b ;00000000 & 00001000 ,“与”都为1时就是1 执行完毕后,ah=0000 0000 = 00H
;所以AX=0045H
mov ax,4c00h
int 21h
codesg ends
end start