;+-----------------------------
;|题目是: 让计算机屏幕输出40个自然数来,
;| 使得其中任意两个数之差均不相等。
;|来源:http://tieba.baidu.com/p/5983277360
;+-----------------------------
;|编程:fasmfan, 汇编器:masm v4.00通过
;|时间:2018.12.20
;+-----------------------------
;|算法:0,1,1+2,1+2+3,1+2+3+4,...
;+-----------------------------
TOTAL equ 40 ;显示数据总个数
PER_ROW_COUNT equ 5 ;每行最多显示数据个数
STACK segment para STACK 'STACK'
db 4 dup('MYSTACKS')
STACK ends
_TEXT segment word public 'CODE'
assume cs:_TEXT,ss:STACK
main proc far
;----配置循环前的参数
mov cx,TOTAL ;循环次数,也是总的要显示数据的个数
xor si,si ;每行增量,初值为0,每循环增1
mov di,PER_ROW_COUNT;di=每行数据显示个数控制器
xor ax,ax ;累加器,也是每个循环要输出的计算结果
@next:
add ax,si ;ax在循环中保留累加和
mov bx,ax ;传给bx去显示
call disp_decimal;显示数据
cmp cx,1 ;/最后一个数据不显示逗号的控制
**e @wind_up;\.
call disp_tab ;输出一个制表符
dec di ;每行数据显示个数控制器di减1
jnz @wind_up;di=0就另起一行,否则跳转
call new_line;换行
mov di,PER_ROW_COUNT;重置每行数据显示个数控制器
@wind_up:
inc si;每行累加的增量加1
loop @next
mov ax,4c00h
int 21h
main endp
;+-----------------------------
;子程序:将16 bit无符号整数转换为十进制数串并输出
;输 入:bx=要转换并输出的数
;输 出:在屏幕上显示bx中的数
;+-----------------------------
disp_decimal proc near
push ax
push bx
push cx
push dx
mov ax,bx ;通过bx传过来的数据转给ax
mov bx,10 ;着bx作为除数
xor cx,cx ;着cx作为压栈记数器
lab9078:
xor dx,dx ;清0,以便配合ax做除法
div bx ;dx:ax / 10
push dx ;余数压栈
inc cx ;记数器记下压栈的次数
cmp ax,0 ;商为0则完成转换
jnz lab9078
mov ah,2
lab9079:
pop dx
add dl,'0'
int 21h
loop lab9079
pop dx
pop cx
pop bx
pop ax
ret
disp_decimal endp
;+-----------------------------
;子程序:输出一个制表符
;+-----------------------------
disp_tab proc near
push ax
push dx
mov ah,2
mov dl,9
int 21h
pop dx
pop ax
ret
disp_tab endp
;+-----------------------------
;子程序:换行
;+-----------------------------
new_line proc near
push ax
push dx
mov ah,2
mov dl,10
int 21h
pop dx
pop ax
ret
new_line endp
_TEXT ends
end main
;|题目是: 让计算机屏幕输出40个自然数来,
;| 使得其中任意两个数之差均不相等。
;|来源:http://tieba.baidu.com/p/5983277360
;+-----------------------------
;|编程:fasmfan, 汇编器:masm v4.00通过
;|时间:2018.12.20
;+-----------------------------
;|算法:0,1,1+2,1+2+3,1+2+3+4,...
;+-----------------------------
TOTAL equ 40 ;显示数据总个数
PER_ROW_COUNT equ 5 ;每行最多显示数据个数
STACK segment para STACK 'STACK'
db 4 dup('MYSTACKS')
STACK ends
_TEXT segment word public 'CODE'
assume cs:_TEXT,ss:STACK
main proc far
;----配置循环前的参数
mov cx,TOTAL ;循环次数,也是总的要显示数据的个数
xor si,si ;每行增量,初值为0,每循环增1
mov di,PER_ROW_COUNT;di=每行数据显示个数控制器
xor ax,ax ;累加器,也是每个循环要输出的计算结果
@next:
add ax,si ;ax在循环中保留累加和
mov bx,ax ;传给bx去显示
call disp_decimal;显示数据
cmp cx,1 ;/最后一个数据不显示逗号的控制
**e @wind_up;\.
call disp_tab ;输出一个制表符
dec di ;每行数据显示个数控制器di减1
jnz @wind_up;di=0就另起一行,否则跳转
call new_line;换行
mov di,PER_ROW_COUNT;重置每行数据显示个数控制器
@wind_up:
inc si;每行累加的增量加1
loop @next
mov ax,4c00h
int 21h
main endp
;+-----------------------------
;子程序:将16 bit无符号整数转换为十进制数串并输出
;输 入:bx=要转换并输出的数
;输 出:在屏幕上显示bx中的数
;+-----------------------------
disp_decimal proc near
push ax
push bx
push cx
push dx
mov ax,bx ;通过bx传过来的数据转给ax
mov bx,10 ;着bx作为除数
xor cx,cx ;着cx作为压栈记数器
lab9078:
xor dx,dx ;清0,以便配合ax做除法
div bx ;dx:ax / 10
push dx ;余数压栈
inc cx ;记数器记下压栈的次数
cmp ax,0 ;商为0则完成转换
jnz lab9078
mov ah,2
lab9079:
pop dx
add dl,'0'
int 21h
loop lab9079
pop dx
pop cx
pop bx
pop ax
ret
disp_decimal endp
;+-----------------------------
;子程序:输出一个制表符
;+-----------------------------
disp_tab proc near
push ax
push dx
mov ah,2
mov dl,9
int 21h
pop dx
pop ax
ret
disp_tab endp
;+-----------------------------
;子程序:换行
;+-----------------------------
new_line proc near
push ax
push dx
mov ah,2
mov dl,10
int 21h
pop dx
pop ax
ret
new_line endp
_TEXT ends
end main