Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 用SHR指令除以8_Assembly_Dos_X86 16_Emu8086 - Fatal编程技术网

Assembly 用SHR指令除以8

Assembly 用SHR指令除以8,assembly,dos,x86-16,emu8086,Assembly,Dos,X86 16,Emu8086,编写一个完整的汇编程序来读取8位数字,每个数字与键盘之间用一个空格隔开(使用单键输入功能)。将其从字符转换为数字,计算平均分、最低分和最高分,并将其显示在屏幕上 提示:从每个字符中减去30h,得到实际数字。在显示之前,将30h添加到每个数字。对于除法操作,使用适当的轮班指令 Include emu8086.inc .model small .stack 100h .data .code mov bh,0 mov bl,9 mov ah,1 mov dh,0 mov cx,

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

提示:从每个字符中减去
30h
,得到实际数字。在显示之前,将
30h
添加到每个数字。对于除法操作,使用适当的轮班指令

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
平均值显示了错误的答案!我哪里做错了?Plz帮助我理解SRH指令的划分

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

将一个无符号数字除以8等于将数字向右移动3次。在8086编程中,在执行
shr
指令之前,我们需要将移位计数放入
CL
寄存器中。由于您已将求和(要除法)放入
DH
寄存器,并希望显示
DL
寄存器(由DOS.PrintChar函数请求)的平均值(除法结果),因此只需两条指令即可完成此操作:

mov cl, 11   ; 11 = 3 (is divide DH by 8) + 8 (is move DH to DL)
shr dx, cl

与_max一样,此_min应使用
cmp cx,8

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

.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

不要忘记在你的程序中添加一些有意义的注释,这样人们就可以快速理解你所写的内容。

这是
SHR
不是
SRH
,但这在代码中很好。是的,你可以像那样除以8。问题是你应该把总和除以。另外,总和不应该被屏蔽为4位。@zx485:这是我最初的想法,但后来意识到它是有意将8+3=11移位以模拟
mov-dl,dh
/
shr-dl,3
。(在没有桶形移位器的CPU上,这会更快,因此每次计数都需要一个时钟。但对于代码大小来说,这是好的。是的,我知道shr dl,3不使用CL需要186或更高版本。)@PeterCordes:谢谢你的解释。我低估了优化代码的聪明度。对不起