题目:

输入一个起始数字,一个结束数字,计算出中间数所有的相加之和。
如:输入 110

1+2+3+4+5+6+7+8+9+10=?

如:输入 811

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