data segment
x db ? ;4个1字节变量,x,y,z,sum
y db ?
z db ?
sum db ?
data ends
stack segment
db 100H dup(?) ;定义堆栈长度
stack ends
code segment
assume cs:code, ds:data, ss:stack
start:
mov ax,data
mov ds,ax
mov ah,1 ; 21H中断的1号子功能,
int 21h ;读取一个字符到al寄存器中
and ax,000Fh ; 把ASCII表示的数字,转换成实际的值,如 字符'3', ASCII值为33H, and 0FH之后,变成03H,即实际值3
mov x, al ;把读入的数存储到x变量中
NEXT1:
mov ah,1 ; 同前,读取一个字符
int 21h ;
cmp al, '+' ;判断是不是+号,不是的话,
jnz next1 ;则读取下一个字符,直到读取'+'为止
and ax,000FH ;同上面解释,ASCII变成对应的数值
mov y, al ;保存到y变量中
next2:
mov ah,1 ;同Next1解释
int 21h
cmp al,'+'
jnz next2
and ax,000Fh
mov z, al ;保存到z变量中
mov al,X ;计算x+y+z
add al, Y
add al, z
mov sum,al ;计算结果保存到sum变量中
push ax ;ax进栈,为后续处理做准备,注意,al中是计算结果 ah=0(因为前面and ax, 000Fh,将ah置0了)
next4:
mov ah,1 ;同前,读取字符
int 21h
cmp al,'=' ;直到读取到=为止
jnz next4
pop ax ; ax出栈,al是要输出的字符
add al,30h ; 数值转换为ASCII码值表示的字符数字
mov dl,al ; 要输出的字符放在dl中,(21h中断调用要求的)
mov ah,2 ;2号子功能,输出dl中的字符到屏幕上
int 21h ;调用21h中断
mov ah,4ch ;退出到
int 21h ;操作系统调用的中断
code ends
end start
最终计算的是形如:323+1124+214343=这样的算式,
计算的是各加数(被加数)的第1个数字,即:3+1+2=6 (上式)
计算结果放在sum中,最终输出到屏幕上。另外,本程序,如果计算结果>=10,则输出不正确。