为游戏创建图表 - Asm

时间:2013-05-11 12:20:40

标签: assembly

我想问一下我试图制作的图表。我不明白为什么它不起作用,我做了很多跟踪表以找到问题,但我找不到任何问题。 该图表适用于称为“潜艇”或“战舰”的游戏。请注意,图表必须使用“Submarine”数组构建。

Data Segment
Horizontal DB ' -----------',10,36
DisplayNum db ' 1 2 3 4 5',10,36
Vertical DB ('|')
Submarine DB 25 Dup ('?')
Data ends

Code segment
Assume CS:Code,DS:Data


Table PROC
MOV SI,0
MOV BL,'1'
MOV CX,5
MOV DX, OFFSET DisplayNum
MOV AH,9H
INT 21H

Table2:MOV DX, OFFSET Horizontal
MOV AH,9H
INT 21H

MOV DL,BL
MOV AH,9
INT 21H
MOV DI,5

Anew:MOV DL,Vertical
MOV AH,9H
INT 21H

MOV DL,Submarine[SI]
MOV AH,9H
INT 21H
DEC DI
INC SI
CMP DI,0
JNZ Anew

MOV DL,Vertical
MOV AH,9H
INT 21H

MOV DL,10
MOV AH,2
INT 21H
MOV DL,13
INT 21H

INC BL
LOOP Table2


MOV DX, OFFSET Horizontal
MOV AH,9H
INT 21H
Table endp


START:
MOV AX,DATA
MOV DS,AX
CALL Table

FINISH:MOV AX,4C00H
INT 21H
CODE ENDS
END START

感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

第一个问题是INT21/AH=9逐字节显示DS:DX,直到达到'$'= 0x24 = 36。

在字符串Horizontal中,DisplayNum前面的字符是10 = 0x0A =换行符。没有CR。你需要0dH,0Ah,'$'或13,10,36。

显示第一条水平线后,您可以将BL中的值(大概为'1'= 31H = 49)分配给DL,以便DS:DX指向Horizontal +49 - 靠近submarine数组末尾的字节。然后你再次执行INT21/AH=9 - 所以你将得到submarine数组的结尾和随机垃圾直到显示的下一个'$'字节。如果要在DL中显示字节,请尝试使用INT21/AH=02

然后,您使用DL重新加载VerticalDX指向的地方,再次将其写为字符串,直到您再次找到“$”。并重复该效果,这次从DL加载submarine+SI。你这样做了5次,再次将DL设置为vertical并输出 字符串 - 随后恰好包含的DH

最后,你发送CR和LF - 但顺序错误(看起来 - 你真的,真的不想知道为什么CRLF - 这是一个非常干燥的故事......)并最终重复整个想法5次,直到CXLOOP减少为0,然后再将水平线减少为0,因为没有RETURN毫无疑问会流向START:并从头开始重复整个钻井平台......

答案 1 :(得分:0)

INT 21H
Table endp

在程序结束前你错过了RET。所以可能发生的是它只是继续直接执行代码(即START之后的代码),从而创建一个无限的“循环”(直到你的堆栈空间用完)。

相关问题