【发布时间】:2018-01-10 16:17:56
【问题描述】:
大家好,我学校的每个人我都必须在 ASM [intel] [NASM] 中执行我自己的 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 all 相同
【问题讨论】:
-
至于关于您的问题的可能提示,您不知道
stack_not_16_byte_aligned_error可能意味着什么吗?也许您应该开始研究如何设置堆栈帧? -
Fuz 的回答是正确的。作为一个实验,您可以尝试将堆栈对齐到 16 字节边界,只需将任何值压入堆栈并在最后将其弹出即可。例如,作为
_ft_strdup中的第一条指令放置push rbp,然后在每个ret之前放置pop rbp。 -
Fuz 和 Michael Petch,我没有段错误了,看起来我一直在检查 thx :)
标签: macos assembly nasm x86-64 glibc