2017-08-03 51 views
1

你好我学校的每一个机构,我必须在ASM [英特尔] [NASM]做我自己的strdup功能。我在ASM的strdup

我拥有电子奇怪的问题......

在我的代码,如果我call _malloc

我的这个错误代码段错误:

Program received signal SIGSEGV, Segmentation fault. 
0x00007fff849612da in stack_not_16_byte_aligned_error() from /usr/lib/system/libdyld.dylib 

我不明白为什么,因为在部分.text我说过extern _malloc

有人有个想法我为什么得到这个错误? :)

这是我的代码:

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 

所有功能开始ft_比libc的THX同所有

+0

请花一些时间[阅读如何提出好问题](http://stackoverflow.com/help/how-to-ask),并学习如何创建[最小,完整和可验证示例] (http://stackoverflow.com/help/mcve),你可以告诉我们。 –

+0

至于你的问题可能的提示,你不知道什么'stack_not_16_byte_aligned_error'可能意味着什么?也许你应该看看你如何设置你的堆栈框架? –

+0

Fuz的回答是正确的。作为一个实验,您可以尝试通过简单地按下堆栈中的任何值并在最后弹出堆栈来将堆栈对齐到16字节的边界。例如,作为'_ft_strdup'中的第一条指令,将'push rbp'放在''rbp'之后,然后在'ret'之前放置'pop rbp'。 –

回答

5

此错误消息表明您叫malloc与不足对准堆栈。 amd64的SysV-ABI强制堆栈在函数调用时对齐到16个字节。

在您自己的代码中,您可以通过确保始终将偶数个四字插入堆栈并记住在入口处由于返回地址位于堆栈上而导致堆栈未对齐8个字节已经。

没有看到您的源代码很难给出更具体的帮助。