NASM编写字符串操作代码编译报标签计算错误如何解决
报错原因
NASM出现该报错的核心原因是你代码中存在递归的EQU常量定义,导致汇编器无法计算出固定的常量值,反复尝试1000次后终止汇编。
你.data段存在如下错误代码:
m5 db 10d,13d, "1.Enter the String " l5 equ $-l5 m6 db 10d,13d, "2.Length of String " l6 equ $-l6 m7 db 10d,13d, "3.Reverse of String" l7 equ $-l7 m8 db 10d,13d, "4.exit" l8 equ $-l8
这里的l5 equ $-l5是典型的递归定义:你把要计算的常量l5本身放到了等式右侧,形成了循环依赖,l5的值依赖于l5自身,汇编器永远无法算出确定值,就会触发该报错。你前面l1 equ $-m1的写法是正确的,后续手误把要减的字符串标签写成了长度标签本身。
修复方法
- 首先修正四个递归的EQU定义,改为对应字符串标签的长度计算,即可解决该汇编报错:
m5 db 10d,13d, "1.Enter the String " l5 equ $-m5 m6 db 10d,13d, "2.Length of String " l6 equ $-m6 m7 db 10d,13d, "3.Reverse of String" l7 equ $-m7 m8 db 10d,13d, "4.exit" l8 equ $-m8
- 其他代码潜在问题修复(避免汇编通过后运行异常):
- 读入字符串后需要把
rax中存储的读入长度存到length变量,在enterstring段的scall 0,0,string,50后加一行mov [length], rax - 对比用户输入的choice时需要指定操作数大小,改为
cmp byte [choice], 31h,其余三个对比逻辑同理修改 - 反转字符串时每次只需要读写1字节,把
reverse段里的mov rax,[rsi]和mov [rdi],rax改为mov al,[rsi]、mov [rdi],al
内容的提问来源于stack exchange,提问作者Aditya Bhat
相关产品推荐
相关产品推荐

