assembly - 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
解决方案
在第一个 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:
标签。此外,您实际上应该只将上“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
推荐阅读
- git - git status 的工作原理以及它在哪里显示结果
- postgresql - postgresql 中的 PRAGMA EXCEPTION 等价物是什么?
- android - Dialogox中的按钮单击侦听器问题
- vue.js - 处理 vueitfy v-menu 的最佳方法
- git - Git 合并和警告信息
- r - 删除多行
- javascript - Rails - 从 app/views 中的 js.erb 调用 app/javascript 中的 JS 函数
- typescript - 在接口中定义时,字符串文字类型的字段分配错误
- python - django ModelAdmin 中的高级查询集。AttributeError:“dict”对象没有属性“_meta”
- php - Laravel 代码清理不需要的对象属性并仅提取 laravel 5.4 中需要的属性?