Язык ассемблера: двукратный пользовательский ввод (mix char и int)

Я новичок в программировании на ассемблере, и мне нужна помощь в понимании и исправлении кода, с которым я боролся: я хочу предоставить пользовательский ввод:

Подсказка 1: введите подсказку о значении прочитанного назначения 2: введите значение считывания получателя Показать расстояние и пункт назначения.

Я использую VS2012 с библиотеками Irvine32 на оборудовании x64. Я компилирую как x32.

Проблема Код компилируется и собирается. Но вывод не правильный. Первая подсказка отображается только без ввода. Второе приглашение "Расстояние" отображается с разрешенным вводом. Если я изменю первый запрос на "readInt" вместо "readString", я получу приглашения в обоих, но я получу ошибку "Invalid Integer". Почему это? Как это исправить, а также отображать входные значения.

Мой код

INCLUDE irvine32.inc

;*************************************************************************      
.data
    queryDest   byte   "Destination", 0
    queryDist   byte   "Distance", 0

    destination       dword   ?
    distance       dword   ?

.code
 main proc
        call clrscr

        mov edx, offset queryDest
        call writeString
        call readString
        mov destination, eax

        call crlf
        mov edx, offset queryDist
        call writeString
        call readInt
        mov distance, eax

        call crlf
        Call WaitMsg        ;causes a wait for a key to be pressed
        exit
main endp
end main

Токовый выход

Место назначения

Distance50

Нажмите любую клавишу для продолжения...

1 ответ

Решение

Не проверено, потому что мой VS 2012 отказывается работать (работает над этим). Ваша главная проблема в том, что destination должна быть строкой, а не числом:

INCLUDE irvine32.inc

;*************************************************************************      
.data
    queryDest   byte   "Destination=", 0
    queryDist   byte   "Distance=", 0

    destination byte   "                     " ; LENGTH 21.
    distance    dword   ?

.code
 main proc
        call clrscr
 ;READ DESTINATION.    
        mov edx, offset queryDest
        call writeString             ;DISPLAY MESSAGE.

        mov edx, offset destination  ;STORE STRING HERE (ZERO TERMINATED).
        mov ecx, 20                  ;MAX CHARS TO READ.
        call readString              ;STORES STRING WHERE EDX POINTS.

        call crlf
 ;READ DISTANCE.
        mov edx, offset queryDist
        call writeString             ;DISPLAY MESSAGE.
        call readInt
        mov distance, eax

 ;DISPLAY DESTINATION AND DISTANCE.
        call crlf
        call crlf
        mov edx, offset destination   ;EDX POINTS TO STRING TO DISPLAY.
        call writeString              ;DISPLAY DESTINATION.
        call crlf
        mov eax, distance             ;NUMBER TO DISPLAY.
        call writeInt                 ;DISPLAY DISTANCE.

        call crlf
        Call WaitMsg        ;causes a wait for a key to be pressed
        exit
main endp
end main

Список используемой литературы

Другие вопросы по тегам