0
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

我知道STD这会造成麻烦,但我想如果我想反转字符串,我应该使用std...有人可以向我解释为什么这是错误的并给出如何解决它的提示吗?

感谢您提供任何进一步的帮助!

编辑:所以像这样?

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

它仍然崩溃=[

4

1 回答 1

0

我建议转向方向,因为:

  1. 当循环结束时 - 但最迟在程序结束时 - 方向标志必须设置为“前进”,

  2. mov byte ptr[edi],0:EDI必须指向最后一个 字符的后面。

字符串的长度是正确的数字loop(在 ECX==0 处中断),但不是ESI(从偏移量 0 开始)。在 Google 上搜索“因一个错误而关闭”。

这个有效:

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
于 2014-05-13T09:09:16.260 回答