Appearance
题目
某计算机采用大端方式,按字节编址。某指令中操作数的机器数为 1234FF00H,该操作数采用基址寻址方式,形式地址(用补码表示)为 FF12H,基址寄存器内容为 F0000000H,则该操作数的 LSB(最低有效字节)所在的地址是( )。
错因
A
两个错叠加:
- 形式地址没做符号扩展——直接把 0xFF12 当成 16 位无符号数加到基址上:0xF0000000 + 0xFF12 = 0xF000FF12(无意中把"负偏移"当成了"小正偏移")
- 没考虑大端 LSB 偏移——直接给出 EA 当 LSB 地址(实际 EA 是 MSB 地址,LSB 还要 +3)
B
形式地址没做符号扩展(同 A 第 1 错),但记住了大端 LSB 在末尾要 +3:0xF000FF12 + 3 = 0xF000FF15。所以 EA 的"高 16 位"算错(保留 F000 而非真正的 EFFF)。
C
正确做了符号扩展(EA = 0xEFFFFF12)但漏了大端 LSB 偏移——以为 EA 就是 LSB 地址。大端方式:MSB 在最低地址、LSB 在最高地址;4 字节操作数的 LSB 地址 = MSB 地址 + 3。
总解析
第一步:判断形式地址的真值(带符号扩展)
题面明示形式地址是补码。0xFF12 = 1111 1111 0001 0010,最高位 1 → 负数。
求绝对值:
| 步骤 | 二进制 | 十六进制 |
|---|---|---|
| 0xFF12 | 1111 1111 0001 0010 | FF12 |
| 取反 | 0000 0000 1110 1101 | 00ED |
| +1 | 0000 0000 1110 1110 | 00EE |
所以形式地址真值 = −0x00EE(十进制 −238)。
第二步:算 EA(操作数 MSB 地址)
基址寻址公式:
形式地址符号扩展到 32 位:0xFF12 → 0xFFFF_FF12(高位补符号位 1)。
按 32 位补码加法(最高位进位丢弃):
| 项 | 32 位 |
|---|---|
| 基址 | F0000000 |
| + 符号扩展 | FFFFFF12 |
| 求和(含进位) | 1_EFFFFF12 |
| 取低 32 位 | EFFFFF12 |
EA = 0xEFFFFF12(这是大端方式下操作数最高有效字节 MSB 的地址)。
第三步:根据大端规则求 LSB 地址
大端方式:最高有效字节存最低地址、最低有效字节存最高地址。
操作数机器数 0x1234FF00(4 字节),按大端从地址 0xEFFFFF12 起依次存放:
| 地址 | 字节 | 含义 |
|---|---|---|
| 0xEFFFFF12 | 12 | MSB(最高有效字节) |
| 0xEFFFFF13 | 34 | |
| 0xEFFFFF14 | FF | |
| 0xEFFFFF15 | 00 | LSB(最低有效字节) |
LSB 地址 = MSB 地址 + 3 = 0xEFFFFF12 + 3 = 0xEFFFFF15。
最终答案是 D(EFFFFF15H)。
关键步骤汇总表:
| 步骤 | 中间结果 |
|---|---|
| 形式地址 | 0xFF12(补码 16 位)= −238 |
| 符号扩展到 32 位 | 0xFFFF_FF12 |
| EA = 基址 + 符号扩展 | 0xF000_0000 + 0xFFFF_FF12 = 0xEFFF_FF12 |
| 操作数大小 | 4 字节(0x1234_FF00) |
| 大端 LSB 偏移 | +3 |
| LSB 地址 | 0xEFFF_FF12 + 3 = 0xEFFF_FF15 |
易错点速查:
- 补码形式地址必须符号扩展,不能当无符号数直接加(A 错的根源)
- 大端:MSB 在低地址、LSB 在高地址(4 字节操作数 LSB = MSB + 3)
- 小端:相反——LSB 在低地址、MSB 在高地址(小端 LSB 地址 = EA)
- EA 是操作数"起始地址",对大端是 MSB、对小端是 LSB——本题大端,所以要 +3