그래서이 프로그램은 과제를위한 것입니다. 납기일이 지났고 내가 갖고있는 것을 돌려보고 좋은 성적을 받았지만이 버그는 나를 괴롭혔다. 이것은 기술적으로 더 이상 과제가 아니지만, 필자가 코드를 작성하지 않았다면 더 좋아질 것입니다. 이유는 무엇인지 이해하고 싶기 때문입니다. 반드시 수정해야하는 것은 아닙니다.프로그램 종료 후 무한 루프
그래서 프로그램이 정상적으로 작동하지만 (어셈블리에서는 본질적으로 toUpper()
입니다.) 프로그램에 종료 문자 (마침표)를 전달하면 프로그램이 '끝'을 성공적으로 호출하지만 실제로는 종료되지 않습니다. 단계별 디버거에서 실행하면 'end main'이 호출 된 다음 프로그램이 jumsp를 사용하여 인식 할 수없는 미리 작성된 코드로 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 줄
가 나보다 어셈블러와 더 많은 경험의 광산의의 frind에 의해 제안되었고,이 프로그램이 내 DOS 에뮬레이터에서 제대로 종료 할 수 있지만, 문제는 '끝'여전히 디버거 및 내 교수 테스트 스크립트에서 발생합니다.누구든지이 문제를 일으킬 수있는 아이디어가 있습니까?
종료를 위해 DOS를 호출하면 al에 종료 코드 (또는 오류 수준)가 포함됩니다. Mov ax, 4c00h 대신 mov ah, 4ch를 사용하십시오. 이 방법으로 오류 코드는 0이됩니다 (모든 것을 의미합니다). – BlackBear
와우, 정말 고칠 수 있습니다. 알에 남은 숫자가있는 것 같아요. 어떻게 든 그걸 던져 버렸나 봅니다. 원한다면 답변으로 제출하십시오. 해결할 수 있습니다. – Charles
'sub al, 20h' 행의 주석은 "lower * case가 아닌 * upper * case"를 만들기 위해 "20h를 빼기"여야합니다. –