int 21h ах 02h почему-то не работает - PullRequest
2 голосов
/ 01 октября 2019

Моя задача - прочитать число с терминала (он же atoi ), а затем записать его обратно на терминал (он же itoa ).

Чтобы прочитатьЯ использую строку int 21h, ah 0ah. Кажется, приятно, когда я проверяю это в отладчике. И тогда мои atoi и itoa также выглядят хорошо, за исключением того, что в itoa я использую int 21h, ah 02h для отображения одного символа, но по какой-то причине он не отображается. Поэтому я вернулся к началу и заметил, что запись int 21h, ah 02h (печать символа) сразу после int 21h, ah 0ah (чтение строки) не дает результата.

; STACK SEGMENT
STSEG SEGMENT PARA STACK "STACK"
    DB 64 DUP (0)
STSEG ENDS

; DATA SEGMENT
DSEG SEGMENT PARA PUBLIC "DATA"
    startStr db "Enter a number : $"
    inputError db "Number has incorrect chars.", 10, "$"
    buffError db "Number is too big", 10, "$"
    bufferSize DB 16        ; 15 chars + RETURN
    inputLength DB 0        ; number of read chars
    buffer DB 16 DUP('?')   ; actual buffer
DSEG ENDS

; CODE SEGMENT

CSEG SEGMENT PARA PUBLIC "CODE"

    MAIN PROC FAR
        ASSUME cs: CSEG, ds: DSEG, ss:STSEG
        mov ax, DSEG
        mov ds, ax
        ;lea dx, startStr
        ;call WRITING
        ;call READING

        xor ax, ax
        xor dx, dx
        mov ah, 2
        mov dl, 56
        int 21h

;test display char before reading string - works fine


        xor dx, dx
        xor ax, ax
        lea dx, bufferSize
        mov ah, 10
        int 21h

; reading string - works fine

        xor ax, ax
        xor dx, dx
        mov ah, 2
        mov dl, 56
        int 21h

; trying to display char again - nothing

        ; call ATOI
        ; add ax, 15
        ; call ITOA
        ret
    MAIN ENDP
CSEG ENDS
END MAIN

Screenshoot
«8» - это символ, который я отображал в начале. «123» - это строка, которую я ввел, а затем нажал Enter.

1 Ответ

2 голосов
/ 01 октября 2019

Как только буферизированная входная функция DOS 0Ah получит клавишу enter , в зависимости от того, как работает ваш эмулятор DOS, курсор переместится в начало текущей строки ИЛИ на следующую строку.

Поскольку вывод этой второй «8» - это единственное, что осталось до выхода из вашей программы, приглашение DOS может перезаписать эту вторую «8». См. Скриншот .

Попробуйте отложить завершение программы. Просто подождите ключ.
Также напечатайте что-то отличное от вашего первого символа.

    mov dl, "*"
    mov ah, 02h  ; DOS.PrintChar
    int 21h
    mov ah, 00h  ; BIOS.GetKey
    int 16h

    ret
    MAIN ENDP
CSEG ENDS
END MAIN
...