2014-01-10 140 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,'$' 

这为您提供了空间,两个十六进制数字(初始化为空格字符),加回车和换行,如果你想打印字符串,并终止$