【问题标题】:Moving Registers in Assembly (Using Move command)在装配体中移动寄存器(使用移动命令)
【发布时间】:2026-01-27 06:40:02
【问题描述】:

我目前正在课堂上学习汇编语言,并且仍在努力了解它的基础知识。 我收到了这个问题:

D5  contains  $FFFFFFFF  just  before  the  instruction  MOVE.W  #$F3,D5 
executes. What is the value in D5 after this instruction?

我不知道如何解决这个问题,我知道移动命令将“F3”复制到源 int D5,但我如何找到实际结果? D5中的F3去哪了?

【问题讨论】:

  • 这是哪种处理器架构? Motorola 68k?
  • 是的,摩托罗拉 MC68000
  • 我还没有参考合适的参考资料,但猜测答案可能是 $FFFF00F3
  • 如果你能解释一下你是怎么做到的,我仍然对整个(字,字节)的区别感到困惑,我的教授还没有教过。
  • 你有 bytes (8-bits), words (16-bits), double-words (32 -bit) 和 quad-word (64-bit) 和 twords (128-bit)。我不知道您的摩托罗拉语法,但我怀疑MOVE.Wmove-word,它将值$F3 的16 位移动到D5。如果 D5 最初是 $FFFFFFFF,则将低 16 位替换为 $F3 (0x00F3),从而得到 $FFFF00F3。低位字(低 16 位)是唯一从 0xFFFF 更改为 0x00F3 的位。

标签: assembly


【解决方案1】:

在 M68K 中,您有 8x32 位数据寄存器,编号为 D0 到 D7。 这些是 MOVE.L src 中引用的长字值,Dn so,十六进制,0xFFFFFFFF 对于所有 32 位。 每个数据寄存器的低 16 位是用于字操作的数据寄存器,因此在十六进制中为 0x0000FFFF。 低 8 位是该数据寄存器的字节字段,即 0x000000FF。 例如 move.b #$00, D0 将 D0 的低 8 位设置为零 EXT.w D0,将 D0 中的字节位从一个字节扩展为一个字。 EXT.l D0 将 D0 中的字位从一个字扩展为一个长字。

在您给出的示例中,高 16 位设置为 0x$FFFF,低 16 位被覆盖。

【讨论】: