矩形同心螺旋圈

本文介绍了一个使用汇编语言编写的简单程序,该程序能够控制一个字符(如笑脸符号)在屏幕上按照特定方向(左右上下)移动并绘制路径。通过不断改变字符的位置和方向,程序实现了在一个限定区域内绘制图案的功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

d_seg  segment
       row_u    db      0  ;行上方的边界->r
       row_d db 25 ;行下方的边界->l
       col_l db 0  ;列左边的边界->u
       col_r    db 80 ;列右边的边界->d
       end_flag db      0  ;1为结束,0为继续
       walkdirect db    'r';当前前进的方向,初始向右
d_seg  ends
;
code   segment
      assume cs:code,ds:d_seg
     start:
     ;**
     ;*
     ;主程序段代码
      main proc far
          push  ds
   xor  ax,ax
   push  ax
   ;
   mov  ax,d_seg
   mov  ds,ax
   ;
   call          clear;   清屏
   ;
   mov  dx,0        ;光标置0行0列
   mov  bh,0
   mov  ah,2
   int           10h
   ;
   call  drawdirect  ;输出图形
   ;按任意键退出
      mAgain:
   mov           ah,7
   int           21h
   cmp           al,'q'
   je  mExit
   jmp           mAgain
      mExit:
          call         clear
   ret
      main endp
      ;-----
      ;**
      ;*
      ;绘图方向的控制
      drawdirect proc near
       d_continue:
          ;跟col_l比较,如果col_l>=dl,则walkdirect='u'
   cmp  walkdirect,'l'  ;是否是左边
   jnz  no_left  ;不是
      coll_next:
          call  char_disp ;输出字符
   dec  dl              ;往左移一列
   cmp  col_l,dl        ;比较是否该转方向
   jl  coll_next       ;不用转,继续输出
   inc  dl              ;往右回退一列
   inc  col_l           ;左边界加一
   inc           col_l
   mov  walkdirect,'u'  ;转方向为向上
   jmp  dcmp         ;退出
          ;
      no_left:
   ;跟col_r比较,如果col_r<=dl,则walkdirect='d'
   cmp  walkdirect,'r'   ;是否是右边
   jnz  no_right  ;不是
      colr_next:
          call  char_disp        ;输出字符
   inc  dl   ;往右移一列
   cmp  col_r,dl         ;比较是否该转方向
   jg  colr_next  ;不用转,继续输出
   dec  dl               ;往左回退一列
   dec  col_r   ;右边界减一
   dec           col_r
   mov  walkdirect,'d'   ;转方向为向下
   jmp  dcmp   ;退出
   ;
      no_right:
          ;跟row_u比较,如果row_u>=dh,则walkdircet='r'
   cmp  walkdirect,'u'   ;是否向上走
   jnz  no_up   ;不是
      rowu_next:
          call  char_disp  ;输出字符
   dec  dh   ;往上移一行
   cmp  row_u,dh  ;比较是否该转方向了
   jl            rowu_next  ;不用转,继续输出
   inc  dh               ;往下回退一行
   inc  row_u   ;上边界加一
   ;inc           row_u
   mov  walkdirect,'r'   ;转方向为向右
   jmp           dcmp   ;退出
   ;
      no_up:
          ;跟row_d比较,如果row_d<=dh,则walkdirect='l'
      rowd_next:
   call  char_disp
   inc  dh               ;往下移一行
   cmp         row_d,dh         ;比较是否该转方向了
   jg  rowd_next  ;不用转,继续输出
   dec  dh          ;往上回退一行
   dec  row_d            ;下边界减一
   ;dec           row_d
   mov         walkdirect,'l'   ;转方向为向左
      dcmp:
          push  ax   ;保存al
   mov  al,row_u
          inc  al               ;上边界试加一
   cmp  al,row_d         ;上边界是否和下边界重合
   pop           ax               ;恢复al
   jge  d_Exit   ;如果将要重合,退出
   push  ax   ;保存al
   mov  al,col_l
   inc  al               ;左边界试加一
   cmp  al,col_r  ;如果将要重合,退出
   pop           ax               ;恢复al
   jge  d_Exit           ;如果将要重合,退出
   jmp  d_continue       ;接着输出
      d_Exit:
          ret
      drawdirect endp
      ;--------
      ;**
      ;*
      char_disp  proc  near
           push  cx               ;保存cx
    ;
    mov          ah,2
           mov          bh,0             ;0页显示
    int          10h              ;置光标位置
    ;
           mov          al,2             ;置入笑脸ASCII码
    mov          bl,07            ;黑底白字符
    mov  cx,1   ;输出字符1次
    mov          ah,9
    int         10h              ;输出笑脸
    pop          cx
    ret
      char_disp  endp
      ;--------
      ;**
      ;*
      clear proc near
           mov          ax,0600h        ;全屏幕空白
    mov         bh,7         ;正常显示
    sub         cx,cx  ;起点(0,0)
           mov  dx,184fh        ;终点(24,79)
    int  10h
    ret
      clear endp
      ;--------
   code ends
         end start
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值