实验要求:键入一个十进制数得出1加到次数的结果
即键入10则得出1+2+3+...+10=result的result值
实验思路:分为三部分
(1)第一部分:将键入的值转换为二进制<方法见我上篇发布文章>
(2)第二部分:实现加法运算,通过循环实现
(3)第三部分:将结果(二进制)转换为10进制输出<方法见我上篇发布文章>
实验代码:
.model small
.stack
.data
INF1 db "Please input a number (0-65535):$"
IBUF db 6
db 0
db dup(0)
OBUF db 11 dup(0)
.code
;十进制转二进制从高位开始处理
;二进制转十进制从地位开始处理
START: MOV ax,@data
MOV ds,ax
;输出字符串INF1
MOV dx,offset INF1
MOV ah,9
INT 21h
;向缓冲区IBUF中输入字符串
MOV dx,offset IBUF
MOV ah,10
INT 21h
;指定循环次数
MOV cl,IBUF+1 ;传值
MOV ch,0
;SI指向第一个字符
MOV si,offset IBUF+2 ;传址
MOV ax,0 ;用于记录二进制结果值
AGAIN: MOV dx,10
MUL dx ;将上个结果扩大10倍
;处理输入字符将其转化为二进制并且加入ax中
AND byte ptr [si],0fh
ADD al,[si]
ADC ah,0 ;al进位加入ah
INC si
LOOP AGAIN
;实现从1加到ax中存入的值
MOV cx,ax
MOV ax,0
MOV bx,1
LOOP2: ADD ax,bx
INC bx
LOOP LOOP2
MOV bx,offset OBUF+9 ;将bx作为指针指向缓冲区尾部用于存放地位
MOV byte ptr [bx],'$' ;用于结束十进制字符
MOV cx,10 ;做除10运算
LOOP1:MOV dx,0 ;被除数高位置0
DIV cx ;相当于ax除以10
ADD dl,30h ;dx中存储是余数(地位),形成余数对应的ASCII码
DEC bx ;指针移动存储这位十进制字符数据
MOV [bx],dl
OR ax,ax ;判断ax是否为0,商是否为0就可以知道是否已经处理完数据
JNZ LOOP1
;输出换行和回车
MOV dl,0ah
MOV ah,2
INT 21h
MOV dl,0dh
MOV ah,2
INT 21h
;输出字符串,调用十号功能调用
MOV dx,bx ;dx指向数据最高位
MOV ah,9
INT 21h
MOV ah,4ch
INT 21h
END START
实验结果: