2014-01-10 158 views
0

您好,我嘗試運行該例程,但它暫停。 當開始AX = 4B5B時,這段代碼應該將它的ASCII內容中的AL內容轉換並存儲在RESULT變量中。 我剛剛開始組裝,所以蜂類請,如果有人可以提前幫助我thx。8086彙編代碼錯誤

ASSUME CS:Code, DS:Data 
Data SEGMENT 
RESULT DB 3 DUP(?) 
Data ENDS 

Code SEGMENT 
Debut: MOV BX, offset RESULT 
     MOV AH, AL 

QuartH: MOV CL, 4 
     SHR AH, CL 
     AND AH, 0FH 
     CMP AH, 0AH 
     JAE AlphaH 
     ADD AH, '0' 
     JMP FinH 
AlphaH: ADD AH, 'A' 
     SUB AH, 0AH 
FinH: MOV [BX], AH 

QuartL: AND AL, 0FH 
     CMP AL, 0AH 
     JAE AlphaL 
     ADD AL, '0' 
     JMP FinL 
AlphaL: ADD AL, 'A' 
     SUB AL, 0AH 
FinL: MOV Byte ptr[BX+1], AL 

FinCH: MOV Byte ptr[BX+2], '$' 
Code ENDS 
     END Debut 
+0

只是想知道......你的RET在哪裏? – cHao

+0

(作爲參考,這個簡單的代碼不會讓任何即使是半路模擬器都崩潰,假設錯誤在你自己的代碼中,直到你可以放心地說沒有錯誤。) – cHao

+0

我總是假設我的編碼錯誤(相信我),但這個代碼不是我的;-),我只是學習大會,這就是爲什麼我問,如果它可以是一個模擬器的問題。 –

回答

0

首先:確保DS指向您的數據段。這不是在DOS EXE程序中默認的,除非你使用的是微型模型。所以,在你的代碼的開始,補充一點:

MOV AX,data 
MOV DS,AX 

二:這個程序需要RET在最後,如果這意味着從你的程序的其他部分調用。我想這不是你在做什麼,我們看到你的整個計劃。如果是這種情況,那麼你必須以

MOV AX,4C00h 
INT 21h 

結束返回到DOS。

而且......好吧,你建立一個$終止的字符串,所以你想打印它,不是嗎?使用DOS功能09h爲:

MOV DX,offset RESULT 
MOV AH,9 
INT 21h 

你甚至可以跳過你的代碼添加$,如果你把它直接在您的RESULT可變的部分。事情是這樣的:

RESULT db 32,32,13,10,'$' 

這爲您提供了空間,兩個十六進制數字(初始化爲空格字符),加回車和換行,如果你想打印字符串,並終止$