为什么我不能直接将一个字节移动到 64 位寄存器? [英] Why can't I move directly a byte to a 64 bit register?

查看:20
本文介绍了为什么我不能直接将一个字节移动到 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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