1

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

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

感谢帮助!

4

2 回答 2

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

然后,您重新加载DLVertical无论DX指向何处,再次将其写为字符串,直到再次找到“$”。并重复该表演,这次DLsubmarine+SI. 您这样做了 5 次,再次设置DLvertical输出字符串 -DH然后包含任何内容。

最后,您发送 CR 和 LF - 但顺序错误(看 - 你真的,真的不想知道为什么 CRLF - 这是一个非常枯燥的故事......)最后将整个想法重复 5 次,直到CX减少到0 旁边LOOP,然后是水平线,因为RETURN毫无疑问会流到 START: 并从头开始重复整个繁琐的过程......

于 2013-05-11T14:35:50.207 回答
0
INT 21H
Table endp

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

于 2013-05-11T14:35:40.420 回答