我想问一下我试图制作的图表。我不明白为什么它不起作用,我做了很多跟踪表以找到问题,但我找不到任何问题。 该图表适用于称为“潜艇”或“战舰”的游戏。请注意,图表必须使用“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
感谢您的帮助!
答案 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
重新加载Vertical
,DX
指向的地方,再次将其写为字符串,直到您再次找到“$”。并重复该效果,这次从DL
加载submarine+SI
。你这样做了5次,再次将DL
设置为vertical
并输出 字符串 - 随后恰好包含的DH
。
最后,你发送CR和LF - 但顺序错误(看起来 - 你真的,真的不想知道为什么CRLF - 这是一个非常干燥的故事......)并最终重复整个想法5次,直到CX
将LOOP
减少为0,然后再将水平线减少为0,因为没有RETURN
毫无疑问会流向START:并从头开始重复整个钻井平台......
答案 1 :(得分:0)
INT 21H
Table endp
在程序结束前你错过了RET
。所以可能发生的是它只是继续直接执行代码(即START
之后的代码),从而创建一个无限的“循环”(直到你的堆栈空间用完)。