我正在使用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”。任何询问将不胜感激!提前谢谢。
答案 0 :(得分:2)
您必须加载角色,处理它并将其存储回来。你不存储它。
类似的东西:
mov [esi+ebx], al
缺失。
为什么你从char中分配0x20?你为什么要把5添加到esi?
<强>更新强>
在开始编码之前,您应该考虑所需的步骤。
就是这样。现在,当您查看代码示例时,您可以轻松查看缺少的内容以及出错的位置。
答案 1 :(得分:0)
可能会帮助你一点
.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