汇编语言(第三版) 第十一章课后习题答案

检测点11.1

写出下面每条指令执行后,ZF、PF、SF、等标志位的值。

sub al,al al=0h ZF=1 PF=1 SF=0

mov al,1 al=1h ZF=1 PF=1 SF=0

push ax ax=1h ZF=1 PF=1 SF=0

pop bx bx=1h ZF=1 PF=1 SF=0

add al,bl al=2h ZF=0 PF=0 SF=0

add al,10 al=12h ZF=0 PF=1 SF=0

mul al ax=144h ZF=0 PF=1 SF=0

检测点涉及的相关内容:

ZF是flag的第6位,零标志位,记录指令执行后结果是否为0,结果为0时,ZF=1

PF是flag的第2位,奇偶标志位,记录指令执行后结果二进制中1的个数是否为偶数,结果为偶数时,PF=1

SF是flag的第7位,符号标志位,记录有符号运算结果是否为负数,结果为负数时,SF=1

add、sub、mul、div 、inc、or、and等运算指令影响标志寄存器

mov、push、pop等传送指令对标志寄存器没影响。

检测点11.2

写出下面每条指令执行后,ZF、PF、SF、CF、OF等标志位的值。

          al                 CF    OF    SF    ZF    PF

sub al,al 0h/0000 0000b 0 0 0 1 1

mov al,10h 10h/0010 0000b 0 0 0 1 1

add al,90h a0h/1010 0000b 0 0 1 0 1

mov al,80h 80h/1000 0000b 0 0 1 0 1

add al,80h 0h/0000 0000b 1 1 0 1 1

mov al,0fch 0fch/1111 1100b 1 1 0 1 1

add al,05h 1h/0000 0001b 1 0 0 0 0

mov al,7dh 7dh/1111 1101b 1 0 0 0 0

add al,0bh 88h/1000 1000b 0 1 1 0 1

检测点涉及的相关内容:

ZF是flag的第6位,零标志位,记录指令执行后结果是否为0,结果为0时,ZF=1

PF是flag的第2位,奇偶标志位,记录指令执行后结果二进制数中1的个数是否为偶数,结果为偶数时,PF=1

SF是flag的第7位,符号标志位,记录有符号运算结果是否为负数,结果为负数时,SF=1

CF是flag的第0位,进位标志位,记录无符号运算结果是否有进/借位,结果有进/借位时,SF=1

OF是flag的第11位,溢出标志位,记录有符号运算结果是否溢出,结果溢出时,OF=1

add、sub、mul、div 、inc、or、and等运算指令影响flag

mov、push、pop等传送指令对flag没影响

检测点11.3

(1)补全下面的程序,统计F000:0处32个字节中,大小在[32,128]的数据个数。

 mov ax,0f000h

 mov ds,ax

 mov bx,0      ;ds:bx指向第一个字节

 mov dx,0      ;初始化累加器

 mov cx,32

s: mov al,[bx]

 cmp al,32     ;和32进行比较

 jb s0         ;如果低于al转到s0,继续循环

 cmp al,128    ;和128进行比较

 ja s0         ;如果高于al转到s0,继续循环

 inc dx

s0: inc bx

 loop s

[32,128]是闭区间,包括两端点的值

(32,128)是开区间,不包括两端点的值
检测点11.3

(2)补全下面的程序,统计F000:0处32个字节中,大小在(32,128)的数据个数。

 mov ax,0f000h

 mov ds,ax

 mov bx,0      ;ds:bx指向第一个字节

 mov dx,0      ;初始化累加器

 mov cx,32

s: mov al,[bx]

 cmp al,32      ;和32进行比较

 jna s0        ;如果不高于al转到s0,继续循环

 cmp al,128    ;和128进行比较

 jnb s0        ;如果不低于al转到s0,继续循环

 inc dx

s0: inc bx

 loop s

[32,128]是闭区间,包括两端点的值

(32,128)是开区间,不包括两端点的值

检测点11.4

下面指令执行后,(ax)= 45h

mov ax,0

push ax

popf

mov ax,0fff0h

add ax,0010h

pushf

pop ax

and al,11000101B

and ah,00001000B

推算过程:

popf后,标志寄存器中,本章节介绍的那些标志位都为0(但是此时标志寄存器并不是所有位置都为0,这个不用关心,没学过的位置用先代替),向下进行,那么pushf将计算后的当时状态的标志寄存器入栈,然后pop给ax,这是ax是寄存器的值(这个值中包含了我们的号),接下来就是对那些没有学过的标志位的屏蔽操作,这就是最后两条指令的意义所在,将不确定的位置都归0,那么只剩下我们能够确定的位置了,所以,结果就可以推理出来了。

mov ax,0

push ax

popf

mov ax,0fff0h

add ax,0010h

pushf

pop ax 0 0 0 0 of df if tf sf zf 0 af 0 pf 0 cf

                 0  0  0  0  0  0  *  *  0  1  0  *  0  1  0  1

                 ax=flag=000000** 010*0101b

and al,11000101B al=01000101b=45h

and ah,00001000B ah=00000000b=0h

猜你喜欢

转载自blog.csdn.net/PoorGuy_tn/article/details/80621731