如何强制z88dk汇编器仅使用Z80原生指令编译Z80汇编代码
如何关闭z88dk-z80asm的指令自动替换行为?
我正在使用z88dk将Z80汇编代码编译为80年代计算机可用的二进制代码。当编写了包含无效Z80指令add hl, a的汇编代码:
public _main ; This entry point definition is required by z88dk _main: org 0x0000 ld hl, 0x8000 ld a, 1 add hl, a ; Not a correct Z80 instruction
执行编译命令:
z88dk-z80asm test.asm z88dk-z80asm -b test.o
反汇编生成的test.bin后发现,汇编器自动将无效指令add hl, a替换成了一个用标准Z80指令实现对应功能的子程序调用:
0000 ORG_0000: 0000 ld hl,8000h ; 32768, -32768 0003 ld a,01h ; 1 0005 call .org_0000_l ; 0008h 0008 .org_0000_l: 0008 push af 0009 add a,l 000A ld l,a 000B ld a,h 000C adc a,00h ; 0 000E ld h,a 000F pop af 0010 ret
解决方案
- z88dk-z80asm直接编译时:添加
-x(或--no-extensions)参数,禁用汇编器的非标准指令扩展支持,遇到无效指令时直接报错而非自动替换。修改后的命令:
z88dk-z80asm -x test.asm -b test.o
- 通过zcc编译时:使用
-Cz-x参数将禁用扩展的选项传递给底层的z88dk-z80asm。示例命令(替换+target为实际目标平台,如+zx对应ZX Spectrum):
zcc +target -Cz-x -o test.bin test.asm
启用该参数后,汇编器遇到add hl, a这类无效Z80指令时会直接抛出错误,不会再自动生成替代子程序。
内容的提问来源于stack exchange,提问作者Markus Rautopuro
相关产品推荐
相关产品推荐

