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同所有
請花一些時間[閱讀如何提出好問題](http://stackoverflow.com/help/how-to-ask),並學習如何創建[最小,完整和可驗證示例] (http://stackoverflow.com/help/mcve),你可以告訴我們。 –
至於你的問題可能的提示,你不知道什麼'stack_not_16_byte_aligned_error'可能意味着什麼?也許你應該看看你如何設置你的堆棧框架? –
Fuz的回答是正確的。作爲一個實驗,您可以嘗試通過簡單地按下堆棧中的任何值並在最後彈出堆棧來將堆棧對齊到16字節的邊界。例如,作爲'_ft_strdup'中的第一條指令,將'push rbp'放在''rbp'之後,然後在'ret'之前放置'pop rbp'。 –