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