我这里有一个应该代码:
"a"-"z"
/ 97d-122d
的每个小写字母进行比较
a
- z
找到,则显示无效的输入消息并转到输入提示这是我的代码:
.model small
.stack 100h
.data
Prompt db 10, 13, 10, 13, "Enter character: $"
Upper db 10, 13, "Upper Case: $"
Invalid db 10, 13, "Invalid Character!$"
.code
mov ax, @data
mov ds, ax
mov cx, 26
input:
mov ah, 09h
lea dx, Prompt
int 21h
mov ah, 01h
int 21h
cmp al, ' '
je exit
mov bl, 0
mov bh, 97d ; bh == 'a'
tst:
add bh, bl
cmp al, bh ; cmp (input,bl)
je continue ; if equal go to continue
add bl, 1
cmp bl, 122 ; cmp (bh,'z')
jne tst ; if not equal loop
; Invalid if not found from 'a' - 'z'
mov ah, 09h
lea dx, Invalid
int 21h
jmp input
continue:
sub al, 32 ; Subtract 32 to make it Upper Case
mov ah, 09h
lea dx, Upper
int 21h
mov ah, 02h
mov dl, al
int 21h
jmp input
exit:
mov ah, 4ch
int 21h
end
但有些信件认为无效:c
,f
,h
,i
,n
,r
,{ {1}},s
,w
,x
,y
这是什么导致了这些行为?
信息:我使用tasm.exe作为汇编程序,tlink.exe用于链接器,dosbox用于模拟器
答案 0 :(得分:1)
要解决您的问题,您应将其更改为:
mov bl, 97
tst:
cmp al, bl ; cmp (input,bl)
je continue ; if equal go to continue
add bl, 1
cmp bl, 123 ; cmp (bh,'z'+1 to include z as well)
jne tst ; if not equal loop
然而,这段代码相当无效。您应该查看说明jg
和jl
。你的循环根本不需要,因为你可以用cmparison来做到这一点。
伪代码:
if(ah < 'a')
jmp invalid
if(ah > 'z')
jmp invalid
printUpper
jmp continue
此外,如果一个值是作为一个字符,它使代码更可读,以实际使用该字符,而不是它的ASCII值。即move bl, 'a'
。
顺便说一句:太空出口不符合你的规格。 :)
答案 1 :(得分:1)
如果bl
是字符,那么您为什么要与bh
进行比较?为什么要将bl
添加到bh
?请注意,您不需要循环来检查某个数字是否在某个时间间隔内,只需检查它是否大于或等于下限且小于或等于上限。
PS:像往常一样,学习使用调试器,这样你就可以解决自己的错误。