我在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:同样的问题每三个字符发生一次,如果它不能再进一步发生,并且必须回到第一个字符。
提前致谢。
答案 0 :(得分:1)
在C中有两个功能:memmove
和memcpy
不同之处在于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--)
指令?