我嘗試使用asm重現strcat標準c函數。彙編:返回64位指針地址(nasm unix x64)
這裏是我的C測試主:
char *ft_strcat(char *s1, const char *s2);
int main(void)
{
char str1[60];
str1[0] = 'a';
str1[1] = '\0';
char str2[] = "poney";
printf("\n>> Test de ft_strcat <<\n\n");
printf("str1 (%p) = \"%s\"\n", str1, str1);
printf("str2 (%p) = \"%s\"\n", str2, str2);
printf("ft_strcat(str1, str2) : %p\n", ft_strcat(str1, str2));
printf("str1 (%p) = \"%s\"\n", str1, str1);
return (0);
}
和我的彙編代碼
section .text
global _ft_strcat
_ft_strcat:
mov rax, qword rdi ; save pointer address in rdi to return it later
start:
cmp [rdi], byte 0
jz next
inc rdi
jmp start
next:
cmp [rsi], byte 0
je end
mov r11, [rsi]
mov [rdi], r11
inc rdi
inc rsi
jmp next
end:
mov [rdi], byte 0
ret ; return rax
而這裏的結果:
STR1(0x7fff5fbffb30)= 「A」
str2(0x7fff5fbffb20)=「poney」
ft_strcat(STR1,STR2):0x5fbffb30
STR1(0x7fff5fbffb30)= 「aponey」
似乎我的指針地址的高32位已經消失。我無法解釋爲什麼。
我知道這不僅僅是一個printf問題,因爲如果我嘗試從ft_strcat返回打印字符串而不是指針地址,則會出現段錯誤。
有什麼想法?
ret 8;從rax返回8個字節?一點也不。 – 2015-03-31 03:49:30
你打算在這裏使用什麼調用約定?你的代碼似乎沒有使用堆棧框架,並且C通常將其參數放入其中。 – 2015-03-31 03:50:28
是的,實際上這個ret是愚蠢的,我不得不刪除它。它也使我的程序段錯誤多次。 – 2015-03-31 03:53:09