我在MASM中编写一个汇编代码,只转换已经声明为大写的字符串中的小写字母,只留下那些已经大写的字母。到目前为止,我有这个,但它以相反的顺序打印,我不知道为什么。此外,我试图删除计数器,因为我不应该有一个但没有它我的程序不运行。任何建议都会有所帮助!
.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
答案 0 :(得分:0)
这是因为你已经将你的字符串声明为dword
以及汇编程序如何解释dword
字符串常量。您应该使用byte
代替,即
str1 byte "aBcD",0
此外,如果您使用loop
指令,则应将cx
初始化为要执行的最大迭代次数。要摆脱您的计数器(esi
),您可以使用ecx-1
作为ebx
的偏移来向后处理字符串。
答案 1 :(得分:0)
反转字符串的原因是字符串前面的dword
应为byte
。
要摆脱循环计数器,您只需扫描字符串中的0字节即表示字符串的结尾。
mov esi, offset str1
@@ProcessChar:
mov al, [esi]
test al, al
je @@Done
...
inc esi
jmp @@ProcessChar
@@Done:
...
如果您使用的是循环计数器方法,则必须初始化ecx
,但代码中缺少这种方法。