所以这个程序是为了一项任务。到期日过去了,我转过身来,得到了一个好成绩,但这个错误一直困扰着我。它在技术上不再是一个任务,但如果你不为我编写代码,我仍然更喜欢,因为我想了解为什么会这样,不一定要解决它。
所以程序运行正常(它在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'的问题仍然出现在调试器和我的教授测试脚本。
任何人都知道造成这种情况的原因是什么?
答案 0 :(得分:3)
当你说程序“成功结束”时,你的意思是它传递给end main
吗?
end
没有做任何事情。它只是汇编程序指示代码结束的指令。它对代码的执行没有影响。如果没有您朋友建议的最终int 21h
,您的代码将继续执行。如果你很幸运,它将继续执行nop
指令。
答案 1 :(得分:3)
当您调用DOS退出时,al包含退出代码(或错误级别)。请尝试mov ax, 4c00h
而不是mov ah, 4ch
。这样,错误代码将为0(表示一切正常)。这使它工作,因为返回代码以某种方式被DOS语句IF ERRORLEVEL ...
使用,这使得一切都搞砸了。 ;)