;多位数的输入输出
DATAS SEGMENT
;此处输入数据段代码
x dw ?
n dw 10
DATAS ENDS
STACKS SEGMENT
;此处输入堆栈段代码
db 100 dup(?)
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
;先把输入的字符串变为十进制数值
mov bx,0 ;存储到bx
L1:
mov ah,1
int 21h ;AL=输入数字的ascii码
cmp al,0dh ;0dh是回车
jz L2 ;输入结束
sub al,30h
mov ah,0
xchg bx,ax
mul n
add bx,ax;
jmp L1
L2:
MOV dl,0dh ;DL为回车
MOV AH,2
INT 21H ;dl=输出字符
mov x,bx ;把输入的结果存到x
mov ax,x
mov bx,10
mov cx,0
mov dx,0
L3:
div bx ;ax/bx,bx为除数,dx=余数 ax=商
push dx
inc cx ;记录位数
cwd ;字转化为双字,al->ax
cmp ax,0 ;被除数不为0继续
jnz L3
L4:
pop dx
add dl,'0'
MOV AH,2
INT 21H
loop L4
MOV AH,4CH
INT 21H
CODES ENDS
END START
2、 从自然数1开始累加,直到累加和大于60000为止,显示累加的自然数的个数和累加和。显示格式为:1+2+…+n=sum
其中n为累加个数,sum为累加和。
stack segment
db 10 dup(?)
stack ends
data segment
n dw ?
sum dw ?
infor1 db "1+2+...+$"
data ends
code segment
assume ds:data,cs:code,ss:stack
start: mov ax,data
mov ds,ax
mov ax,0;存放累加和
mov bx,0;存放次数
loop1: inc bx
add ax,bx
cmp ax,60000;比较是否小于60000
jb loop1
mov n,bx
mov sum,ax
;输出结果
mov dx,offset infor1
mov ah,09h
int 21h
;输出多位数n
mov ax,n
mov cx,0 ;记录位数
mov bx,10;用来取余
mov dx,0
loop2: div bx ;ax/bx,ax=商,dx=余数
push dx ;余数入栈!
inc cx; 位数加1
cwd ;al->ax
cmp ax,0
jnz loop2;ax不为0
loop3: pop dx ;从栈里面输出,出栈到dx(16位!)
add dl,'0'
mov ah,02h
int 21h
loop loop3
;输出=
mov dl,'='
mov ah ,02h
int 21h
;输出多位数sum
mov ax,sum
mov cx,0 ;记录位数
mov bx,10;用来取余
mov dx,0
loop4: div bx ;ax/bx,ax=商,dx=余数
push dx ;余数入栈!
inc cx; 位数加1
cwd ;al->ax
cmp ax,0
jnz loop4;ax不为0
loop5: pop dx ;从栈里面输出,出栈到dx(16位!)
add dl,'0'
mov ah,02h
int 21h
loop loop5
mov ah,4ch
int 21h
code ends
end start
3,计算1+2+…+n=?,其中n通过键盘输入,累加和小于216。要求在屏幕上提供如下信息:
Please input a number(1-361): ;出现此信息后通过键盘输入一个小于362的无符号整数,
;使累加和小于一个16位无符号二进制数所能表示的范围
1+2+…+n=sum ;其中n为用户输入的数,sum为所求的累加和
DATA SEGMENT
INF1 DB "Please input a number (1-361):$"
IBUF DB 7,0,6 DUP(?)
OBUF DB 6 DUP (?)
DATA ENDS
CODE SEGMENT
ASSUME CS: CODE, DS: DATA
START: MOV AX, DATA
MOV DS, AX
MOV CX, AX
mov dx,offset INF1;输出提示信息
mov ah,09h
int 21h
mov dx,offset IBUF;输入一个十进制数
mov ah,0ah;键入并显示字符串
int 21h
mov cl,IBUF+1 ;十进制数的位数送cx
mov ch ,0
mov si,offset IBUF+2;指向输入的第一个字符(最高位)
mov ax,0;开始将十进制数转换为二进制数
again: mov dx,10 ;((0*10+a4)*10+…)*10+a0
mul dx ;ax*dx
and byte ptr[si],0fh
add al,[si]
adc ah,0
inc si
loop again
mov cx,ax
mov ax,0
mov bx,1
loop2: add ax,bx
inc bx
loop loop2
mov bx,offset OBUF+5
MOV BYTE PTR [BX],'$'
MOV CX, 10 ;做(DX):(AX)/10运算
LOOP1: MOV DX, 0 ;被除数高16位清0
DIV CX
ADD DL, 30H ;将DL中的一位十进制数转换为ASCII码
DEC BX
MOV [BX], DL
OR AX, AX
JNZ LOOP1 ;判断商是否为0,不为0继续
mov dl,0ah;换行
mov ah,02h
int 21h
MOV DX, BX ;显示转换得到的十进制数
MOV AH, 09H
INT 21H
MOV AH, 4CH
INT 21H
CODE ends
end START