汇编语言:多位数输入输出&循环设计实验

;多位数的输入输出
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

		

你可能感兴趣的:(汇编语言)