汇编语言第三版(王爽)第十一章检测点答案及解析

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

 

 

 

 

 

 

你可能感兴趣的:(汇编语言)