到 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
我正在尝试在 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