汇编网首页登录博客注册
youthangel的学习博客
博客首页博客互动【做检测题】论坛求助

我的博客

个人首页 |  我的文章 |  我的相册 |  我的好友 |  最新访客 |  文章收藏 |  论坛提问 |  友情链接 |  给我留言  
图片载入中
学习动态
文章收藏

[2013-03-05 21:36] 左手法则走迷宫

图片载入中
左手逃生法则简述:在一个有出入口,没有回路的迷宫中,一直保持左手贴着墙壁向前走,总能找到迷宫出口。

;#mode=dos
;封装显示任意图形的子程序
;编码:墙体是1,空白是20h
              assume    cs:code,ds:data,ss:stack
       stack  segment
              dw        16 dup(0)
       stack  ends

        data  segment
                DB  0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0F0h,00,00,1Fh,0FFh,0FFh
                DB  0E0h,00,00,3Fh,0F0h,00,00,1Fh,0FFh,0FFh,0E0h,00,00,3Fh,0F1h,0FFh
                DB  0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FEh,3Fh,0F1h,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh
                DB  0FEh,3Fh,0F1h,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FEh,3Fh,0F0h,00,00,03
                DB  0FFh,0FFh,80h,00,00,3Fh,0F0h,00,00,03,0FFh,0FFh,80h,00,00,3Fh
                DB  9Fh,0FFh,0FFh,0F0h,00,00,1Fh,0FFh,0FFh,0FFh,9Fh,0FFh,0FFh,0F0h,00,00
                
                DB  1Fh,0FFh,0FEh,00,9Fh,0FFh,0FFh,0FFh,00,01,0FFh,0FFh,0FCh,00,80h,00
                DB  00,00,00,00,00,00,01,0FFh,80h,00,00,00,00,00,00,00
                DB  01,0FFh,9Fh,0FFh,0FFh,0FFh,0F8h,0Fh,0FFh,0FFh,0FCh,00,9Fh,0FFh,0FFh,0FFh
                DB  0F8h,0Fh,0FFh,0FFh,0FEh,00,9Fh,0FFh,0FFh,0FFh,0F0h,87h,0FFh,0FFh,0FFh,0FFh
                DB  0FFh,0E0h,03,0FFh,0E1h,0C3h,0FFh,0E0h,03,0FFh,0FFh,0E0h,03,0FFh,0C3h,0E1h
                DB  0FFh,0E0h,03,0FFh,0FFh,0E7h,0F3h,0FFh,87h,0F0h,0FFh,0E7h,0F3h,0FFh,0FFh,0E7h
                DB  0F3h,0FFh,0Fh,0F8h,7Fh,0E7h,0F3h,0FFh,0FFh,0E7h,0F3h,0FEh,1Fh,0FCh,3Fh,0E7h
                DB  0F3h,0FFh,80h,07,0F0h,00,3Fh,0FEh,00,07,0F3h,0FFh,80h,07h,0F0h,00
                DB  7Fh,0FFh,00,07,0F0h,01,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0F0h,01
                DB  0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh
                          
              dw        8 dup(0)
        data  ends

        code  segment
      start:
              mov       ax,data
              mov       ds,ax
              mov       bx,0
              mov       ax,stack
              mov       ss,ax
              mov       sp,32
              mov       dx,0
              call      draw;画迷宫
;走迷宫
              mov       ax,0b800h
              mov       ds,ax
              mov       bx,14*160+158           ;入口
              mov       bp,1        ;方向  左上右下:1,2,3,4
              
              mov        dh,80;列
              mov        dl,15;行 从0开始计数
              mov ah,6
              mov al,17;←
              mov [bx],ax
              
              call      walk

              mov       ah,0
              int       16h
              mov       ax,4c00h
              int       21h
