Looping and processing string byte-by-byte in MASM assembly

巧了我就是萌 提交于 2021-01-29 04:51:18

问题


I am using MASM assembly and I am trying to write a loop that processes the string str1 byte-by-byte, changing each lowercase letter into the corresponding capital letter using bit operations. If the letter is already capital, leave it alone. Nothing seems to happen to my string str1 when I execute my code and I'm having difficulty figuring out why, maybe I shouldn't be processing my array as such, but nonetheless, here's the code:

        .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

Nothing changes , and on top of the conversion not taking place, the string it printing in reverse order. why? prints out as: "DcBa". Any inquiry would be appreciated! Thanks in advance.


回答1:


You must load the character, process it, and store it back. You don't store it.

Something like:

mov [esi+ebx], al

is missing.

Why do you sub 0x20 from the char? And why do you add 5 to esi?

Update

Before you start coding, you should think about what the required steps are.

  1. Load the character.
  2. If the character is 0 the string is done.
  3. If the character is uppercase, convert it
  4. Store the character
  5. Adavance to the next character and back to 1

That's it. Now when you look at your code example, you can easily see what is missing and where you go wrong.




回答2:


May help you a bit

    .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


来源:https://stackoverflow.com/questions/16622296/looping-and-processing-string-byte-by-byte-in-masm-assembly

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!