assembly - 为什么我不能直接将一个字节移动到 64 位寄存器?

标签 assembly x86-64

为什么我不能在 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。

关于assembly - 为什么我不能直接将一个字节移动到 64 位寄存器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22621340/

相关文章:

assembly - 在我的程序启动之前堆栈上有什么?

linux - 需要一些关于 NASM 循环的建议

assembly - AMD64 上的推送和弹出

.s文件可以直接执行吗?

memory - 计算写入挂起队列的分配数量 - NV 内存出现意外的低结果

assembly - 使用 gdb 比较汇编跟踪

assembly - 为什么字节距离是 8 而不是 10?

c - lang使用的调用约定是什么?

assembly - Shellcode:非法指令

x86 - 段描述符中 AVL 位的用途是什么?