0

我的问题与以汇编 8086 语言打印数组有关。我使用“emu8086”程序。

以下部分对我来说似乎很好(我是初学者),但我得到的结果是:*P000,而不是:12345。

  Main:

A DB 1,2,3,4,5 //my array

SUB SI, SI    //SI stands for counter and index here
LEA BX, A  

loop3:
MOV DX, [BX + SI] 

ADD DX, 30h //converting digit into character
MOV Ah, 2h
int 21h    //displaying the character in console window

INC SI
CMP SI, 5
JNE loop3             

end Main 

你能解释一下我的功能有什么问题吗?先感谢您 !

4

3 回答 3

1

在问题中,该程序是不完整的。缺少两条重要的线:

    MOV AX, @DATA
    MOV DS, AX

在这里我找到了这些的目的。


下面列出了让我改变程序的事情。

  1. 我找到了一个关于这个主题的很好的汇编程序,在此基础上,我可以逐步分析每一行代码,并理解其中的含义。我认为这个程序解释了一切。

我发现了一些事情:


所以我的程序现在看起来是这样的:

    .MODEL SMALL
    .STACK 100H

    .DATA
    A DW 1, 2, 3, 4 ; it's my array

    .CODE   

    MAIN PROC

        MOV AX, @DATA
        MOV DS, AX


        LEA SI, A   ;set SI as offset address of A (of my array)
        MOV BX, 4   ;store the number of digits in BX register
        MOV CX, BX  ;CX is used as a loop counter

        LOOP1:

            MOV DX, [SI] ; Line 1
            ADD DX, 30h  ;convert digit to char and store in DX

            ;Print character stored in DX 
            MOV AH, 2h
            INT 21h

            ;Store in DX the ASCII code for 'space' character 
            MOV DX, 20h
            ;Print ' ' = space 
            INT 21h 


            ADD SI, 2 ;SI = SI + 2

        LOOP LOOP1 ; jump to label 'LOOP1' while CX != 0

    MAIN ENDP
于 2016-03-01T08:52:56.333 回答
0
.MODEL SMALL
.DATA

    ARRAY DW 1,2,3,4,5
.CODE
.STARTUP

  MOV CX,5      

 MOV SI,OFFSET ARRAY

LOP:
    MOV DX,[SI]  
    ADD DX,30H

    MOV AH,2H
    INT 21H  

    INC SI 
    INC SI

LOOP LOP
.EXIT
END

尝试这个

于 2016-11-10T07:16:04.767 回答
0

您需要验证DS寄存器是否加载了正确的值,否则您的内存读取将来自错误的段。

于 2016-02-29T21:03:35.377 回答