- [cutebe] 相当牛,这个苦思冥想也值了。^_^ 11/30 00:00
- [parse] 如果忽略消息循环,那么操作系统加载的程序很快就执行完了,就像DOS程序一闪而过,所以CPU会空闲下来 06/30 09:04
- [游客] 楼主好厉害,挺一下! 01/19 08:43
- [游客] 很不错。 01/04 18:36
- [chinatree] 潜力贴留名,沙发。 11/08 12:58
- [youthangel] 恩,这次对了 10/30 18:56
- [fpamc] mov bx,18 在这条指令的上边是不是要加一条sub dx,dx? 10/30 10:03
- [fpamc] 对的 10/27 11:19
- [fpamc] 对的 10/27 09:00
- [fpamc] 哦,对不起,看错了。实验13也有一个7ch中断 10/27 08:52
- [游客] 现在急需一个汇编大作业。。。。。。可以么。。。。。如果今天之内看见留言 就加 1765496715 12/28 16:52
- [youthangel] 这算是对我学习的鼓励吗?谢谢!咱们这样交流就可以了 10/11 15:48
- [fpamc] 多日观察,你的学习积极性挺高的。可以来我们群了。群号:75916434 10/11 10:58
[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
;#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) |
类型(冥思苦想) |
收藏此文 |