为什么我不能直接将一个字节从内存移动到Intel x86-64程序集中的64位寄存器?

例如,此代码:

extern printf

global main

segment .text

main:
    enter   2, 0

    mov     byte [rbp - 1], 'A'
    mov     byte [rbp - 2], 'B'

    mov     r12, [rbp - 1]
    mov     r13, [rbp - 2]

    xor     rax, rax
    mov     rdi, Format
    mov     rsi, r12
    mov     rdx, r13
    call    printf

    leave
    ret

segment .data
Format:     db "%d %d", 10, 0

打印:
65 16706

我需要将寄存器r12和r13的移动字节更改为此,以便使代码正常工作:
xor     rax, rax
mov     al, byte [rbp - 1]
mov     r12, rax
xor     rax, rax
mov     al, byte [rbp - 2]
mov     r13, rax

现在,它会打印出预期的内容:
65 66

为什么我们需要这样做?

有没有更简单的方法可以做到这一点?

谢谢。

最佳答案

适本地使用零移动或符号扩展名。

例如: movzx eax, byte [rbp - 1] 零扩展into RAX

movsx rax, byte [rbp - 1] 签名扩展到RAX。

10-08 01:37