循环结构跳过一些字母?

时间:2014-03-10 16:43:36

标签: assembly

我这里有一个应该代码:

  • 接受输入
  • 与字母"a"-"z" / 97d-122d的每个小写字母进行比较
    • 比较当前字符是否相等输入:如果为true,则继续转换并回显
    • 增加当前字符
    • 比较计数器是否等于限制,而不是继续测试字符
  • 如果未从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

但有些信件认为无效:cfhinr,{ {1}},swxy这是什么导致了这些行为?
信息:我使用tasm.exe作为汇编程序,tlink.exe用于链接器,dosbox用于模拟器

2 个答案:

答案 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

然而,这段代码相当无效。您应该查看说明jgjl。你的循环根本不需要,因为你可以用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:像往常一样,学习使用调试器,这样你就可以解决自己的错误。