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