我试图在汇编中编写一个“ strcat”函数,但无法获取传递给它的要更改的内存中的值。我的测试崩溃了,我不明白为什么。我似乎也无法以易于理解的方式在x86_64程序集上找到任何好的文档。
global _ft_strcat
_ft_strcat:
push rbx
push rdx
mov rbx, rsi
mov rdx, rdi
parse:
cmp byte [rdx], 0
je concat
inc rdx
jmp parse
concat:
cmp BYTE[rbx], 0
je finish
mov dl, BYTE[rbx]
mov BYTE[rdx], dl
inc rdx
inc rbx
jmp concat
finish:
mov BYTE[rdx], 0
mov rax, rdi
pop rdx
pop rbx
ret
上面是我要编写的功能,下面是我的测试。
int main(void)
{
char buffer[50] = "Hello, ";
ft_strcat(buffer, "World!");
printf("%s\n", buffer);
return (0);
}
我遗漏了包含和标头之类的内容,因为从我所看到的内容来看,这与问题无关。我通过调试器运行了此程序,发现在函数结尾,rdi寄存器指向的字符串没有更改,但是我确实通过了concat标签中的循环,看起来好像是从字符串中提取了值被rsi指向的确实复制到了dl寄存器中。
答案 0 :(得分:2)
您的推和弹出按钮不匹配,因此您的例行更改rbp
和rbx
与ABI保留它们的要求相反。
答案 1 :(得分:0)
我的问题是我不了解如何操纵rdx寄存器的最低8位。通过将我的字符插入dl中,它的值更新了rdx的总体值,这意味着我实际上并没有连接我拥有的字符串,但是我正在写入的内存区域我不知道自己正在写入。
代码现在看起来像这样
global _ft_strcat
_ft_strcat:
push rbx
push rdx
push rcx
xor rcx, rcx
mov rbx, rsi
mov rdx, rdi
parse:
cmp byte [rdx], 0
je concat
inc rdx
jmp parse
concat:
cmp BYTE[rbx], 0
je finish
mov cl, BYTE[rbx]
mov BYTE[rdx], cl
inc rdx
inc rbx
jmp concat
finish:
mov BYTE[rdx], 0
pop rcx
pop rdx
pop rbx
mov rax, rdi
ret
您会注意到增加了Rex寄存器,并使用了其低8位来复制字节。