首页 > 解决方案 > MASM中的toUpper过程?

问题描述

我试图在 MASM 中为 ASCII 编写一个简单的 toUpper 过程。但是,只要遇到空白字符,它就可以工作,它不会继续更改该字符及其后面的字符的大小写。我无法弄清楚发生这种情况的原因。所以我所做的是放置一个条件语句来测试一个字符是否是一个空格 ' ' (32) 并因此跳过它。这是否足够或者我是否应该测试任何不在 97 和 122 之间的值?

    ; EDX - INPUT - The offset to the BYTE Array 
    ; ECX - INPUT - The Size of the BYTE Array 
    ; EDX - OUTPUT- The offset to the new BYTE Array toUpper PROC
    PUSH ECX                ; we will modify this so push it to the stack
    DEC  ECX                ; we don't want the null terminating char
    loopMe:         
        MOV  AL, [EDX]      ; otherwise move what the EDX points to to AL       
        CMP  AL, 32         
        JNE  goodChar       
        INC  EDX            ; increment the pointer by one byte since this is a space       
        loop  loopMe        ; go to the next char
        goodChar:           
            AND  AL   , 11011111b  ; make AL capital            
            MOV  [EDX], AL          
            INC  EDX               ; increment the pointer by one byte          
            LOOP loopMe 
    done:
        POP ECX                        ; return it back to its original value
        RET toUpper ENDP

标签: assemblyproceduremasm

解决方案


在第一个 LOOP 指令之后你有一个问题:

    PUSH ECX
    DEC  ECX
loopMe:         
    MOV  AL, [EDX]
    CMP  AL, 32
    JNE  goodChar
    INC  EDX
    LOOP loopMe
                   <--- what happens here?
    goodChar:
        AND  AL   , 11011111b
        MOV  [EDX], AL
        INC  EDX
        LOOP loopMe
done:
    POP ECX
    RET toUpper

这里有两种解决方案,要么跳转到第二个,要么跳转到第一个循环后LOOPdone:标签。此外,您实际上应该只将上“trick”应用于“az”,这意味着CMP AL,...将对“a”进行测试,如果较小,则跳转到循环,然后再次对“z”进行测试,如果较大,则跳转到循环.

    PUSH ECX
    DEC  ECX
loopMe:         
    MOV  AL, [EDX]
    CMP  AL, 'a'
    JL   next
    CMP  AL, 'z'
    JG   next
    AND  AL   , 11011111b
    MOV  [EDX], AL
next:
    INC  EDX
    LOOP loopMe 
done:
    POP ECX
    RET toUpper

推荐阅读