gpt4 book ai didi

c - 数据移动错误澄清

转载 作者:行者123 更新时间:2023-11-30 14:49:04 28 4
gpt4 key购买 nike

我目前正在解决《计算机系统:程序员的视角》第三版中的问题 3.3,我很难理解这些错误的含义...

movb $0xF, (%ebx) 给出错误,因为 ebx 不能用作地址寄存器

movl %rax, (%rsp)movb %si, 8(%rbp) 给出错误,指出指令后缀和寄存器 I.D 之间不匹配。

movl %eax, %rdx 给出错误,指出目标操作数大小不正确

为什么我们不能使用ebx作为地址寄存器?是因为它的寄存器是32位的吗?如果下面的行是 movb $0xF, (%rbx) ,它会起作用吗?既然rbx是64位寄存器?

关于指令后缀和寄存器ID不匹配的错误,出现这个错误是因为它应该是movq %rax, (%rsp)movew %si, 8( %rbp) 而不是 movl %rax, (%rsp)movb %si, 8(%rbp)

最后,关于“目标操作数大小不正确”的错误,这是因为目标寄存器是 64 位而不是 32 位吗?所以如果代码行是 movl %eax, %edx ,错误就不会发生?

任何启发将不胜感激。

这适用于 x86-64

最佳答案

movb $0xF, (%ebx) gives an error because ebx can't be used as address register

确实,ebx 不能用作地址寄存器(对于 x86-64),但 rbx 可以。 ebx 是 rbx 的低 32 位。 64 位代码的全部要点是地址可以是 64 位,因此尝试使用 32 位寄存器来引用内存没有什么意义。

movl %rax, (%rsp) and movb %si, 8(%rbp) gives error saying that 
theres a mismatch between instruction suffix and register I.D.

是的,因为您使用的是 movl,所以“l”表示长,(在本上下文中)表示 32 位。然而,rax 是一个 64 位寄存器。如果你想从 rax 中写入 64 位,你应该使用 movq。如果你想写32位,你应该使用eax

movl %eax, %rdx gives an error saying that destination operand incorrect size

您正在尝试将 32 位值移至 64 位寄存器。有说明可以为您执行此转换(例如,请参阅 cdq),但 movl 不是其中之一。

关于c - 数据移动错误澄清,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50011697/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com