Бесконечный цикл после завершения программы

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

Таким образом, программа работает нормально (по сути, это toUpper () в Assembly), но после того, как я передаю программе завершающий символ (точку), программа успешно вызывает '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.
;----------------------

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

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

0
задан Jens Björnhager 23 December 2012 в 21:47
поделиться