在 MASM 程序集中逐字节循环和处理字符串
Posted
技术标签:
【中文标题】在 MASM 程序集中逐字节循环和处理字符串【英文标题】:Looping and processing string byte-by-byte in MASM assembly 【发布时间】:2013-05-18 08:43:23 【问题描述】:我正在使用 MASM 程序集,我正在尝试编写一个循环来逐字节处理字符串 str1,使用位操作将每个小写字母更改为相应的大写字母。如果字母已经是大写字母,请不要理会它。当我执行我的代码时,我的字符串 str1 似乎没有发生任何事情,我很难弄清楚为什么,也许我不应该这样处理我的数组,但是,这里是代码:
.386
.MODEL FLAT
str1 dword "aBcD", cr, Lf, 0
....
.code
_start:
output str1
**sub esi, esi ; sum = 0
lea ebx, str1
top: mov al, [ebx + esi] ; attempting to move each character value from
str1 into the register al for comparison and
possible conversion to uppercase
add esi, 5
cmp al, 0
je zero
sub al, 20h** ; convert lowercase to corresponding uppercase
loop top
zero: output zeromsg ; for TESTING of al purposes only
done: output str1value
output str1
没有任何变化,除了没有发生转换之外,它以相反的顺序打印字符串。为什么?打印为:“DcBa”。任何询问将不胜感激!提前致谢。
【问题讨论】:
您在使用loop
指令之前忘记设置ECX。看起来您只想要jmp
,因为您正在检查 AL 是否有以零结尾的字符串。
【参考方案1】:
您必须加载角色,对其进行处理,然后将其存储回来。你不存储它。
类似:
mov [esi+ebx], al
不见了。
为什么你从 char 中分出 0x20?还有为什么要给esi加5?
更新
在开始编码之前,您应该考虑需要哪些步骤。
-
加载角色。
如果字符为 0,则字符串完成。
如果字符为大写,则进行转换
存储字符
前进到下一个字符并返回到 1
就是这样。现在,当您查看您的代码示例时,您可以轻松地看到缺少什么以及哪里出错了。
【讨论】:
是的,谢谢,我错过了。我是否应该只将 esi 增加 1,然后将 0x20 从 char 转换为大写,但我将其更改为位操作或 al, 20h @Devolus 我知道您尝试做什么,但是在您的代码中,您无条件地执行 sub 20,这是错误的。并且增加 esi 是 IMO 更好,因为我不会为这样的任务使用索引操作。没有真正的意义,您应该避免使 ASM 程序比它需要的更复杂。用简单的话表达需求通常是个好主意,因为这已经可以很好地提示您如何实现它。【参考方案2】:可能对你有所帮助
.writeLoop2
mov eax,[ebx] ;mov eax start of data block [ebx]
cmp al,&61 ;61hex is "a"
jb dontsub20 ;if its less don't bother because it's a CAPITAL letter
sub al,&20 ;else take off 20 hex
.dontsub20
call "osasci" ;print to screen command. Output the character in eax
inc ebx ;move ebx forward to next character
inc ecx ;ecx is the rolling count
cmp ecx,edx ;when ecx=edx we are at the end of the data block
jb writeLoop2 ;otherwise loop, there are more characters to print
【讨论】:
以上是关于在 MASM 程序集中逐字节循环和处理字符串的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Visual Studio 2017 的 x86 程序集中使用 printf?