String 8086 ASM-输出字符串到屏幕

String 8086 ASM-输出字符串到屏幕,string,assembly,output,x86-16,String,Assembly,Output,X86 16,我试图从键盘获取输入,然后将其输出到屏幕 我的代码 BITS 16 ;Set code generation to 16 bit mode ORG 0x0100; SECTION .text; MAIN: mov SI, MyArray call GetString call Putln call PutString jmp Exit; GetString: call Getch ; get t

我试图从键盘获取输入,然后将其输出到屏幕

我的代码

    BITS 16                 ;Set code generation to 16 bit mode
ORG 0x0100;
SECTION .text;



MAIN:
    mov SI, MyArray

    call GetString
    call Putln
    call PutString

    jmp Exit;

GetString:

    call Getch ; get the character stored in DL

    cmp dl, 0dh ; if Enter is pressed Exit the subroutine
    je Return

;    call Putch ;*commeted out to see if putsring works* ; output the character on screen

    stosb ; store the character in al to [di] and increment di by 1
    jmp GetString ; loop back to GetString  

Return:
    mov al, 0 ; terminate array with a 0
    stosb
    ret

PutString:
    cld
    lodsb ; load the character in [si] to al and increment si by 1

    cmp al, 0
    jz Return2

    mov dl, al
    call Putch

    jmp PutString ; loop back to PutString

Return2:
    Ret


Getch:
    push di

    mov ah, 7 ; keyboard input subprogram without echo
    int 21h ; read the character into al
    mov dl, al
    pop di

    RET ; return

Putch:
    push di

    mov ah, 2h ; display subprogram
    INT 21H ;read the characters from al
    pop di

    RET ; Return

Putln: ;new line
    mov ah, 2
    mov dl, 0DH ;Carriage return
    int 21h
    mov dl, 0AH  ;Line feed
    int 21H
    RET ; return


Exit:
    MOV AH,04Ch ; Select exit function
    MOV AL,00   ; Return 0
    INT 21h     ; Call the interrupt to exit


SECTION .bss
MyArray resb 256
然而,我不能让PutString正常工作。无论在键盘上键入什么,它都打印相同的ASCII字符


任何帮助都将不胜感激

我没有看到你在任何地方初始化
DI
。它可能应该像
SI
一样设置为指向
MyArray
,否则您的
STOSB
将只写入某个随机位置。

我看不到您在任何地方初始化
DI
。它可能应该像
SI
一样设置为指向
MyArray
,否则您的
STOSB
将只写入某个随机位置。

这些是您需要进行的唯一更改:

...
;;;;    mov SI, MyArray
    mov DI, MyArray ;;;; stosb uses DI

    call GetString
    call Putln

    mov SI, MyArray ;;;; lodsb uses SI
...

以下是您需要进行的唯一更改:

...
;;;;    mov SI, MyArray
    mov DI, MyArray ;;;; stosb uses DI

    call GetString
    call Putln

    mov SI, MyArray ;;;; lodsb uses SI
...

哈哈,谢谢迈克尔!我被困了几个小时,我想它只需要一双新的眼睛就可以了!它现在工作得很好:)谢谢!哈哈,谢谢迈克尔!我被困了几个小时,我想它只需要一双新的眼睛就可以了!它现在工作得很好:)谢谢!