8086汇编代码bug

时间:2014-01-10 21:54:16

标签: assembly x86-16

您好我尝试运行该例程但它停止了。 当启动AX = 4B5B时,此代码应该转换其ASCII对应的AL内容并将其存储在RESULT变量中。 我刚刚开始组装,所以我很喜欢,如果有人可以提前帮助我。

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

1 个答案:

答案 0 :(得分:0)

首先:确保DS指向您的数据段。除非您使用的是小型模型,否则它在DOS EXE程序中默认不是。因此,在代码的开头添加:

MOV AX,data
MOV DS,AX

第二:如果要从程序的另一部分调用,则此例程最后需要RET。我想这不是你在做什么,我们正在看你的整个计划。如果是这种情况,那么你必须以

结束
MOV AX,4C00h
INT 21h

返回DOS。

而且......好吧,你构建了一个$ -terminated字符串,所以你要打印它,不是吗?使用DOS函数09h

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

如果您将代码添加到$变量中,您甚至可以跳过代码添加RESULT的部分。像这样:

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

这为您提供了两个十六进制数字(初始化为空格字符)的空间,以及回车符和换行符,以防您要打印此字符串,以及终止$