11.1写出下面每条指令执行后,ZF、PF、SF等标志位的值
sub al ,al ZF=______ PF=_______ SF=________
mov al ,1 ZF=______ PF=_______ SF=________
push ax ZF=______ PF=_______ SF=________
pop bx ZF=______ PF=_______ SF=________
add al,bl ZF=______ PF=_______ SF=________
add al,10 ZF=______ PF=_______ SF=________
mul al ZF=______ PF=_______ SF=________
解析:sub al,al 执行后,结果为0,故ZF=1,PF=1,SF=0.
mov al,1.mov,push,pop等传送指令对标志寄存器是没有影响的故ZF=1,PF=1,SF=0.
push ax ZF=1,PF=1,SF=0.
pop bx ZF=1,PF=1,SF=0.
add al ,bl al=2 结果为0010故:ZF=0,PF=0,SF=0
add al ,10 al=12=8+4=1100故:ZF=0,PF=1,SF=0
mul al al*al ,144=128+16=10010000 ,故ZF=0,PF=1,SF=0
检测点11.2
写出下面每条指令执行后,ZF、PF、SF、CF、OF等标志位的值
sub al,al CF=___ OF=____ SF=____ ZF=____ PF=____
mov al,10H CF=___ OF=____ SF=____ ZF=____ PF=____
add al,90H CF=___ OF=____ SF=____ ZF=____ PF=____
mov al,80H CF=___ OF=____ SF=____ ZF=____ PF=____
add al,80H CF=___ OF=____ SF=____ ZF=____ PF=____
mov al,0FCH CF=___ OF=____ SF=____ ZF=____ PF=____
add al,05H CF=___ OF=____ SF=____ ZF=____ PF=____
mov al,7DH CF=___ OF=____ SF=____ ZF=____ PF=____
add al,0BH CF=___ OF=____ SF=____ ZF=____ PF=____
解析:
我先敲了一遍代码,看了下数据,确保我的逻辑正确。
sub al,al CF=0 OF=0 SF=0 ZF=1 PF=1
结果为0000B 没发生进位,没有溢出,显然是个非负数。1的个数为偶数个,为0.所以和debug中是一样的
mov al,10H CF=0 OF=0 SF=0 ZF=1 PF=1
mov指令,不会改变
add al,90H CF=0 OF=0 SF=1 ZF=0 PF=1
al=a0h 没有产生进位和溢出,符号怎么看呢?要判断SF的值,就要转换为有符号数的运算1010000B,可以看作有符号数-92,既然是负数,那么SF=1,由于1的个数是偶数,所以PF=1,明显不是0,故ZF=0
mov al,80H 同上
add al,80H CF=1 OF=1 SF=0 ZF=1 PF=1
结果是100H,显然是溢出了,并且也进位了,此时al=00,故ZF=1,PF=1,SF=0
mov al,0FCH mov不改变,同上
add al,05H CF=1 OF=0 SF=0 ZF=0 PF=0
al=101H,故产生了进位,al=01H,所以CF=1.换成有符号数的运算,FCH的原码=-4,5H的原码=-3,加起来为-7,没有溢出。所以OF=0.al=00000001,最高为是0,所以SF=0
mov al,7DH 不变
add al,0BH CF=0 OF=1 SF=1 ZF=0 PF=1
当无符号数时,al=88H,没有进位,于是CF=0.88H的二进制是10001000,它的最高为是1,所以SF=1。1的个数为偶数个,PF=1,显然不为0,ZF=0。有符号数计算,因为7DH=1111101,显然是个正数,所以他的原码是125,0BH也是一个正数,为11,他们相加为136,超过128,所以OF=1
PS:抱歉,因为我也是才搞懂,所以写的不是很清晰的地方,大家看不懂的地方可以评论,然后我会积极修改的!特别是OF,CF的值,补码原码的转换,简单,但是比较复杂,很容易出错。
检测点11.3
(1)补全下面的程序,统计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。小于32,就重新进行循环,并开始比较下一个字节
cmp al,128
__________ --------->这里应该填ja s0.超过128,就重新进行循环,并开始比较下一个字节
inc dx --------->在32到128之间的,才能被计数
s0:inc bx
loop s
(2)补全下面的程序,统计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
_________ ----------->这里应该是,不高于32,就进入下一个循环。jna s0
cmp al,128
_________ -------------->这里应该是,不低于128,进入下一个循环。jnb s0
inc dx
s0:inc bx
loop s
11.4
下面的程序执行后:(ax)=?
mov ax,0 ------>ax=0
push ax ------>将ax入栈
popf ------>把栈里面的东西给标志寄存器,也就是说flag寄存器标志位置为0
mov ax,0ffff0h
add ax,0010h ----->ax=0000,因为进位了,所以CF=1,作为有符号数,没有溢出,OF=0,ZF=1,SF=0,PF=1
pushf ----->把00000XXX010X0101放入堆栈
pop ax ------>把上面的一坨,弹给ax
and al,11000101B ------>低8位010X0101and11000101 结果为01000101B=45H
and ah,00001000B ------->高8位00000XXXand 00001000 结果为00000000=00H