Итак, эта программа была для задания. Срок сдачи прошел, и я сдал то, что у меня было, и получил хорошую оценку, но эта ошибка меня беспокоит. Технически это больше не является назначением, но я все же предпочел бы, чтобы вы не писали код для меня, поскольку я хочу понять, почему это происходит, не обязательно исправлять это.
Таким образом, программа работает нормально (по сути, это 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' все еще встречается в отладчике и моем скрипте тестирования профессора.
Кто-нибудь знает, что могло быть причиной этого?