8086汇编 在屏幕上显现动态菱形图案

在屏幕上显现动态菱形图案。

*        *            *               *                    *
*        *           * *            *   *	        	*     *
*       * *         *   *         *       *         *             *   
*        *           * *            *   *               *     *
*        *            *               *                    *  
 <图一>    <图二>       <图三>         <图四>               <图五>

思路示例:
<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
; ----*-----*----
; -------*-------



  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值