试图在asm中重新编码memmove

时间:2017-03-26 15:25:18

标签: assembly nasm memmove

我在Ubuntu 16.04上使用nasm,我目前正在尝试重新编码C var compile, scope, controller; beforeEach(function() { module("ABCControllerModule"); // Instantiate the 'ABCController' module inject(function(_$compile_, _$rootScope_, _$controller_) { scope = _$rootScope_.$new(); controller = _$controller_('ABCController', {'$scope': scope}); compile = _$compile_; }); }); it('test1', function() { scope.a = SOME_VALUE; scope.someFunction = function(a) { ... }; var html_template = compile(<template-with-out-ng-controller->)(scope); console.log(angular.element(html_template.find('textarea')[1])); }); 函数。

这是我的代码:

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 的开头。我的问题是为什么?我做错了什么?

PS:同样的问题每三个字符发生一次,如果它不能再进一步发生,并且必须回到第一个字符。

提前致谢。

1 个答案:

答案 0 :(得分:1)

在C中有两个功能:memmovememcpy

不同之处在于memcpy有点快,但它不允许目标内存与源内存重叠。

您实施的内容为memcpy,而不是memmove

让我们在C中实现memcpy(而不是在汇编程序中),看看发生了什么:

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

让我们创建一个内容为char的{​​{1}}数组并执行"Hello world example"

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

然而,memcpy(&(array[6]), &(array[1]), 10);函数将检查源地址是在目标地址之前还是之后,如果源地址在目标地址之前,它将向后执行循环:

memmove

顺便说一句:为什么你没有使用for(i=count-1; i>=0; i--) 指令?