2017-08-03 93 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個字節已經。

沒有看到您的源代碼很難給出更具體的幫助。