Assembly 汇编MASM将字符串中的字符从小写更改为大写
我正在用MASM编写一个汇编代码,以便只将已声明为大写的字符串中的小写字母转换为大写字母,而将已声明为大写的字母单独转换为大写字母。到目前为止,我有这个,但它是按相反的顺序打印的,我不知道为什么。此外,我试图删除计数器,因为我不应该有一个,但没有它我的程序无法运行。任何建议都会有帮助Assembly 汇编MASM将字符串中的字符从小写更改为大写,assembly,masm,Assembly,Masm,我正在用MASM编写一个汇编代码,以便只将已声明为大写的字符串中的小写字母转换为大写字母,而将已声明为大写的字母单独转换为大写字母。到目前为止,我有这个,但它是按相反的顺序打印的,我不知道为什么。此外,我试图删除计数器,因为我不应该有一个,但没有它我的程序无法运行。任何建议都会有帮助 .386 .MODEL FLAT ExitProcess PROTO NEAR32 stdcall, dwExitCode:DWORD Include io.h
.386
.MODEL FLAT
ExitProcess PROTO NEAR32 stdcall, dwExitCode:DWORD
Include io.h
cr equ 0DH
Lf equ 0AH
.stack 4096
.data
str1 dword "aBcD",0
str1value byte "The new value of str1 is: ", 0
byte cr, Lf, 0
.code
_start:
sub esi, esi ; index reg
lea ebx, str1
top: mov al, [ebx+esi]
and al, 0DFh ;convert lowercase to corresponding uppercase
mov [esi+ebx], al
inc esi
loop top
done: output str1value
output str1
Invoke ExitProcess, 0
Public _start ; make entry point public
end ; end of source code
这是因为您已将字符串声明为
dword
以及汇编器如何解释dword
字符串常量。您应该使用字节
,即
str1 byte "aBcD",0
此外,如果使用
循环
指令,则应将cx
初始化为要执行的最大迭代次数。为了摆脱计数器(esi
),您可以使用ecx-1
作为ebx
的偏移量来向后处理字符串。反转字符串的原因是字符串前面的dword
,它应该是byte
要去掉循环计数器,您只需扫描字符串以查找表示字符串结尾的0字节
mov esi, offset str1
@@ProcessChar:
mov al, [esi]
test al, al
je @@Done
...
inc esi
jmp @@ProcessChar
@@Done:
...
如果使用循环计数器方法,则必须初始化ecx
,这在代码中是缺失的