2013-04-15 84 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

看來你在包括在逆轉,即你把它移動到前面。

我不是那麼熱的x86程序集,但它似乎edi點,當你輸入reverse_string,因此包括在第一個交換。