2013-05-11 69 views
1

我想問一下我試圖製作的圖表。我不明白爲什麼它不起作用,爲了找到問題我做了很多跟蹤表,但我找不到任何問題。 該圖表適用於稱爲「潛艇」或「戰列艦」的遊戲。請注意,圖表必須與陣列「潛水艇」一起構建。創建遊戲圖表 - Asm

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 

感謝您的幫助!

+1

爲了使人們更容易回答你的問題(並避免downvotes)你需要更具體。例如,問題是什麼(預期的行爲是什麼,實際的行爲是什麼)? – Michael 2013-05-11 12:23:27

+0

問題是,其中一個循環是無止境的,但是當我看着程序時,我找不到任何。我只能在運行該程序後推斷出這一點。 – Michael 2013-05-11 13:44:59

+0

試圖在調試器中運行它? – 2013-05-11 14:04:58

回答

1

第一個問題是,INT21/AH=9顯示DS:DX逐字節直到達到'$'= 0x24 = 36。

在您的字符串HorizontalDisplayNum之前的字符是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

然後重裝DLVerticalDX指向,又寫了作爲一個字符串,直到找到「$」一次。並重復該性能,這次從submarine+SI加載DL。你這樣做5次,再次設置DLvertical和輸出字符串 - 無論DH然後碰巧包含。

最後,你發送CR和LF - 但是按照錯誤的順序(看 - 你真的,真的不想知道爲什麼CRLF - 這是一個非常乾燥的故事......)並最終重複整個想法5次直到CXLOOP減爲0,然後再次水平線,並且因爲沒有RETURN毫無疑問地流向START:並且從頭開始重複整個rigmarole ...

0
INT 21H 
Table endp 

您在過程結束之前缺少RET。所以可能發生的情況是,它只是繼續執行直接跟在它後面的代碼(即START之後的代碼),從而創建了一個無限的「循環」(直到用完堆棧空間)。