在MASM程序集中逐字节循环和处理字符串

时间:2013-05-18 08:43:23

标签: arrays string assembly masm

我正在使用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”。任何询问将不胜感激!提前谢谢。

2 个答案:

答案 0 :(得分:2)

您必须加载角色,处理它并将其存储回来。你不存储它。

类似的东西:

mov [esi+ebx], al

缺失。

为什么你从char中分配0x20?你为什么要把5添加到esi?

<强>更新

在开始编码之前,您应该考虑所需的步骤。

  1. 加载角色。
  2. 如果字符为0则表示字符串已完成。
  3. 如果字符为大写,请将其转换为
  4. 存储角色
  5. 接受下一个字符并返回1
  6. 就是这样。现在,当您查看代码示例时,您可以轻松查看缺少的内容以及出错的位置。

答案 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