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'。 –