Бесконечный цикл после завершения программы - PullRequest
0 голосов
/ 07 октября 2011

Так что эта программа была для назначения.Срок истек, и я сдал то, что у меня было, и получил хорошую оценку, но эта ошибка беспокоила меня.Технически это больше не является заданием, но я все же предпочел бы, чтобы вы не написали для меня код, поскольку я хочу понять, почему это происходит, а не обязательно его исправлять.

Так что программа работает нормально(по сути это toUpper() в ассемблере), но после того, как я передал программе завершающий символ (точку), программа успешно вызывает 'end', но затем никогда не завершается.Если я запускаю его в пошаговом отладчике, вызывается 'end main', а затем программа перебирает какой-то заранее написанный код, который я не распознаю, может очищать стек, вызывая DOS, я понятия не имею.Я пробовал много разных вещей (все безуспешно), и мне любопытно, есть ли у кого-нибудь понимание того, что может быть причиной этого.

Код ниже:

;---------------------------------------------------------------------
;    program:     Key
;    function:    Reads in specific characters from input and displays them.
;    owner:       ----------
;    date:        9/29/11
;    09/22/2011   Original Version
;----------------------
    .model small
    .8086
;----------------------
    .data              ; Start the data segment
;----------------------
    ; No variables

;----------------------
    .code              ; Start the code segment
;----------------------
main:                  ; Reading in values
    mov ah, 8h         ; Request input without echo
    int 21h            ; Read character into al

    cmp al, 20h        ; Is it a space?
    je  print          ; If so, print with no changes
    cmp al, 2Eh        ; Is it a period?
    je  print          ; If so, go to exit.
    cmp al, 41h        ; Is it below the floor of uppercase?
    jl  main           ; Then it's useless, throw it out and read in new.
    cmp al, 7Ah        ; Is it above lower ceiling?
    jg  main           ; Then it's useless, throw it out and read in new.
    cmp al, 5Ah        ; Is it smaller than upper ceiling?
    jle print          ; If it's equal or smaller, then it's an upper.
    cmp al, 61h        ; Is it above lower floor?
    jl  main           ; If it is lower, back to main.
                       ; If we're here it's a lowercase letter
    sub al, 20h        ; Subtract 20h to make lowercase

print:                 ; Print characters
    mov dl, al         ; Copy character to output register
    mov ah, 2h         ; Load character output subroutine
    int 21h            ; Print character
    cmp dl, 2Eh        ; Check if it was a period.
    jne main           ; If not a period, go to main.

    mov ah, 4Ch        ; Place Exit Code for DOS service
    int 21h            ; call DOS service
    end main           ; If it was a period, exit program.
;----------------------

2 строки до конца были предложены моим другом, у которого больше опыта работы с ассемблером, чем у меня, и это заставляет программу корректно завершаться на моем эмуляторе DOS, но проблема с 'end' по-прежнему возникает в отладчике и моем скрипте тестирования профессора.

Кто-нибудь знает, что может быть причиной этого?

Ответы [ 2 ]

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

Когда вы вызываете DOS для выхода, al содержит код выхода (или уровень ошибки).Попробуйте mov ax, 4c00h вместо mov ah, 4ch.Таким образом, код ошибки будет 0 (значит, все в порядке).Это заставляет его работать, потому что код возврата каким-то образом используется оператором DOS IF ERRORLEVEL ... , который все испортил.;)

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

Когда вы говорите, что программа успешно вызывает end, вы имеете в виду, что она переходит на end main?

end ничего не делает. Это просто инструкция ассемблеру, указывающая конец вашего кода. Это не влияет на выполнение вашего кода. Без окончательного int 21h, предложенного вашим другом, ваш код будет просто выполняться. Если вам повезет, он продолжит выполнять nop инструкции.

...