编写了完整的汇编程序来读取8位数字,每个数字由一个空格从键盘上分离出来(使用单键输入功能)。将它们从字符转换为数字,计算平均、最低和最高的分数,并在屏幕上显示它们。
提示:从每个字符中减去30h以获得实际数字。在显示之前,将30h添加到每个数字中。对于分区操作,请使用适当的移位指令。
平均值显示的是错误的答案!我哪里做错了?请帮助我理解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发布于 2020-12-29 22:45:15
除以无符号数的8等于将数字3次移到右边。在8086编程中,我们需要在执行CL指令之前将移位计数放在shr寄存器中。由于您已经将要除以的和放在DH寄存器中,并且希望显示来自DL寄存器的平均值(从除法得到的结果)( DOS.PrintChar函数请求),所以只需2条指令即可完成:
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。
更好的是,您可能不应该重复那么多代码!下面的代码使用相反的条件,并将所有内容很好地放在一起:
.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不要忘了在你的程序中添加一些有意义的评论,这样人们就可以很快地理解你写的东西。
https://stackoverflow.com/questions/65498348
复制相似问题