在屏幕上顯現動態菱形圖案。
* * * * *
* * * * * * * *
* * * * * * * * *
* * * * * * * *
* * * * *
<圖一> <圖二> <圖三> <圖四> <圖五>
思路示例:
<1>編寫程序p1:
顯示一個字符
<2>把程序p1做成子程序,調用子程序編寫程序p2:
顯示一個菱形<圖三>
<3>把p2做成一個子程序,調用子程序編寫程序p3:
循環顯示出如圖五種圖形
<4>修改程序p2,實現動態效果:
添加清屏子程序和延時子程序,完成完整程序。
注意點:
要求以統一邏輯實現全部的五個圖形。
第三層的公式見代碼
assume cs:code
code segment
start:
; [ input: al: row ]
; [ ah: column ]
mov cx,10
start_s:
mov di,0
mov si,1
call p3
mov di,4
mov si,-1
call p3
loop start_s
mov ax,4c00h
int 21h
p3: ; -- input: di (index of p2) si (1 or -1)
push ax
push bx
push cx
push dx
push di
; mov cx,5 ; times
; cmp di,3
; jne p3_di_not_4
; p3_di_not_4:
mov cx,4 ; times
; mov di,0
p3_s:
push cx
mov cx,di
mov dl,'*'
call p2
pop cx
; bx ax lay time
mov ax,0
mov bx,1
push cx
p3_layout:
sub ax,1
sbb bx,0
mov cx,ax
or cx,bx
cmp cx,0
jne p3_layout
pop cx
push cx
mov cx,di
mov dl,' '
call p2
pop cx
add di,si
loop p3_s
pop di
pop dx
pop cx
pop bx
pop ax
ret
p2:
push ax
push bx
push cx
; ----- [1] -----------
mov al,10
mov ah,10
mov bl,al
mov bh,ah
call p1
add bl,1
; ----- [2] -----------
push cx
cmp cx,0
je p2_2_cx_is_0
sub cx,1
p2_2_cx_is_0:
mov al,bl
mov ah,bh
sub ah,cl
call p1
mov ah,bh
add ah,cl
call p1
pop cx
add bl,1
; ----- [3] -----------
; left:ah = bh-1-(1+1+(cl-2))*(cl-1)/2
; = bh-1-cl*(cl-1)/2 = bh-segdis
; right: bh+1+cl*(cl-1)/2 = bh+segdis
; segdis = 1+cl*(cl-1)/2
push cx
cmp cx,0
je p2_3_cx_is_0
mov al,cl ; cl
sub cl,1 ; cl-1
mul cl ; cl*(cl-1) -> ax
mov cl,2 ; 2
div cl ; cl*(cl-1)/2 -> al
add al,1 ; cl*(cl-1)/2+1
mov cl,al ; segdis
p2_3_cx_is_0:
mov al,bl
mov ah,bh
sub ah,cl ; bh - segdis
call p1
mov ah,bh
add ah,cl ; bh + segdis
call p1
pop cx
add bl,1
; ----- [4] -----------
push cx
cmp cx,0
je p2_4_cx_is_0
sub cx,1
p2_4_cx_is_0:
mov al,bl
mov ah,bh
sub ah,cl
call p1
mov ah,bh
add ah,cl
call p1
pop cx
add bl,1
; ----- [5] -----------
mov al,bl
mov ah,bh
call p1
pop cx
pop bx
pop ax
ret
p1: ; ----- input: al: row ah: column dl:char
push ax
push bx
push es
mov bx,0b800h
mov es,bx
mov bl,ah
mov bh,al
mov al,160
mul bh
add bl,bl
mov bh,0
add ax,bx
mov bx,ax
mov byte ptr es:[bx],dl
mov byte ptr es:[bx+1],2
pop es
pop bx
pop ax
ret
code ends
end start
; -------*------- 7
; -------*------- 7 7
; -------*------- 7 7
; -------*-------
; -------*-------
; -------*------- 7
; -------*------- 7 7
; ------*-*------ 6 8
; -------*-------
; -------*-------
; 7-1-(1+1+(n-2))*(n-1)/2
; 2
; -------*------- 7
; ------*-*------ 6 8
; -----*---*----- 5 9
; ------*-*------
; -------*-------
; 3
; -------*------- 7
; -----*---*----- 5 9
; ---*-------*--- 3 11
; -----*---*-----
; -------*-------
; -------*------- 7
; ----*-----*---- 4 10
; *-------------* 0 14
; ----*-----*----
; -------*-------