Чтение строки из эму 8086 и вывод ее обратно - PullRequest
1 голос
/ 04 мая 2019

Я пытаюсь получить строку в качестве ввода от моего ассемблера emu 8086.Я хочу напечатать введенную строку как вывод.При печати строки я получаю несколько забавных символов в качестве вывода вместе с вводом, который я дал.

Что я должен сделать, чтобы прекратить ввод ввода Я пытался завершить ввод знаком $.

DATA SEGMENT
    A DW ?
DATA ENDS    

CODE SEGMENT
   ASSUME CS:CODE,DS:DATA        
 START: 
   MOV AX,DATA
   MOV AH,0AH
   LEA DX,A
   INT 21H 
   LEA DX,A
   MOV AH,9H
   INT 21H
CODE ENDS
END START

Ответы [ 2 ]

2 голосов
/ 05 мая 2019

Здесь имеется ряд проблем.

  • Вы забыли настроить DS.

    mov ax, DATA
    mov ds, ax
    
  • Вы не выходите изпрограмма.

    mov ax, 4C00h       ; DOS.Terminate
    int 21h
    
  • Вы не указали правильный буфер ввода для функции DOS.BufferedInput 0Ah.

    DATA SEGMENT
        A   db   64, 0, 64 dup (0)
    DATA ENDS
    

    У меня есть хорошее объяснениеэтой функции DOS здесь

  • Вы не извлекаете строку для вывода, где хранятся ее символы, и не определяете ее должным образом в $.

    lea dx, A+2
    mov bx, dx
    mov bl, [bx-1]         ; Length of the string
    mov bh, 0
    add bx, dx
    mov byte [bx], "$"     ; Replace 13 by "$"
    mov ah, 09h            ; DOS.DisplayString
    int 21h
    
0 голосов
/ 04 мая 2019

Буфер для INT 21 / 0A настроен неправильно.Байт, на который указывает DS:DX, является максимальным числом считываемых байтов, следующий байт будет содержать количество прочитанных байтов, затем считанная строка будет сохранена, начиная со второго байта.Вам понадобится что-то вроде

A  DB 20    ; buffer length
   DB 0     ; (return) number of characters read
   DB 20 DUP(?)
   DB '$'   ; extra byte for string termination

Для приема до 20 символов.Вам все еще нужно будет добавить символ '$' перед вызовом INT 21/09, и смещение в DX должно быть A + 2 (не A).

...