Pregunta

StrReverse proc 

                   uses ecx eax edi esi,
                   StrAdd1:dword,   ;string 1 address
                   StrAdd2:dword    ;string 2 address



    std                     ;backward direction - set direction flag
    push StrAdd2            ;address of str2 arg to StrlenAsm
    call StrLenAsm          ;get length of str2
                            ;called function responsible for stack cleanup
    mov ecx,eax             ;length of string in ecx for rep
    mov edi,StrAdd1         ;edi gets destination address for copy
    mov esi,StrAdd2         ;esi gets source address for copy

loopTop:

    lodsb                   ;
    stosb                   ;
    loop loopTop

    mov byte ptr[edi],0     ;null terminate copied string
    ret                     ;return control to caller

StrReverse endp

I know STD is causing trouble, but I thought if I want reversing string, I should use std...could anyone explain to me why is that wrong and giving hints how to fix it?

Thank you for any further helps!

EDIT: So like this?

StrReverse proc 
               uses ecx eax edi esi, ;
               StrAdd1:dword,   ;string 1 address
               StrAdd2:dword    ;string 2 address


push StrAdd1            ;address of str2 arg to StrlenAsm
call StrLenAsm          ;get length of str2
                        ;called function responsible for stack cleanup
mov ecx,eax             ;length of string in ecx for rep
mov edi,StrAdd1         ;edi gets destination address for copy
mov esi,StrAdd2         ;esi gets source address for copy
add edi, ecx

loopTop:

cld                     ;forword direction - clear direction flag
lodsb                   ;read from source string
std                     ;backward direction - set direction flag
stosb                   ;write into distination string
loop loopTop

mov byte ptr[edi],0     ;null terminate copied string
ret                     ;return control to caller

StrReverse endp

It is still crashing =[

¿Fue útil?

Solución

I suggest to turn the directions because:

  1. When the loop ends - but at the latest at the end of the procedure - the direction flag must be set to "forward",

  2. mov byte ptr[edi],0: EDI must point behind the last character.

The length of the string is the right number for loop (which breaks at ECX==0) but not for ESI (which begins at offset 0). Search on Google for "off by one error".

This one works:

include \masm32\include\masm32rt.inc        ; MASM32 headers for 'printf'

.data
    str2 db "Hallo World!", 0
    str1 db SIZEOF str2 dup ('-')

.code
StrReverse proc uses ecx eax edi esi,
    StrAdd1:dword,              ;destination string address
    StrAdd2:dword               ;source string address

    mov ecx, SIZEOF str2 - 1    ; length of string (w/o last null) in ecx for rep
    mov edi,StrAdd1             ; edi gets destination address for copy
    mov esi,StrAdd2             ; esi gets source address for copy
    add esi, ecx                ; source pointer to the end
    sub esi, 1                  ; adjust esi to base 0 (1 char = +0 bytes)

    loopTop:

    std                         ; backward
    lodsb                       ; read from source string
    cld                         ; forward
    stosb                       ; write into distination string
    loop loopTop

    mov byte ptr[edi],0         ; null terminate copied string
    ret                         ; return control to caller

StrReverse endp

main PROC
    printf ("%s\n", OFFSET str2)

    push OFFSET str2
    push OFFSET str1
    call StrReverse

    printf ("%s\n", OFFSET str1)

    invoke ExitProcess, 0

main ENDP

END main
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top