2013-04-15 6 views
0

Я реализую функцию сборки для изменения строки. Эта функция вызывается в C с сигнатурой void strrev(char *str) ; Все, кажется, работает нормально внутри функции, отлаживается с помощью gdb, но печатает содержимое строки после вызова strrev(), просто печатает пустые строки.вызов функции сборки из c с эталонным параметром

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) ; 
} 

ответ

1

Этот

cmp  byte [edi], 0 
    je  reverse_string 

заставит это

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

написать 0 в начале строки.

Вам нужно отступить от ограничителя строк.

1

Я не особенно свободно на ассемблере, но мне

cmp  byte [edi], 0 
    je  reverse_string 

выглядит как включить 0-терминатор в обращении, так что ваши обратные «строки» начинаются с 0 байт.

1

Кажется, вы включаете '\0' в поворот, т. Е. Переместите его на передний план.

Я не так горячий с сборкой x86, но кажется, что edi указывает на терминатор при вводе reverse_string и, таким образом, включен в первую своп.

Смежные вопросы