Motorola 68k架构下d1存FF00的原因及MOV指令差异咨询
Motorola 68k指令执行结果及MOVE指令差异解析
一、执行指令后d1值为$FF00的原因
先看执行的指令序列:
MOVE.W #$FFFF, d1 ADD.B #1, d1
具体执行逻辑:
- MOVE.W #$FFFF, d1:这条16位字传送指令将立即数$FFFF写入d1的低16位,此时d1的低16位为$FFFF(高8位是$FF,低8位是$FF),高16位若未初始化则默认置0,但不影响本次字操作的结果。
- ADD.B #1, d1:这条8位字节加法指令仅对d1的低8位进行运算:
- 低8位初始值$FF加1后,8位范围内的结果为$00($FF+1=$100,超出8位的进位被丢弃,仅保留低8位)。
- 字节操作不会修改寄存器的其他位,因此d1的高8位仍保持$FF不变。
- 最终d1的低16位组合为高8位$FF + 低8位$00,即$FF00。
核心关键点:68k的字节加法是独立的8位运算,进位只会设置状态寄存器的C标志,不会自动传递到高字节,因此不会出现高8位被进位修改的情况,这也是结果不是$00FF的原因($00FF对应高8位00、低8位FF,与实际操作的位域不符)。
二、MOVE.B、MOVE.W、MOVE.L指令的差异
Motorola 68k的MOVE指令后缀代表操作的数据宽度,针对数据寄存器(d0-d7)的差异如下:
- MOVE.B:8位字节操作,仅修改目标寄存器的最低8位,其余24位保持原有值不变。例如:若d1初始为$11223344,执行
MOVE.B #$AA, d1后,d1变为$112233AA。 - MOVE.W:16位字操作,仅修改目标寄存器的低16位,高16位保持原有值不变。例如:若d1初始为$11223344,执行
MOVE.W #$AABB, d1后,d1变为$1122AABB。 - MOVE.L:32位长字操作,修改目标寄存器的全部32位,原有值被完全覆盖。例如:若d1初始为$11223344,执行
MOVE.L #$AABBCCDD, d1后,d1变为$AABBCCDD。
若目标是内存地址,不同宽度的MOVE指令会对应不同的内存访问大小,且遵循大端字节序规则(高字节存放在低地址,低字节存放在高地址)。
内容的提问来源于stack exchange,提问作者Thomas Parkin
相关产品推荐
相关产品推荐

