AshakiranBhatter Ответов: 1

Программа сборки для получения строки от пользователя


Привет,
Я пытаюсь изучить программирование ASM на MS-DOS, чтобы получить строку от пользователя.
Но во время выполнения он автоматически перезагружает ОС, зависает или плохо себя ведет, в то время как та же программа выполняется на Windows-XP, она не дает никаких ошибок во время выполнения.

Не могли бы вы, пожалуйста, помочь мне в этом отношении относительно того, где я иду не так?

Ниже окружающей среды:
Ассемблер Тасм
ОС: MS-DOS71, XP

.Model Small
.Stack 100H
.Data
    CR Equ 0DH
    LF Equ 0AH
    NL Equ 00H
    MsgX db 32H Dup (NL)
.Code
Run:
    MOV AX, @Data
    MOV DS, AX
    MOV AX, Offset MsgX
    CALL GetStr
    CALL Exit

    GetChr:
        PUSH BX
        PUSH CX
        PUSH DX
        MOV AH, 01H
        INT 21H
        POP  DX
        POP  CX
        POP  BX
    RET

    GetStr:
        PUSH AX
        PUSH BX
        PUSH CX
        PUSH DX
        MOV BX, AX
        GetStrLoop:
            CALL GetChr
            MOV Byte Ptr [BX], AL
            CMP Byte Ptr [BX], CR
            JE GetStrFree
            INC BX
            JMP GetStrLoop
        GetStrFree:
            MOV Byte Ptr [BX], NL
            POP DX
            POP CX
            POP BX
            POP AX
    RET

    Exit:
        MOV AH, 4CH
        INT 21H
End Run

[no name]

Ну, я хотел бы упомянуть одну из ошибок, которые я получаю во время выполнения, как показано ниже
"Ошибка процессора неверный код операции. процесс убийства"

Kuthuparakkal

попробуй изменить эту мову ах, 01Х
кому: MOV AH, 09H

[no name]

Ты только догадываешься? Функция 09H используется для отображения строки на экране, в то время как 01H используется для приема символа с экрана.
Как ты думаешь, какая разница, если я даже изменю их ?

1 Ответов

Рейтинг:
1

xenotron

Этот шифр напоминает мне о старых добрых временах... :-)
На первый взгляд в вашем коде нет серьезных ошибок, которые могли бы привести к сбою. возможно, вы скомпилировали и/или связали его неправильно. Вашу программу надо скомпилировать в EXE файл, а не файл com. Проверьте, есть ли у него exe-заголовок, откройте его с помощью двоичного средства просмотра и проверьте, начинается ли файл с "MZ" или "ZM". Если у него нет заголовка exe, то вы неправильно связали его как com-файл.

Для строкового ввода я бы использовал функцию dos 10, если только ваша задача не состоит в том, чтобы написать ее с помощью символьного ввода. Тот, который использует символьный ввод, полезен, когда вы хотите ограничить ввод (например, разрешить только цифры или максимизировать длину строки).

Некоторые заметки о коде:
- Ты слишком параноидален и используешь слишком много толчков и хлопков. Ваша функция getchar может быть встроена в ваш цикл.
- Вы не проверяете максимальную длину строки, это может привести к переполнению буфера, если пользователь вводит очень длинную строку.
- Вы не управляете backspace, но это потребует гораздо больше работы.
- Вы не указываете код выхода программы в al при выходе, например zero: mov ax, 4c00h int 21h
- Правильное название для "символа новой строки" (ascii 10) - это перевод строки (он же LF) в DOS, CR - это нормально. :-)