2013-04-09 146 views
0

我想从键盘获得输入,然后将其输出到屏幕。8086 ASM - 输出字符串到屏幕

我的代码;

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字符。

任何帮助,将不胜感激!

回答

1

这些只是你需要做的修改:

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

    call GetString 
    call Putln 

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

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

+0

哈哈感谢迈克尔!我被困了几个小时,我想这只需要一双新的眼睛!它现在完美工作:)谢谢! – 2013-04-09 09:46:05