程序终止后无限循环

时间:2011-10-07 18:25:46

标签: assembly x86 dos infinite-loop

所以这个程序是为了一项任务。到期日过去了,我转过身来,得到了一个好成绩,但这个错误一直困扰着我。它在技术上不再是一个任务,但如果你不为我编写代码,我仍然更喜欢,因为我想了解为什么会这样,不一定要解决它。

所以程序运行正常(它在Assembly中基本上是toUpper()),但是在我将程序传递给终止字符(句点)后,程序成功调用'end',但实际上从未实际终止。如果我在一步一步的调试器中运行它,调用'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行是由我的一个朋友建议的,他比我更熟悉汇编程序,并且它使程序在我的DOS模拟器上正确终止,但是'end'的问题仍然出现在调试器和我的教授测试脚本。

任何人都知道造成这种情况的原因是什么?

2 个答案:

答案 0 :(得分:3)

当你说程序“成功结束”时,你的意思是它传递给end main吗?

end没有做任何事情。它只是汇编程序指示代码结束的指令。它对代码的执行没有影响。如果没有您朋友建议的最终int 21h,您的代码将继续执行。如果你很幸运,它将继续执行nop指令。

答案 1 :(得分:3)

当您调用DOS退出时,al包含退出代码(或错误级别)。请尝试mov ax, 4c00h而不是mov ah, 4ch。这样,错误代码将为0(表示一切正常)。这使它工作,因为返回代码以某种方式被DOS语句IF ERRORLEVEL ... 使用,这使得一切都搞砸了。 ;)