Z80汇编LD B,F5H指令报错 立即数语法规则咨询
Z80汇编十六进制立即数语法报错原因
核心原因是汇编器的词法解析优先级规则:所有以字母开头的token会被优先判定为符号(标签、变量名、助记符),而非数值常量。
- 第一行的
53H以数字5开头,汇编器扫描到首字符为数字时,会直接进入数值解析逻辑,识别末尾的H为十六进制标记,正确解析为值0x53,因此无论加不加前导0都能正常编译,前导0不改变数值大小,生成的目标代码自然完全一致。 - 第二行的
F5H以字母F开头,汇编器首字符扫到字母时,不会优先走数值解析流程:- 第一款汇编器会去符号表查找名为
F5H的自定义变量/标签,找不到就抛出undefined variable: F5H错误 - 第二款汇编器校验
LD B的参数合法性时,发现F5H既不是合法寄存器名、也不符合数值格式要求,就抛出Invalid argument of the instruction错误
- 第一款汇编器会去符号表查找名为
把F5H改成0F5H后,token首字符变为数字0,汇编器会直接进入数值解析流程,正确识别为十六进制值0xF5,错误就消失了。
关于你提到的Z80官方手册里的LD E, A5h示例:手册里的写法是逻辑层面的伪代码表达,目的是说明指令执行效果,不是严格遵循通用汇编器语法的可编译代码。部分原厂早年配套的专用汇编器可能放宽了解析规则,允许字母开头的十六进制数,但目前主流通用Z80汇编器(zmac、sjasm、pasmo等)都强制执行“数值必须以数字开头”的规则,本质是为了避免十六进制数和自定义符号名产生歧义。
实际编写代码时,只要是A~F开头的十六进制立即数,统一在前面补前导0写成0xxH格式,就能兼容所有主流汇编器的语法要求。
内容的提问来源于stack exchange,提问作者Ait-Gacem Nabil
相关产品推荐
相关产品推荐

