汇编语言(二十六)之自然数求和

汇编语言(二十六)之自然数求和

输入一个数N,对1到N的所有自然数求和

程序运行:

www.zeeklog.com  - 汇编语言(二十六)之自然数求和

代码:


datas segment

       N_string_max_length      db 0ffh
	   N_string                 db  0, 100h dup(?)
       N                        dw 0 
	   
	   sum                      dd 0 
	   
       input              db 'input N=$'
	   output             db 0dh,0ah,'output sum=$'
	  

datas ends

stacks segment stack

    db  100h dup(?)

stacks ends

codes segment

assume cs:codes,ds:datas,ss:stacks
main   proc  far
start:
       push ds
	   mov ax,0h
	   push ax
       mov ax,datas          ;初始化ds
	   mov ds,ax
       
	   ;输入提示
	   lea dx,input
	   mov ah,9
	   int 21h
	   ;输入N
	   lea dx,N_string_max_length
	   mov ah,10 
	   int 21h
	   ;转换成为数字
	   lea si,N_string
	   call todigit
	   mov N,ax
	   
	   mov ax,0 
	   mov dx,0
       mov cx,N	           ;循环的次数
       mov bx,1 	       ;求和从一开始
       s:
	     add ax,bx        ;求和
		 adc dx,0 
		 inc bx 
		 loop s
       mov word ptr sum,ax         ;保存求和的结果
	   mov word ptr sum+2,dx
	   
	   lea dx,output               ;输出提示
	   mov ah,9
	   int 21h 
	   
	   mov ax,word ptr sum        ;输出求和
	   mov dx,word ptr sum+2
       call print_decimal
       ret
	   
main endp

todigit proc near    uses bx cx dx si di 
      ;si ,ax
        mov cl,[si]      ;设置循环次数
	    xor ch,ch 
	    inc si           ;si指向第一个元素
		mov ax,0         ;初始化ax,dx
		mov dx,0 
		mov di,10        ;除数
	  dig:
	    mov bl,[si]     
		cmp bl,'0'       ;判断是否小于'0'
		jb err           ;若低于'0',则错误字符
		cmp bl,'9'       ;判断是否大于'9'
		ja err           ;若高于'9',则错误字符
		sub bl,30h       ;否则,将数字字符转成数字
		xor bh,bh       
	    mul di           ;乘十
        add ax,bx        ;加上个位
        adc dx,0          
		inc si
        loop dig

       cmp dx,0          ;判断高位是否为0
       jnz err           ;若不为0,错误
       jmp exit           

       err:               ;输出错误
        push ds 
		push cs 
		pop ds 
        lea dx,error_tip			
        mov ah,9
		int 21h
		pop ds
        mov ah,4ch		
		int 21h
	  
	  exit:
       ret 
	   
	   error_tip  db 0dh,0ah,'input error$'
todigit endp

print_decimal proc near    uses ax  bx cx dx 

		mov bx,10 
		mov cx,0      
      dea:      
        div bx 
        push dx 
        inc cx 
		xor dx,dx 
        cmp ax,0 
        jnz dea
       
      dea1:
       	pop dx
        add dl,30h
        mov ah,2
        int 21h
        loop dea1		
		
        ret 
print_decimal endp 
codes ends

end main