使用引用参数从c调用汇编函数

时间:2013-04-15 13:45:54

标签: c assembly x86 nasm

我正在实现一个汇编函数来反转一个字符串。这个函数在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

的main.c

void strrev(char *str) ;

int main() {
   char *str1;

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

3 个答案:

答案 0 :(得分:1)

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

    cmp     byte [edi], 0
    je      reverse_string

看起来你在反转中包含了0-terminator,所以你的反向“字符串”都以0字节开头。

答案 1 :(得分:1)

似乎你在反转中包含'\0',即你把它移到前面。

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

答案 2 :(得分:1)

    cmp     byte [edi], 0
    je      reverse_string

会导致此

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

在字符串的开头写0。

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