题目:键盘输入2个两位十进制数(可以是负数),并输入加、减、乘、除四个运算符中的某一个,完成对应运算,并输出相应的结果。若输入的第二个数为0,就退出计算。
详细讲解
前置内容:
汇编语言(Assembly Language)习题:键盘输入一个字符串,试将其中的小写字母转换为大写字母,其它字符保持不变。
汇编语言(Assembly Language)习题:键盘输入任意一个字母,显示其前导字母、字母自身、后续字符共三个字母。
汇编语言习题:编写程序,将一个包含有20个有符号数据的数组ARRAYM分成两个数组:正数数组ARRAYP和负数数组ARRAYN。设数据均为8位。试分别统计负数个数,并计算正数之和。
本文章仅进行了正数的操作,没有设计2个两位十进制数是负数的操作,望各位学习参考。多多指教。
DATAS SEGMENT
DATAS SEGMENT
meg1 db 'please input a number',0ah,0dh,'$' ;字符串输出,不难理解
meg2 db 0ah,0dh,'please input a number',0ah,0dh,'$'
meg3 db 'incorrect input$'
meg4 db 0ah,0dh,'please input a char:$'
meg5 db 0ah,0dh,'$'
number1 dw 50,?,50,50 dup(0) ;分别存两个操作数
number2 dw 50,?,50,50 dup(0)
DATAS ENDS
CODES SEGMENT(1)
从键盘接收十进制数并存入 BX
……
mov bx, 0
newchar: mov ah, 1
int 21h
sub al, 30h
jl exit ; <0退出
cmp al, 9
jg exit ; >9退出
cbw
xchg ax, bx
mov cx, 10
mul cx
xchg ax, bx
add bx, ax
jmp newchar
exit: ……
以存入十进制12为例:
第一次循环:
输入:1
……
mov bx, 0
newchar: mov ah, 1
int 21h ;(bx)=0 (ax)='1'
sub al, 30h ;(bx)=0 (ax)=1
jl exit ; <0退出
cmp al, 9
jg exit ; >9退出
cbw
xchg ax, bx ;(bx)=1 (ax)=0
mov cx, 10
mul cx ;(bx)=1 (ax)=0
xchg ax, bx ;(bx)=0 (ax)=1
add bx, ax ;(bx)=1 (ax)=1
jmp newchar
exit: ……
第二次循环:
输入:2
……
mov bx, 0
newchar: mov ah, 1
int 21h ;(bx)=1 (ax)='2'
sub al, 30h ;(bx)=1 (ax)=2
jl exit ; <0退出 即敲tab键或者空格时退出
cmp al, 9
jg exit ; >9退出
cbw
xchg ax, bx ;(bx)=2 (ax)=1
mov cx, 10
mul cx ;(bx)=2 (ax)=10
xchg ax, bx ;(bx)=10 (ax)=2
add bx, ax ;(bx)=12 (ax)=2
jmp newchar
exit: ……
CODES SEGMENT(2)
以减法为例:
substract:mov bx,number1
call result ;输出第一个操作数
mov dl,'-'
mov ah,2
int 21h
mov bx,number2
call result ;输出第二个操作数
mov dl,'='
mov ah,2
int 21h
mov bx,number1
mov ax,number2
sub bx,ax ;运算结果保存到bx,并输出
call result
mov dx,offset meg4 ;换行回车
mov ah,9
int 21h
完整代码
DATAS SEGMENT
meg1 db 'please input a number',0ah,0dh,'$'
meg2 db 0ah,0dh,'please input a number',0ah,0dh,'$'
meg3 db 'incorrect input$'
meg4 db 0ah,0dh,'$'
number1 dw 50,?,50,50 dup(0) ;分别存两个操作数
number2 dw 50,?,50,50 dup(0)
DATAS ENDS
STACKS SEGMENT
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
mov dx,offset meg1 ;提示输入number1
mov ah,9
int 21h
mov bx, 0
newchar1: mov ah, 1
int 21h
sub al, 30h
jl exit ; <0退出
cmp al, 9
jg exit ; >9退出
cbw
xchg ax, bx
mov cx, 10
mul cx
xchg ax, bx
add bx, ax
jmp newchar1
exit: mov number1,bx
mov dx,offset meg2 ;提示输入number2
mov ah,9
int 21h
mov bx, 0
newchar2: mov ah, 1
int 21h
sub al, 30h
jl exit1 ; <0退出
cmp al, 9
jg exit1 ; >9退出
cbw
xchg ax, bx
mov cx, 10
mul cx
xchg ax, bx
add bx, ax
jmp newchar2
exit1: mov number2,bx
cmp number2,0
jz wrong
mov dx,offset meg4 ;换行回车
mov ah,9
int 21h
substract:mov bx,number1
call result
mov dl,'-'
mov ah,2
int 21h
mov bx,number2
call result
mov dl,'='
mov ah,2
int 21h
mov bx,number1
mov ax,number2
sub bx,ax
call result
mov dx,offset meg4 ;换行回车
mov ah,9
int 21h
plus: mov bx,number1
call result
mov dl,'+'
mov ah,2
int 21h
mov bx,number2
call result
mov dl,'='
mov ah,2
int 21h
mov ax,number1
mov bx,number2
add bx,ax
call result
mov dx,offset meg4 ;换行回车
mov ah,9
int 21h
multiply:mov bx,number1
call result
mov dl,'*'
mov ah,2
int 21h
mov bx,number2
call result
mov dl,'='
mov ah,2
int 21h
mov ax,number1
mov bx,number2
mul bx
mov bx,ax
call result
mov dx,offset meg4 ;换行回车
mov ah,9
int 21h
division: mov bx,number1
call result
mov dl,'/'
mov ah,2
int 21h
mov bx,number2
call result
mov dl,'='
mov ah,2
int 21h
mov ax,number1
mov bx,number2
mov dx,0
div bx
mov bx,ax
call result
jmp end_
result proc near ;将bx中的内容按十进制输出
mov cx,10000d
call div_
mov cx,1000d
call div_
mov cx,100d
call div_
mov cx,10d
call div_
mov cx,1d
call div_
ret
result endp
div_ proc near
mov ax, bx
mov dx, 0
div cx
mov bx, dx
mov dl, al
add dl, 30h
mov ah, 2
int 21h
ret
div_ endp
wrong: mov dx,offset meg3 ;提示输入wrong 直接到end_
mov ah,9
int 21h
end_:
MOV AH,4CH
INT 21H
CODES ENDS
END START