四十六、从1加到100
题目:
输入一个起始数字,一个结束数字,计算出中间数所有的相加之和。
如:输入1
和10
1+2+3+4+5+6+7+8+9+10=?
如:输入 8
和 11
8+9+10+11=?
;输入一个起始数字,一个结束数字,计算他们之间所有数的和
mov ax, 0x07c0
mov ds, ax
mov ax, 0x0000
mov ss, ax
mov sp, 0xFFFF
mov bp, 0xFFFF
jmp near Code
StartNumber:
dw 1
EndNumber:
dw 100
Divisor:
dw 10
Count: ;最后累加的和,是几位数
dw 0
;----------------------------------开始累加-------------------------------------
Code:
mov ax, word[ds:StartNumber]
mov cx, ax ;cx第一次存的就是起始数据,后面每次加1累加
xor ax, ax ;ax清零
Sum:
add ax, cx
inc cx
;如果cx小于或等于100的话,我们就继续累加
cmp cx, word[ds:EndNumber]
jbe Sum
;----------------------------------分解数据到桟-------------------------------------
;5050 / 10 = 505 余数 0
;505 / 10 = 50 余数 5
;50 / 10 = 5 余数 0
;5 / 10 = 0 余数 5
;被除数在DX:AX中,因为1个寄存器存不下,商在AX中,余数在DX中。
Split:
xor dx, dx ;dx置0,避免旧数据; ax 已经存的就是就是前面累加的和
div word[ds:Divisor]
add dx, 48 ;把dx中的余数转换成ascii编码
push dx ;进桟:这里我们就是把余数这个结果存到桟
inc word[ds:Count]
cmp ax, 0
jne near Split
;初始化屏幕输出
mov cx, word[ds:Count]
mov ax, 0xB800
mov es, ax
xor di, di
;----------------------------------打印结果(先进后出)-------------------------------
Print:
pop ax ;出栈
mov byte[es:di], al ;ax = ah:al,数字不会超过57,al存就够了
inc di
mov byte[es:di], 0x07
inc di
loop Print
End:
jmp near End
times 510 - ($ -$$) db 0x00
dw 0xAA55 ; 相当于 db 0x55,0xAA