1.要求
在输入窗口中,实现两个十进制数的输入,根据用户的输入不同标号,可以设计选择转移结构,完成如下几种子程序:
子程序1 如上输入的两位十进制数进行相减;
子程序2 如上输入的两位十进制数进行相乘;
子程序3 如上输入的两位十进制数进行相除;
子程序4 如上输入的两位十进制数进行取余;
请根据要求设计程序结构及其思路,请对于各个子程序给出代码,及其正确的运行结果。
2.思路:
由于前几次某个实验中曾经做过输入转十进制(并且可以检测是否输入),这里可以直接复制以前写的子程序代码。思考重点放在计算结果转十进制输出上,通过不断对结果除于10取余数(得到的余数作为下一次的被除数)保存到栈中,计算完之后把栈中的数据弹出放到dx寄存器中并打印。至于选择哪种计算方法,可以使用多分支程序调用不同的子程序,类似与高级语言中的switch。
data segment
X dw ?
Y dw ?
Fun dw ?
Tip1 db 'Please input number_x:$'
Tip2 db 'Please input number_y:$'
Tip3 db 'Error,please retype!$'
Tip4 db 'Please select function:1-->sub,2->multiplication,3->division,4->mold:$'
Tip5 db 'Result:$'
branch dw fs1
dw fs2
dw fs3
dw fs4
data ends
stack segment
stack ends
code segment
assume ds:data,cs:code,ss:stack
main proc far
mov ax,data
mov ds,ax
call crlf
mov ah,9
lea dx,Tip1
int 21h
call crlf
CALL deci
mov [x],bx
call crlf
mov ah,9
lea dx,Tip4
int 21h
call crlf
mov ah,1
int 21h
mov ah,0
mov [Fun],ax
call crlf
call crlf
mov ah,9
lea dx,Tip2
int 21h
call crlf
CALL deci
mov [y],bx
call crlf
mov ax,[Fun]
mov bl,al
sub bl,31h
shl bl,1
mov bh,0
jmp branch[bx]
fs1: call suber
jmp out1
fs2: call multiplication
jmp out1
fs3: call division
jmp out1
fs4:call mold
call output
out1:
call output
mov ah,4ch
int 21h
ret
main endp;
deci proc near;十进制输入
mov bx,0
input3:
mov ah,1
int 21h
cmp al,0dh
je exit3;若是换行键表明输入完成
sub al,30h
jl cc;若不是数则报错并退出子程序
cmp al,9
jg cc;若不是数则报错并退出子程序
cbw
xchg ax,bx
mov cx,10
mul cx
xchg ax,bx
add bx,ax
jmp input3
cc:call crlf
mov ah,9
lea dx,Tip3
int 21h
call crlf
mov bx,0
jmp input3
exit3:ret
deci endp;
output proc near;十进制输出
mov ah,09
lea dx,Tip5
int 21h
mov ax,bx
mov bl,10
mov si,0
www: div bl
mov cl,ah
add cl,30h
mov ch,0
push cx
mov ah,0
inc si
cmp al,0
ja www
jmp print
print:
mov cx,si
t: pop dx
mov ah,2
int 21h
loop t
ret
output endp;
suber proc near
mov bx,[x]
mov ax,[y]
sub bx,ax
ret
suber endp
multiplication proc near
mov bx,[x]
mov ax,[y]
mov ah,0
mov bh,0
mul bl
mov bx,ax
ret
multiplication endp
division proc near
mov bx,[y]
mov ax,[x]
div bl
mov bl,al
mov bh,0
ret
division endp
mold proc near
mov bx,[y]
mov ax,[x]
div bl
mov bl,ah
mov bh,0
ret
mold endp
crlf proc near
mov dl,0ah
mov ah,02
int 21h
ret
crlf endp
code ends
end main
3.运行结果截图
纠错能力测试(输入错误时会报错并提醒重新输入)
减法测试:
乘法测试:
除法测试:
取余测试:
4.不足之处
1)乘法运算的时候如果结果太大导致溢出,打印结果不正确。
2)除法运算的时候若不是整除结果可能不正确。