0

我正在实现一个汇编函数来反转一个字符串。在 C 中使用签名调用此函数 函数中的void strrev(char *str) ; 一切似乎都工作正常,使用 gdb 进行调试,但在调用后打印字符串的内容strrev() 只会打印空字符串。

getlast:
        cmp     byte [edi], 0
        je      reverse_string
        inc     edi
        inc     ecx
        jmp     getlast

reverse_string:
        cmp     esi, edi
        jae     reversed
        mov     al, [esi]
        mov     bl, [edi]
        mov     [esi], bl
        mov     [edi], al
        inc     esi
        dec     edi

        jmp     reverse_string

主程序

void strrev(char *str) ;

int main() {
   char *str1;

   str1 = strdup("Hello World") ;
   strrev(str1) ;
   printf("str1 = \"%s\"\n", str1) ;
}
4

3 回答 3

1

我对汇编语言不是特别流利,但对我来说

    cmp     byte [edi], 0
    je      reverse_string

看起来您在反转中包含了 0 终止符,因此您反转的“字符串”都以 0 字节开头。

于 2013-04-15T13:49:02.970 回答
1

看来您将 包括'\0'在反转中,即您将其移到前面。

我对 x86 程序集不是很热,但是edi当您输入时它似乎指向终结符reverse_string,因此包含在第一次交换中。

于 2013-04-15T13:49:30.017 回答
1

    cmp     byte [edi], 0
    je      reverse_string

会导致这个

    mov     bl, [edi]
    mov     [esi], bl

在字符串的开头写入 0。

您需要从字符串终止符退后一步。

于 2013-04-15T13:50:09.973 回答