如何在Z80汇编中一次性加载双字节地址及对应值至寄存器?
Z80汇编(Amstrad CPC):用索引寄存器加载双字节值
核心问题解答
Z80确实支持直接从索引寄存器(IX/IY)间接加载完整双字节到16位寄存器的指令,比如你提到的ld hl,(ix)就是合法指令,此外还有ld de,(ix)、ld bc,(ix),也可以带偏移量(如ld hl,(ix+2))。这些指令会一次性读取索引寄存器指向(或偏移后指向)的连续两个内存字节,低地址字节存入16位寄存器的低8位(L/E/C),高地址字节存入高8位(H/D/B),无需用A寄存器逐个读取拼接。
针对你的场景的示例代码
假设你的map表起始地址为4007,存储的双字节值为Z80默认的小端格式(低字节在前,高字节在后),以下是具体操作示例:
1. 让IX指向map表起始地址
ld ix,map ; 也可以直接写 ld ix,#4007,将表的起始地址加载到IX
2. 读取表中第一个双字节值(#C630)到HL
ld hl,(ix) ; 执行后,L = #30(地址4007的内容),H = #C6(地址4008的内容),最终HL = #C630
3. 读取表中第二个双字节值(#C6E8)到HL
因为每个dw占2字节,所以设置偏移量为2:
ld hl,(ix+2) ; 读取地址4009和400A的内容,最终HL = #C6E8
4. 加载指定地址对应的双字节值
如果已经将目标地址(比如4007)加载到IX,想要读取该地址存储的双字节值,直接执行ld hl,(ix)即可,和上述操作逻辑一致。
补充说明
- Z80的16位索引间接加载指令会自动处理小端存储,无需手动交换高低字节。
- Amstrad CPC使用标准Z80指令集,上述所有指令都完全支持。
内容的提问来源于stack exchange,提问作者reymagnus
相关产品推荐
相关产品推荐

