2013-04-09 74 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