到 MASM 中的上层程序?

toUpper procedure in MASM?

我正在尝试在 MASM 中仅针对 ASCII 编写一个简单的 toUpper 过程。但是,只要它遇到一个 whitespace 字符,它就可以工作,它不会继续更改该字符及其后字符的大小写。我无法弄清楚发生这种情况的原因。 所以我所做的是放置一个条件语句来测试一个字符是否是 space ' ' (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

您在第一个 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

这里有两种解决方法,要么跳到第二个LOOP,要么跳到第一个循环后的done:标签。此外,您实际上应该只将上面的“技巧”应用于 'a-z',这意味着 CMP AL,... 将针对 'a' 进行测试,如果较小,则跳转到循环,然后再次针对 [= 进行测试21=],如果较大,跳转到循环。

    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