Bonjour à tous les corps pour mon école je dois faire ma propre fonction strdup dans ASM [intel] [NASM].Mon strdup dans ASM
J'ae problème étrange ...
Dans mon code si je call _malloc
Mon code segfault avec cette erreur:
Program received signal SIGSEGV, Segmentation fault.
0x00007fff849612da in stack_not_16_byte_aligned_error() from /usr/lib/system/libdyld.dylib
Je ne comprends pas pourquoi parce que dans la section .text J'ai dit extern _malloc
Quelqu'un a une idée pourquoi j'ai eu cette erreur? :)
Voici mon code:
section .text
global _ft_strdup
extern _strlen
extern _malloc
; extern _ft_memcpy
_ft_strdup:
call _strlen ;rax = len of str
mov r8, rdi ;r8 = str = src
inc rax ;rax++
; mov r9, rax ;len of dest with '\0'
mov rdi, rax ;to send the len for malloc
call _malloc ;rax = ptr of dest
; cmp rax, 0 ;malloc failled
; jle _error_malloc
; mov rdi, rax ;malloc param 1 of ft_memcpy
; mov rsi, r8 ;str in param 2 of ft_memcpy
; mov rdx, r9 ;len of str with '\0' param 3 of ft_memcpy
; call _ft_memcpy ;call ft_memcpy
ret
_error_malloc:
xor rax, rax ;return NULL
ret
Toutes les fonctions commencent par ft_
sont les mêmes que la libc Thx tous
Veuillez prendre le temps de [lire comment poser de bonnes questions] (http://stackoverflow.com/help/how-to-ask), et apprendre comment créer un [exemple minimal, complet et vérifiable] (http://stackoverflow.com/help/mcve) que vous pouvez nous montrer. –
En ce qui concerne un indice possible à propos de votre problème, ne vous demandez-vous pas ce que 'stack_not_16_byte_aligned_error' pourrait signifier? Peut-être devriez-vous commencer à regarder comment vous configurez vos cadres de pile? –
La réponse de Fuz est correcte. En tant qu'expérience, vous pouvez essayer d'aligner la pile sur une limite de 16 octets en appuyant simplement sur n'importe quelle valeur de la pile et en la faisant disparaître à la fin. Par exemple, en tant que première instruction dans '_ft_strdup', mettez' push rbp' et ensuite juste avant chaque 'ret' mettez' pop rbp'. –