在 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 程序集中逐字节循环和处理字符串的主要内容,如果未能解决你的问题,请参考以下文章

在 MASM 8086 程序集中读取多个文件

masm x86 程序集崩溃中的 DOS 中断

如何在 Visual Studio 2017 的 x86 程序集中使用 printf?

汇编 MASM 字符串比较

我如何将一个字符串逐行查找到创建它的代码行、方法名、类名和程序集?

在 X86 程序集中访问和移动字节