我正在编写的程序应该从键盘读取用户输入。说明: 如果字符是大写字母(A-Z),空格(空格)或句点,则将其写入标准输出。如果是小写,则将其转换为大写并写入标准输出。 如果角色是其他任何东西,只需将角色扔掉。 处理完字符后,如果字符是句点(2Eh),则结束程序的执行。
我的代码有效,直到我输入一段时间,它打印出一段时间,然后光标在一个点上移动并无限期地闪烁。
.model small ;64k code and 64k data
.8086 ;only allow 8086 instructions
.stack 256 ;
;
.data ;
;
.code ;
start: ;
get_l: ;
mov ah, 8 ; set ah=8 to request a char w/o echo
int 21h ; [char] read is now in the al reg.
mov dl, al ; save the input in dl
;----------------------------------------------------------------
; test for period, if [char] is period the character prints
;----------------------------------------------------------------
cmp dl, 2Eh ; is [char] a period? 2Eh to 20h
je exit_ ; if so, jump to exit
;----------------------------------------------------------------
; if input >= a(61h) && input <= z(7Ah) then subtract 20h
;----------------------------------------------------------------
if_: ;
cmp dl, 61h ; compare input to a
jb else_if ; if [char]<a, jump to else_if
cmp dl, 7Ah ; compare input to z
ja else_if ; if [char]>z, jump to else_if
then_1: ;
sub dl, 20h ; capitalize [char] by subtracting 20h
jmp print_ ; print_ [char] to console
;----------------------------------------------------------------
; if input >= A(41h) && input <= Z(5Ah) then print
;----------------------------------------------------------------
else_if: ;
cmp dl, 41h ; compare [char] to A
jb else_ ; if [char]<A, jump to else_
cmp dl, 5Ah ; compare [char] to Z
ja else_ ; if [char]>Z, jump to else_
then_2: ;
jmp print_ ; print_ [char] to console
;----------------------------------------------------------------
; if input == *space*(20h) then print
;----------------------------------------------------------------
else_: ;
cmp dl, 20h ; compare [char] to ' '
je print_ ; print if space
jne get_l ; ignore and repeat loop if not space
endif_: ;
;----------------------------------------------------------------
; print subroutine
;----------------------------------------------------------------
print_: ;
mov ah, 2 ; set ah=2 to req. [char] to be writ
int 21h ; call DOS and [char] is written
jmp get_l ; go back to start of loop
exit_: ;
mov ah, 2 ; if so, print and jump to exit_
int 21h ;
end start ;
答案 0 :(得分:1)
在exit_
显示点后,处理只会继续进入内存中的任何内容。
要终止程序,您需要显式执行终止程序功能。有不止一个,但
exit_: ;
mov ah, 2 ; if so, print and jump to exit_
int 21h ;
mov ah,4CH ; Terminate program
int 21h ; Execute
end start ; end -of-module with enntrypoint start
执行AL
时INT 21H/4ACH
中的值在批处理中显示为ERRORLEVEL ...我没有设置它,因此它将是AL
中的任何内容时间...