王爽 汇编语言个人疑问汇总第八篇

第11章

检测点11.1

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

分析
  • ZF:零标志位,如果结果为0ZF=1;反之ZF=0。
  • PF:奇偶标志位,二进制结果有多少个1,偶数个PF=1,奇数个PF=0
  • SF:符号标志位,如果为负,有符号SF=1,如果非负SF=0
答案
指令ZFPFSF解释
sub al,al110结果为0,有0个为1的bit位,非负
mov al,1110传送指令不影响标志位,注意此时al=1H
push ax110push指令不影响标志位 ,把ax压栈
pop bx110pop指令不影响标志位 ,取出栈中数据,注意此时bx=1H
add al,bl000al = 1H+1H = 2H 二进制结果为00000010B,结果不为0,有1个为1的bit位,非负
add al,10010al = 2H + 10(十六进制0AH) = 0CH 二进制结果为00001100B,结果不为0,有2个为1的bit位,非负
mul al010al = 0CH * 0CH = 90H 二进制结果为10010000B,结果不为0,有2个为1的bit位,非负

检测点11.2

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

分析
  • ZF:零标志位,如果结果为0ZF=1;反之ZF=0。
  • PF:奇偶标志位,二进制结果有多少个1,偶数个PF=1,奇数个PF=0
  • SF:符号标志位,如果为负,有符号SF=1,如果非负SF=0
  • CF:进位或者借位标志位
  • OF:进行有符号运算时,超过机器表示的范围称为溢出OF=1。
  • mov传送指令不改变标志位
答案
指令CFOFSFZFPF说明
sub al,al00011自身减自身 al =0
mov al,10H00011mov 指令不改变标志位 al = 10H
add al,90H00101al = 10H + 90H = A0H , 无需借位; 8位范围是-128 ~ 127 未超过;为正,不为零;有2个1偶数个
mov al,80H00101mov指令不改变标志位 al = 80H
add all,80H11011al = 80H + 80H = 100H , 8为寄存器只能存2位十六进制, al = 00H
mov al,0FCH11011mov指令不改变标志位 al = 0FCH
add al,05H10000al = 0FCH + 05H = 101H ,不能存3位十六进制,al = 01H
mov al,7DH10000mov指令不改变标志位 al = 7DH
add al,0BH01101al = 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
    (图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

posted on 2021-11-30 09:07  愤怒的苹果ext  阅读(117)  评论(0编辑  收藏  举报

导航