首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >经SHR指令除以8

经SHR指令除以8
EN

Stack Overflow用户
提问于 2020-12-29 20:28:36
回答 1查看 516关注 0票数 2

编写了完整的汇编程序来读取8位数字,每个数字由一个空格从键盘上分离出来(使用单键输入功能)。将它们从字符转换为数字,计算平均、最低和最高的分数,并在屏幕上显示它们。

提示:从每个字符中减去30h以获得实际数字。在显示之前,将30h添加到每个数字中。对于分区操作,请使用适当的移位指令。

平均值显示的是错误的答案!我哪里做错了?请帮助我理解SRH指令的划分。

代码语言:javascript
复制
Include emu8086.inc
.model small
.stack 100h  
.data

 
.code
 mov bh,0
 mov bl,9  
 mov ah,1
 mov dh,0
 mov cx,0    
 
 input:    
 int 21H   
 putc 20h
 sub al,30h
 inc cx
 add dh,al
 cmp al,bh
 JA _max
 cmp al,bl
 JB _min  
 cmp cx,8
 JB input
 
 
 print:
 mov ah,2 
 printn
 mov dl,bh 
 add dl,30h
 printn "Max: "
 int 21h
   
 printn
 mov dl,bl
 add dl,30h
 printn "Min: "
 int 21h 
 
 AND dh, 0FH
 
 mov Cl,3
 shr dh,cl
 
 or dh,30H
 
 printn
 mov dl,dh
 printn "Avg: "
 int 21h 
 
 exit:
 mov ah,4ch
 int 21h
 
 _max:
 mov bh,al 
 cmp al,bl
 JB _min  
 cmp cx,8
 jae print
 jb input
 
 _min:
 mov bl,al
 cmp cx,10
 jae print
 jb input
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-12-29 22:45:15

除以无符号数的8等于将数字3次移到右边。在8086编程中,我们需要在执行CL指令之前将移位计数放在shr寄存器中。由于您已经将要除以的和放在DH寄存器中,并且希望显示来自DL寄存器的平均值(从除法得到的结果)( DOS.PrintChar函数请求),所以只需2条指令即可完成:

代码语言:javascript
复制
mov cl, 11   ; 11 = 3 (is divide DH by 8) + 8 (is move DH to DL)
shr dx, cl

_min: mov bl,al cmp cx,10

就像_max一样,这个_min应该使用cmp cx, 8

更好的是,您可能不应该重复那么多代码!下面的代码使用相反的条件,并将所有内容很好地放在一起:

代码语言:javascript
复制
.code
  mov bx, 9    ; BH=0 is Max, BL=9 is Min
  xor dx, dx   ; DH=0 is Sum, DL=0 is Count
input:
  mov ah, 01h  ; DOS.GetCharacter
  int 21h  
  putc 20h
  sub al, 30h
  add dh, al   ; Add to Sum DH
  cmp al, bh
  jbe NotMax
  mov bh, al   ; Set new max BH
NotMax:
  cmp al, bl
  jae NotMin
  mov bl, al   ; Set new Min BL
NotMin:
  inc dx       ; Increment Count DL
  cmp dl, 8
  jb input

不要忘了在你的程序中添加一些有意义的评论,这样人们就可以很快地理解你写的东西。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65498348

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档