【发布时间】:2020-07-13 13:34:51
【问题描述】:
首先,这是我的第一次组装。我将它与“NASM”、“64bit ASM”和“Intel”代码以及 Mac OS 一起使用。
当我尝试编写 strdup 函数时,它不适用于 al。
在使用我的 strdup 函数时,字符串被破坏了。
所以,我的代码就在这里。
global _strdup
extern _malloc
section .text
_strdup:
xor rcx, rcx
jmp strlen
strlen:
cmp [rdi + rcx], byte 0
je malloc
inc rcx
jmp strlen
malloc:
inc rcx
push rdi
mov rdi, rcx
call _malloc
pop rdi
cmp rax, 0
je error
xor rcx, rcx
jmp copy
copy:
mov al, byte [rdi + rcx]
mov byte [rax + rcx], al
cmp al, byte 0
je return
jmp increment
increment:
inc rcx
jmp copy
error:
mov rax, 0
ret
return:
ret
但是,当我使用 dl 而不是 al 编写相同的代码时,它可以工作!
global _strdup
extern _malloc
section .text
_strdup:
xor rcx, rcx
jmp strlen
strlen:
cmp [rdi + rcx], byte 0
je malloc
inc rcx
jmp strlen
malloc:
inc rcx
push rdi
mov rdi, rcx
call _malloc
pop rdi
cmp rax, 0
je error
xor rcx, rcx
jmp copy
copy:
mov dl, byte [rdi + rcx]
mov byte [rax + rcx], dl
cmp dl, byte 0
je return
jmp increment
increment:
inc rcx
jmp copy
error:
mov rax, 0
ret
return:
ret
我不知道dl 为何有效以及al 和dl 之间的区别。
有人知道吗?谢谢。
【问题讨论】:
-
al是您用于寻址的rax的低字节。
标签: macos assembly x86-64 nasm