c-程序集:返回64位指针地址(nasm-unix x64)



我尝试使用asm重现strcat标准c函数。

这是我的C测试主线:

char    *ft_strcat(char *s1, const char *s2);
int main(void)
{
    char str1[60];
    str1[0] = 'a';
    str1[1] = '';
    char str2[] = "poney";
    printf("n>> Test de ft_strcat <<nn");
    printf("str1 (%p) = "%s"n", str1, str1);
    printf("str2 (%p) = "%s"n", str2, str2);
    printf("ft_strcat(str1, str2) : %pn", ft_strcat(str1, str2));
    printf("str1 (%p) = "%s"n", str1, str1);
   
    return (0);
}

和我的汇编代码

section .text
global _ft_strcat
_ft_strcat:
mov rax, qword rdi    ; save pointer address in rdi to return it later
start:
    cmp [rdi], byte 0
    jz next
    inc rdi
    jmp start
next:
    cmp [rsi], byte 0
    je end
    mov r11, [rsi]
    mov [rdi], r11
    inc rdi
    inc rsi
    jmp next
end:
    mov [rdi], byte 0
    ret                ; return rax

结果是:

str1(0x7fff5fbffb30)=";a";

str2(0x7fff5fbffb20)=";poney";

ft_strcat(str1,str2):0x5fbffb30

str1(0x7fff5fbffb30)=";aponey";

我的指针地址的高32位似乎已经消失了。我无法解释为什么。

我知道这不仅仅是一个printf问题,因为如果我试图打印字符串而不是ft_starct返回的指针地址,我会得到一个segfault。

知道吗?

错误就在这里:

mov rax, qword rdi    ; save pointer address in rdi to return it later

我认为这应该是:

mov rax,rdi   ; save pointer address in rdi to return it later

此外,我认为主循环应该这样重写(这不是最佳的,因为它一次只包含一个字符,但假设你在每个循环中增加rsirdi一次,我认为这就是你想要做的):

next:
    cmp byte [rsi],0
    je end
    mov cl,[rsi]  ;load 8 bits
    mov [rdi],cl  ;store 8 bits
    inc rdi
    inc rsi
    jmp next

好吧,我的错,这不是asm问题。我通过在main的顶部添加#include"libfts.h"解决了这个问题。

如果没有函数原型,我想程序就无法判断函数是返回1字节还是8字节。。

在这一行:

mov rax,qword rdi

不需要qword,因为从64位寄存器移动到64位寄存器已经复制了8个字节的

我还在Makefile中添加了compilator标志,以防止出现这种错误。

最新更新