Search code examples
assemblyx86masmirvine32

How do I replace last characters with 0?


I have got this so far:

mov esi,0                       
mov edi,LENGTHOF source - 2     
mov ecx,SIZEOF source
L1:;iterate a loop
    mov al,source[esi]  
    mov target[edi],al          
    inc esi                 
    dec edi                 
    loop L1

From next data

source BYTE "This is the source string",0
       BYTE 4 DUP('%')
target BYTE SIZEOF source DUP('#')
       BYTE 4 DUP('^')

I got this output:

gnirts ecruos eht si sihT#^^^^

The target string should not have those characters at the end. I think I need to find the byte that needs to be zero and set it. How do I do that?


Solution

  • Before

    This is the source string0
    %%%%
    ##########################
    ^^^^
    

    After

    This is the source string0
    %%%0
    gnirts ecruos eht si sihT#
    ^^^^
    
    • Because of mov ecx,SIZEOF source, the loop has one iteration too many! See how that 4th '%' was overwritten by 0.

    • LENGTHOF source tallies the characters and the terminating zero. LENGTHOF source - 1 will point at the offset where you need to write the new terminating zero in the target.

    This is another version of the loop, one that avoids using the slow loop instruction:

        mov  ecx, LENGTHOF source - 1  ; destination offset
        xor  ebx, ebx                  ; source offset
        mov  al, 0                     ; terminating zero
    L1: mov  target[ecx], al
        dec  ecx
        mov  al, source[ebx]    
        inc  ebx
        test al, al                    ; until we reach terminator
        jnz  L1