8086汇编点阵屏迷宫自动寻路程序开发问题咨询
迷宫寻路程序问题咨询
任务背景
我正在完成作业,使用包含ASCII LCD显示屏、七段显示屏的Emulation Kit,已在Dot Matrix Display Output上实现迷宫。当前任务为:在该设备上设置一个点,使其在3分钟内自动逃出迷宫;若该点无法在3分钟内逃出,程序需在ASCII LCD Display Output上打印“I couldn’t get out”的提示信息。
给定寻路算法
- 点优先向右移动;
- 遇障碍时向上移动,且向上移动的每一步需检查右侧是否可通行,若可通行则转向右侧;
- 若向上、向右均不可行,则选择向下移动,向下移动的每一步仍需检查右侧是否可通行;
- 最后选择向左移动,向左移动的每一步需按顺序检查向上、向下方向是否可通行。
现有代码
org 100h ;-----Data Section-----; ;#start=Emulation Kit.exe# MOV DX, 2000h CALL MAZE_1 MOV DX, 2005h CALL MAZE_2 MOV DX, 200Ah CALL MAZE_3 MOV DX, 200Fh CALL MAZE_4 MOV DX, 2014h CALL MAZE_5 MOV DX, 2019h CALL MAZE_6 MOV DX, 201Eh CALL MAZE_7 MOV DX, 2023h CALL MAZE_8 MOV DX, 2000h MOV AL , 00101111b; Dot's position MOV Maze1[0],AL OUT DX,AL ;-----Code Section-----; MOV DI,0 MOVERIGHT: TEST Maze1[DI+1],00100000b ; checks next bit is obstacle or not JNZ MOVEUP ; obstacle occurs if AL>0 ADD Maze1[DI+1], 00100000b ; moves next column SUB Maze1[DI],00100000b ; updates previous column INC DI MOV DX,2000h CALL MAZE_1 LOOP MOVERIGHT MOVEUP: TEST Maze1[DI+1],00010000b JNZ MOVELEFT: ADD Maze1[DI],00001000b SUB Maze1[DI], 00010000b MOV DX,2000h CALL MAZE_1 LOOP MOVEUP MOVEDOWN: TEST Maze1[DI-1],01000000b JZ MOVELEFT ADD Maze1[DI],01000000b SUB Maze1[DI],00100000b MOV DX,2000h CALL MAZE_1 LOOP MOVEDOWN MOVELEFT: TEST Maze1[DI-1],00100000b JNZ EXIT CMP DI,0 JE MOVEDOWN: ADD Maze1[DI-1],00100000b SUB Maze1[DI],00100000b DEC DI MOV DX,2000h CALL MAZE_1 LOOP MOVELEFT EXIT: ret Maze1 db 00001111b,01000001b,01011001b,01010001b,01110111b,01110101b,01000001b,01011101b,01001001b,01100110b,01001110b,01000001b,01011101b,01000011b,01110001b, 01000011b,01011101b,01010001b,01000001b,01110111b,01000010b,01011110b,01000001b,01111010b,01000001b, 00100011b,01001101b,01000001b,01001001b,01001011b,01110011b,01000001b,01011101b,01001001b,01001011b,01110010b,01011001b,01000101b,01010001b,00001110b Posy db 01000000b,00100000b,00010000b,00001000b,00000100b,00000010b,00000001b ; Possibilities on y axis ;;;;;;;;;;;;;;;;;;; MAZE_1 PROC MOV CX,5 MOV SI,0 NEXTM1: MOV AL, Maze1[SI] OUT DX,AL INC SI INC DX LOOPNE NEXTM1 RET MAZE_1 ENDP ;;;;;;;;;;;;;;;;;; MAZE_2 PROC MOV CX,5 MOV SI,5 NEXTM2: MOV AL, Maze1[SI] OUT DX,AL INC SI INC DX LOOPNE NEXTM2 RET MAZE_2 ENDP ;;;;;;;;;;;;;;;;;; MAZE_3 PROC MOV CX,5 MOV SI,10 NEXTM3: MOV AL, Maze1[SI] OUT DX,AL INC SI INC DX LOOPNE NEXTM3 RET MAZE_3 ENDP ;;;;;;;;;;;;;;;;;; MAZE_4 PROC MOV CX,5 MOV SI,15 NEXTM4: MOV AL, Maze1[SI] OUT DX,AL INC SI INC DX LOOPNE NEXTM4 RET MAZE_4 ENDP ;;;;;;;;;;;;;;;;;; MAZE_5 PROC MOV CX,5 MOV SI,20 NEXTM5: MOV AL, Maze1[SI] OUT DX,AL INC SI INC DX LOOPNE NEXTM5 RET MAZE_5 ENDP ;;;;;;;;;;;;;;;;;; MAZE_6 PROC MOV CX,5 MOV SI,25 NEXTM6: MOV AL, Maze1[SI] OUT DX,AL INC SI INC DX LOOPNE NEXTM6 RET MAZE_6 ENDP ;;;;;;;;;;;;;;;;;; MAZE_7 PROC MOV CX,5 MOV SI,30 NEXTM7: MOV AL, Maze1[SI] OUT DX,AL INC SI INC DX LOOPNE NEXTM7 RET MAZE_7 ENDP ;;;;;;;;;;;;;;;;;; MAZE_8 PROC MOV CX,5 MOV SI,35 NEXTM8: MOV AL, Maze1[SI] OUT DX,AL INC SI INC DX LOOPNE NEXTM8 RET MAZE_8 ENDP ;;;;;;;;;;;;;;;;;;
问题咨询
- 当前程序仅能在X轴单一行移动,未实现Y轴方向的移动,也未完全遵循给定算法,请问如何实现Y轴移动?
- 代码中已定义Posy数组,但SI、DI寄存器已被占用,如何使用BX寄存器遍历该数组?
- 针对需适配8个不同端口的场景,是否有更简便的实现方式?寻求相关修正与帮助,可提供代码参考。
内容的提问来源于stack exchange,提问作者xBaskerville
相关产品推荐
相关产品推荐

