64位Intel汇编,为什么寄存器在变化

时间:2016-10-30 02:36:39

标签: assembly nasm x86-64 cpu-registers mov

我在我的64位Linux机器上使用NASM,我只想简单地说:

  1. 取一个字符数组(数字)
  2. 将它们转换为整数
  3. 将它们打印为整数
  4. 问题出在我打电话之后 movzx rsi, [array+rcx],rcx的值已经改变(我通过使用gdb调试了解到这一点)。这是为什么?

    我的代码:

    array db "012345678"
    fmt db "%d", 10, 0
    ...
    ...
        ; convert chars to integers
        mov rcx, 9
    L1:
        dec rcx
        sub [array+rcx], byte "0"
        jnz L1
    
        ; print as integers
        mov rcx, 0
    L2:
        mov rdi, fmt
        movzx rsi, byte [array+rcx] ; rcx changes after this
        xor rax, rax
        call printf
    
        inc rcx
        cmp rcx, 8
        jle L2
        ret
    

    但它不断地吐出2个。

    如果我在堆栈中保留rcx,或者使用不同的寄存器进行计数,则可以正常工作。 movzx是否要销毁rcx

    也是奖金问题,请随意排除,我是否正确地遍历数组?

0 个答案:

没有答案