Assembly 用SHR指令除以8
编写一个完整的汇编程序来读取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,
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:谢谢你的解释。我低估了优化代码的聪明度。对不起