;--------------------------------------
;走迷宫
;参数:迷宫路口ds:bx,朝向bp,坐标记录当前的行列位置(dl,dh)
;
;边界:转弯
;
;不是边界:
;        前方有墙:转弯
;
;        前方没墙:
;                左手有墙:直走
;
;                左手没墙:转弯
;--------------------------------------
       walk:
                       reap:
                       mov al,[bx+3]
                       cmp al,2
                       je  retWalk
                cmp bp,1
                je left
                cmp bp,2
                je up
                cmp bp,4
                je down
                cmp bp,3
                je right
                
                back:
                call sleep
                jmp reap                
                
                retWalk:
              ret
              
              left:                           
              mov al,[bx+160]
              cmp al,30
              je jump2
              cmp al,1
              jne noDownWall;左侧没有墙了              
              jump2:                          
              mov ax,[bx-2]            
              cmp al,1 ;有墙             
              je lefeWall 
              
              sub bx,2
              dec dh
              mov ah,6
              mov al,17;←
              mov [bx],ax
              sub dh,2;修改坐标
              jmp back 
              
              noDownWall:;左侧没有墙了              
              mov ah,6
              mov al,31
              mov [bx],ax
              mov bp,4
              jmp back
              
              lefeWall:;前方有墙
              mov bp,2;修改方向
              dec dl;修改坐标
              mov ah,6
              mov al,30;↑              
              mov [bx],ax
              jmp back
                            
              up: 
              
              mov al,[bx-2]
              cmp al,16
              je  jump5
              cmp al,1
              jne noUpLeftWall;左侧没有墙
              
              mov al,[bx-160]
              cmp al,1
              je  upWall
              
              jump5:
              sub bx,160
              dec al
              mov ah,6
              mov al,30
              mov [bx],ax
              jmp back
              
              upWall:
              mov ah,6
              mov al,16
              mov [bx],ax
              mov bp,3
              jmp back
                                         
              noUpLeftWall:
              mov ah,6
              mov al,17
              mov [bx],ax
              mov bp,1
              jmp back
              
              
              down:                           
              mov al,[bx+2]
              cmp al,17
              je  jump3
              cmp al,1
              jne noDownLeftWall
              jump3:
              mov al,[bx+160]
              cmp al,1
              je  downWall
              add bx,160
              inc dl
              mov ah,6
              mov al,31
              mov [bx],ax
              jmp back
              
              noDownLeftWall:
              mov ah,6
              mov al,16
              mov [bx],ax
              mov bp,3;改变方向
              jmp back
              
              downWall:;前方有墙
              mov ah,6
              mov al,17
              mov [bx],ax
              mov bp,1;改变方向              
              jmp back
              
              
              
              right:                           
              
              mov al,[bx+2]
              cmp al,1
              je rightWall
              mov al,[bx-160]
              cmp al,31
              je  jump4
              cmp al,1
              jne noRightLeftWall
              jump4:
              add bx,2
              inc dh
              mov ah,6
              mov al,16
              mov [bx],ax
              jmp back
              
              rightBound:
              mov ah,6
              mov al,31
              mov [bx],ax
              mov sp,4
              jmp back
              
              
              noRightLeftWall:
              mov ah,6
              mov al,30
              mov [bx],ax
              mov bp,2
              jmp back
              
              rightWall:
              mov ah,6
              mov al,31
              mov [bx],ax
              mov bp,4
              jmp back
;-------------------------
;画图
;参数:ds:bx指向图形数据,显示的列行(dl,dh)
;返回:无
;-------------------------
       draw:
              push        ax
              push      ds
              push      bx
              push      dx
              push      si

              mov       si,96       ;保存2进制数据
              mov       cx,25
         s2:
              push      cx
              mov       cx,10
        l10:
              mov       al,[bx]
              call      row         ;计算半行
              call      showstr     ;显现半行
              add       dl,8
              inc       bx
              loop      l10

              pop       cx
              sub       dl,80
              add       dh,1
              loop      s2
              mov       ax,0b800h
              mov       ds,ax
              mov       si,10*160+158
              mov       al,26       ;出口
              mov       ah,2
              mov       [si],ax
              mov        si,9*160+158
              mov         al,219
              mov         ah,2
              mov        [si],ax
              
              mov       al,27       ;入口
              mov       [si+480],ax
              
              mov ax,0b800h
              mov ds,ax
              mov bx,160*10
              mov ax,0401h
              mov [bx],ax
                                                                                                
              pop       si
              pop       dx
              pop       bx
              pop       ds 
              pop        ax
              ret
;-----------------------------------
;算出每个数的二进制表示,放入data中
;参数:数al,存放位置ds:si
;-----------------------------------
        row:
              push      ax
              push      bx
              push      cx
              push      dx
              push      si

              mov       bl,2
              mov       dh,0

              mov       cx,8
      again:
              mov       ah,0
              div       bl          ;商在al中,余数在ah中
              mov       dl,ah
              push      dx          ;余数入栈
              loop      again

              mov       cx,8
   outstack:
              pop       ax
              mov       [si],al
              inc       si
              loop      outstack

              pop       si
              pop       dx
              pop       cx
              pop       bx
              pop       ax
              ret
;--------------------------------
;从ds:si处取出八个数据显示
;参数:ds:si,显示位置dl,dh(列行)
;--------------------------------
    showstr:
              push      ax
              push      bx
              push      cx
              push      dx
              push      es
              push      di
              push      si

              mov       ax,0b800h
              mov       es,ax

              mov       al,dh       ;行
              mov       bl,160
              mul       bl
              add       dl,dl       ;列
              mov       dh,0
              add       ax,dx
              mov       di,ax

              mov       ah,40h
              mov       al,1;墙体编码

              mov       cx,8
   showpiex:
              push      cx
              mov       cl,[si]
              jcxz      zero
              mov       es:[di],ax

       zero:
              inc       si
              add       di,2
              pop       cx
              loop      showpiex

              pop       si
              pop       di
              pop       es
              pop       dx
              pop       cx
              pop       bx
              pop       ax
              ret

;--------------------------------------------
;延时子程序:具体时间于处理机的处理能力有关
;--------------------------------------------
      sleep:
              push      bx
              push      cx
              mov       cx,0fffh
      minus:
              push      cx
              mov       bx,09fffh
              mov       cx,bx
       self:
              loop      self
              pop       cx
              loop      minus
              pop       cx
              pop       bx
              ret

        code  ends
              end       start
评论次数(1)  |  浏览次数(1129)  |  类型(冥思苦想) |  收藏此文  | 

[  cutebe   发表于  2013-11-30 00:00  ]

相当牛,这个苦思冥想也值了。^_^

 
 请输入验证码  (提示:点击验证码输入框,以获取验证码