为什么我不能直接将一个字节移动到 64 位寄存器? [英] Why can't I move directly a byte to a 64 bit register?
本文介绍了为什么我不能直接将一个字节移动到 64 位寄存器?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
为什么我不能在 Intel x86-64 程序集中直接将一个字节从内存移动到 64 位寄存器?
Why can't I directly move a byte from memory to a 64-bit register in Intel x86-64 assembly?
例如这段代码:
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 的移动字节更改为这样才能使代码正常工作:
I need to change the move byte to registers r12 and r13 to this in order to make the code work properly:
xor rax, rax
mov al, byte [rbp - 1]
mov r12, rax
xor rax, rax
mov al, byte [rbp - 2]
mov r13, rax
现在,它打印出预期的内容:
Now, it prints what is intended:
65 66
为什么我们需要这样做?
Why do we need to do this?
有没有更简单的方法来做到这一点?
Is there a simpler way of doing this?
谢谢.
推荐答案
根据需要使用带零或符号扩展的移动.
Use move with zero or sign extension as appropriate.
例如:movzx eax, byte [rbp - 1]代码>
零扩展 进入 RAX.
movsx rax,字节 [rbp - 1]
符号扩展到 RAX.
movsx rax, byte [rbp - 1]
to sign-extend into RAX.
这篇关于为什么我不能直接将一个字节移动到 64 位寄存器?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文