不知道你的标题是从哪里得到的,是不是从数据库得到,可以给你两个思路:
1:这是一种特例,假设两行为
x y
1 7
2 8
. .
x y=x+6(关系)
此关系可以让你通过id去索引,但是这个很有局限性,因为不肯能id之间存在这么巧的关系
2:从数据库读出,前提数据库返回结果集已经排序为 1,2,3,。。。
那么可以这样做
1 movenext 6 次 到 7
moveprevious 6 次再 movenext 一次得到 2 再movenext 6 次到8
依次类推,因为如果你是用 table 来处理,那么必须是横向生成的,不能像我们画图一样可以先把第一列画,然后在再后面加一列。
; 本程序通过编译,运行正确
Code Segment
Assume CS:Code,DS:Code
; -----------------------------------------
; 功能:置光标位置
; 入口:Cursor_Row=行坐标; Cursor_Col: 列坐标)
SetCursor Proc Near
PUSH CX
PUSH BX
PUSH AX
XOR BX,BX
MOV AH,2
INT 10H
POP AX
POP BX
POP CX
RET
SetCursor EndP
; -----------------------------------------
List_Colums Proc Near ;显示一列新闻标题
mov dx,word ptr Cursor_DX
call SetCursor ;设置光标位置
lodsw ;读标题地址
mov dx,ax
mov ah,9
int 21h
inc Cursor_DX[1] ;行号增1
loop List_Colums
ret
List_Colums EndP
; -----------------------------------------
Title_01 db ' 1. AAAAAAAAAAA$' ;新闻标题
Title_02 db ' 2. BBBBBBBBBBB$'
Title_03 db ' 3. CCCCCCCCCCC$'
Title_04 db ' 4. DDDDDDDDDDD$'
Title_05 db ' 5. EEEEEEEEEEE$'
Title_06 db ' 6. FFFFFFFFFFF$'
Title_07 db ' 7. GGGGGGGGGGG$'
Title_08 db ' 8. HHHHHHHHHHH$'
Title_09 db ' 9. IIIIIIIIIII$'
Title_10 db '10. JJJJJJJJJJJ$'
Title_11 db '11. KKKKKKKKKKK$'
Title_12 db '12. LLLLLLLLLLL$'
Title_13 db '13. MMMMMMMMMMM$'
Title_14 db '14. NNNNNNNNNNN$'
Title_15 db '15. OOOOOOOOOOO$'
Title_16 db '16. PPPPPPPPPPP$'
Title_17 db '17. QQQQQQQQQQQ$'
Title_18 db '18. RRRRRRRRRRR$'
Title_19 db '19. SSSSSSSSSSS$'
Title_20 db '20. TTTTTTTTTTT$'
Title_21 db '21. UUUUUUUUUUU$'
Title_22 db '22. VVVVVVVVVVV$'
Title_23 db '23. WWWWWWWWWWW$'
Title_24 db '24. XXXXXXXXXXX$'
Title_25 db '25. YYYYYYYYYYY$'
Title_26 db '26. ZZZZZZZZZZZ$'
Index dw Title_01,Title_02,Title_03,Title_04,Title_05,Title_06,Title_07,Title_08,Title_09,Title_10
dw Title_11,Title_12,Title_13,Title_14,Title_15,Title_16,Title_17,Title_18,Title_19,Title_20
dw Title_21,Title_22,Title_23,Title_24,Title_25,Title_26 ;新闻标题原排序表
Elements equ ($-Index)/Type Index ;新闻题目数
Lines equ 10 ;每列行数
Colums equ 3 ;每行列数
Cursor_DX db 0,0 ;初始化光标位置
Start: push cs
pop ds ;使数据段与代码段同段
; 显示新闻标题,每列最多10个标题,最多3列。假设每个标题最多24个字符,列距2个字符。
cld
lea si,Index ;新闻标题现在排序表地址
mov ax,Elements ;新闻题目数
mov cx,Lines ;每列行数
div cl
mov bx,ax ;保存行数和列数
mov cl,bl
xor ch,ch
jcxz Last_Colum ;若行数=0,只显示一列的零头(少于10个标题)
cmp cx,Colums ;列数>3?
jbe List_Lines ;不大于,显示指定列数
mov cx,Colums ;若列数超过3列,最多显示3列
List_Lines: push cx
mov cx,Lines ;每列行数
call List_Colums ;显示一列
add Cursor_DX,26 ;列号加26
mov Cursor_DX[1],0 ;行号置0
pop cx
loop List_Lines
Last_Colum: mov cl,bh ;取最后一列行数
xor ch,ch
jcxz Exit_Proc
cmp bl,Colums ;列数>3?
ja Exit_Proc ;大于,已经显示,结束程序
call List_Colums ;显示一列
mov dx,0a00h ;设置光标位置
call SetCursor
Exit_Proc: mov ah,4ch ;结束程序
int 21h
Code ENDS
END Start ;编译到此结束
不知道你的标题是从哪里得到的,是不是从数据库得到,可以给你两个思路:
1:这是一种特例,假设两行为
x y
1 7
2 8
. .
x y=x+6(关系)
此关系可以让你通过id去索引,但是这个很有局限性,因为不肯能id之间存在这么巧的关系
2:从数据库读出,前提数据库返回结果集已经排序为 1,2,3,。。。
那么可以这样做
1 movenext 6 次 到 7
moveprevious 6 次再 movenext 一次得到 2 再movenext 6 次到8
依次类推,因为如果你是用 table 来处理,那么必须是横向生成的,不能像我们画图一样可以先把第一列画,然后在再后面加一列。
; 本程序通过编译,运行正确
Code Segment
Assume CS:Code,DS:Code
; -----------------------------------------
; 功能:置光标位置
; 入口:Cursor_Row=行坐标; Cursor_Col: 列坐标)
SetCursor Proc Near
PUSH CX
PUSH BX
PUSH AX
XOR BX,BX
MOV AH,2
INT 10H
POP AX
POP BX
POP CX
RET
SetCursor EndP
; -----------------------------------------
List_Colums Proc Near ;显示一列新闻标题
mov dx,word ptr Cursor_DX
call SetCursor ;设置光标位置
lodsw ;读标题地址
mov dx,ax
mov ah,9
int 21h
inc Cursor_DX[1] ;行号增1
loop List_Colums
ret
List_Colums EndP
; -----------------------------------------
Title_01 db ' 1. AAAAAAAAAAA$' ;新闻标题
Title_02 db ' 2. BBBBBBBBBBB$'
Title_03 db ' 3. CCCCCCCCCCC$'
Title_04 db ' 4. DDDDDDDDDDD$'
Title_05 db ' 5. EEEEEEEEEEE$'
Title_06 db ' 6. FFFFFFFFFFF$'
Title_07 db ' 7. GGGGGGGGGGG$'
Title_08 db ' 8. HHHHHHHHHHH$'
Title_09 db ' 9. IIIIIIIIIII$'
Title_10 db '10. JJJJJJJJJJJ$'
Title_11 db '11. KKKKKKKKKKK$'
Title_12 db '12. LLLLLLLLLLL$'
Title_13 db '13. MMMMMMMMMMM$'
Title_14 db '14. NNNNNNNNNNN$'
Title_15 db '15. OOOOOOOOOOO$'
Title_16 db '16. PPPPPPPPPPP$'
Title_17 db '17. QQQQQQQQQQQ$'
Title_18 db '18. RRRRRRRRRRR$'
Title_19 db '19. SSSSSSSSSSS$'
Title_20 db '20. TTTTTTTTTTT$'
Title_21 db '21. UUUUUUUUUUU$'
Title_22 db '22. VVVVVVVVVVV$'
Title_23 db '23. WWWWWWWWWWW$'
Title_24 db '24. XXXXXXXXXXX$'
Title_25 db '25. YYYYYYYYYYY$'
Title_26 db '26. ZZZZZZZZZZZ$'
Index dw Title_01,Title_02,Title_03,Title_04,Title_05,Title_06,Title_07,Title_08,Title_09,Title_10
dw Title_11,Title_12,Title_13,Title_14,Title_15,Title_16,Title_17,Title_18,Title_19,Title_20
dw Title_21,Title_22,Title_23,Title_24,Title_25,Title_26 ;新闻标题原排序表
Elements equ ($-Index)/Type Index ;新闻题目数
Lines equ 10 ;每列行数
Colums equ 3 ;每行列数
Cursor_DX db 0,0 ;初始化光标位置
Start: push cs
pop ds ;使数据段与代码段同段
; 显示新闻标题,每列最多10个标题,最多3列。假设每个标题最多24个字符,列距2个字符。
cld
lea si,Index ;新闻标题现在排序表地址
mov ax,Elements ;新闻题目数
mov cx,Lines ;每列行数
div cl
mov bx,ax ;保存行数和列数
mov cl,bl
xor ch,ch
jcxz Last_Colum ;若行数=0,只显示一列的零头(少于10个标题)
cmp cx,Colums ;列数>3?
jbe List_Lines ;不大于,显示指定列数
mov cx,Colums ;若列数超过3列,最多显示3列
List_Lines: push cx
mov cx,Lines ;每列行数
call List_Colums ;显示一列
add Cursor_DX,26 ;列号加26
mov Cursor_DX[1],0 ;行号置0
pop cx
loop List_Lines
Last_Colum: mov cl,bh ;取最后一列行数
xor ch,ch
jcxz Exit_Proc
cmp bl,Colums ;列数>3?
ja Exit_Proc ;大于,已经显示,结束程序
call List_Colums ;显示一列
mov dx,0a00h ;设置光标位置
call SetCursor
Exit_Proc: mov ah,4ch ;结束程序
int 21h
Code ENDS
END Start ;编译到此结束