汇编语言(二十六)之自然数求和
输入一个数N,对1到N的所有自然数求和
程序运行:
代码:
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