Сборка - программа работает, как и ожидалось, но когда запускается во второй раз, печатает бред - PullRequest
3 голосов
/ 07 октября 2019

Я делаю программу в сборке TASM (я, честно говоря, понятия не имею, если она 16-битная, x86, 64-битная, может быть, 8086?). Я использую TASM внутри DOSBox для сборки, компоновки и тестирования.

Пользователь вводит символы до тех пор, пока пользователь не нажмет клавишу Enter , а затем выведет на экран то, что они набрали обратно в консоль. Это мой код:

IDEAL
model small
STACK 100h

DATASEG
wholeinput db 00

CODESEG
start:

mov ax,@data
mov ds,ax
    mov bx, 0 ; bx is the counter

    input:
    mov ah, 1 ; input moves the input to al
    int 21h

    cmp al, 13 ; 0xD is enter key
    je enterPressed ; if its not 'enter' then continue
    add [wholeinput+bx], al ; add the given character to the end of the string

    inc bx    ; inc counter of string length
    jmp input ; continue loop


    enterPressed:
    add [wholeinput+bx], '$' ; add to the last byte of the thing a string terminator
    mov ah, 9
    mov dx, offset wholeinput ; print the whole thing
    int 21h


exit:
mov ax,4c00h
int 21h
END start

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

Моя теория состоит в том, что память из моего предыдущего запуска каким-то образом копируется в следующий запуск. это может быть очень глупо, но я нуб ...

Screenshot

В чем может быть моя проблема? Как я могу ее решить?

Редактировать: Спасибо Майку Накису и Питеру Кордесу за это решение:
Проблема заключалась в том, что я не зарезервировал достаточно места для ввода.

wholeinput db 00

зарезервировать только один байт. Fix:

wholeinput db 100 dup (0)

1 Ответ

3 голосов
/ 07 октября 2019

Я не уверен, был ли TASM когда-либо создан для чего-либо, кроме 16-битного;В любом случае код определенно выглядит 16-разрядным, и он также определенно собирается в TASM как 16-разрядный, в противном случае предложение model small будет выдавать ошибку, поскольку это предложение существует только в 16-разрядном режиме.

Ваша теория вовсе не глупая вещь, она, скорее всего, верна.

Я не уверен, почему этот джентльмен с репутацией ~ 80k удалил свой ответ, но это правда, чтоdb 00 зарезервирует место только для одного байта. Таким образом, вы пишете после конца вашего сегмента DATA для любого ввода более 0 байтов. (Простое нажатие Enter сразу приведет к тому, что ваша программа сохранит '$' в этот байт.)

Вам необходимо db 100 dup(0) для массива из 100 нулей. См. Что означает `dup (?)` В TASM?

Почему резервирование недостаточного пространства вызывает именно этот тип поведения, я не знаю, и, честно говоря, этоне поведение, которое я ожидал бы от этого типа ошибки. Но с другой стороны, в нашей профессии происходят все виды странных вещей, и когда вы видите, что наиболее вероятная причина проблемы, вы можете либо быстро устранить ее и продолжить свою жизнь, либо потратить часы на поиск и устранение неисправностей, чтобы попытатьсявыяснить, почему именно это поведение было соблюдено. Выбор за вами.

...