You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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的写法是正确的,后续手误把要减的字符串标签写成了长度标签本身。

修复方法
  1. 首先修正四个递归的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
  1. 其他代码潜在问题修复(避免汇编通过后运行异常):
  • 读入字符串后需要把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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 06:45:03