Assembly 英特尔x86_64 asm:将指针移动4乘4

Assembly 英特尔x86_64 asm:将指针移动4乘4,assembly,nasm,Assembly,Nasm,我对asm很感兴趣,但有一点我不明白,我正在重新编写memset函数,当我发现我必须将内存指针指针4乘以4才能使它工作时。为什么会这样 谢谢 编辑:哦,如果你碰巧有一个关于寄存器重叠的解释,如果你能分享它,我将非常感激!我总是将少于64位的参数移动到[rax-eax-a*…]中以拆分这些参数:-( (我的代码:) memset: 推动rbp mov rbp,rsp 莫夫拉克斯,rsi mov r11,rdi 循环: cmp-rdx,0 jz端 mov字节[rdi],al 十二月日 add rdi

我对asm很感兴趣,但有一点我不明白,我正在重新编写memset函数,当我发现我必须将内存指针指针4乘以4才能使它工作时。为什么会这样

谢谢

编辑:哦,如果你碰巧有一个关于寄存器重叠的解释,如果你能分享它,我将非常感激!我总是将少于64位的参数移动到[rax-eax-a*…]中以拆分这些参数:-(

(我的代码:)

memset:
推动rbp
mov rbp,rsp
莫夫拉克斯,rsi
mov r11,rdi
循环:
cmp-rdx,0
jz端
mov字节[rdi],al
十二月日

add rdi,4你确定吗?在几个测试中,它看起来不正确,而且它只适用于4。如果我尝试使用带有“add rdi,2”的memset(tab,'z',3),则只会更改数组的前两个字符。我也不明白,为什么指向5040的rdi会更改(char*)5010?1会发生什么情况?测试是什么?这不会忘记每4个字节中写入3个字节吗?您应该了解我的歉意,它与1一起工作…这很奇怪,我确信它一开始不工作(在执行+4之前,我花了30分钟更改阵列的第二个插槽!)。非常感谢您的指导!
memset:
    push rbp
    mov rbp, rsp

    mov rax, rsi
    mov r11, rdi
loop:
    cmp rdx, 0
    jz end
    mov byte [rdi], al
    dec rdx
    add rdi, 4    <------ here the 4 increment
    jmp loop
end:
    mov rax, r11
    mov rsp, rbp
    pop rbp
    ret