【问题标题】:Trying to recode memmove in asm试图在 asm 中重新编码 memmove
【发布时间】:2017-08-19 05:30:46
【问题描述】:

我在 Ubuntu 16.04 上使用 nasm,目前正在尝试重新编码 C memmove() 函数。

这是我的代码:

BITS 64

global memmove

memmove:
        push rbp
        mov rbp, rsp
        xor rcx, rcx

while:
        cmp rcx, rdx
        je end
        mov r10b, byte [rsi + rcx]
        mov byte [rdi + rcx], r10b
        inc rcx
        jmp while

end:
        mov rax, rdi
        leave
        ret

我这样称呼它:

char *str = strdup("Salutation");
printf("%s, %s\n", (char *)memmove(str + 3, str, 5), str);

预期输出是:

Saluton, SalSaluton

但我明白了:

SalSaon, SalSalSaon

由于某些原因,当我到达第四个字符时,它又回到了我的字符串 rsi 的开头。我的问题是为什么?我做错了什么?

PS:同样的问题每三个字符就会发生一次,就像它无法继续前进,不得不回到第一个。

提前致谢。

【问题讨论】:

    标签: assembly nasm memmove


    【解决方案1】:

    在 C 中有两个函数:memmovememcpy

    不同的是memcpy快了一点,但它不允许目标内存与源内存重叠。

    你实现的是memcpy,而不是memmove

    让我们在 C 中(而不是在 Assembler 中)实现 memcpy 来看看发生了什么:

    for(i=0; i<count; i++)
    {
        destination[i]=source[i];
    }
    

    让我们创建一个包含"Hello world example" 内容的char 数组并执行memcpy(&amp;(array[6]), &amp;(array[1]), 10);

    当第一次执行循环时,字母“w”将被“e”覆盖并且将永远消失!

    memmove 函数将检查源地址是在目标地址之前还是之后,如果源地址在目标地址之前,它将向后执行循环:

    for(i=count-1; i>=0; i--)
    

    顺便问一下:你为什么不使用movsb 指令?

    【讨论】:

      猜你喜欢
      • 2014-07-01
      • 2019-05-04
      • 2016-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-14
      • 2018-09-17
      • 1970-01-01
      相关资源
      最近更新 更多