x86汇编中列表索引删除失效求助:无法删除指定姓名
x86汇编姓名管理程序删除功能排查方案
核对索引定位是否准确
先确认待删除姓名的内存偏移计算逻辑。假设每个姓名是5字节+终止符(比如0x00),索引从1开始的话,正确偏移应该是(输入索引-1)*(5+1)。如果没考虑终止符或者索引起始值搞错,会定位到错误内存区域,后续移动操作等于白做。可以用GDB调试,查看目标地址的内容是否匹配要删除的姓名。检查内存移动指令的正确性
左移后续姓名时,注意这几点:- 移动的字节数要算对:总共有N个姓名,删第i个的话,需要移动
(N - i)*6字节(按5字符+终止符算); - 方向标志位DF要设对:用
CLD设置正向移动,否则REP MOVSB会反向覆盖数据; - 移动完成后,要把最后一个姓名的位置清空(比如填0),不然lista遍历的时候还会读到旧数据。
示例移动代码:
mov esi, offset nume + (i*6) ; 指向待删除元素的下一个 mov edi, offset nume + ((i-1)*6) ; 指向待删除元素位置 mov ecx, (total - i)*6 ; 要移动的字节数 cld rep movsb ; 清空最后一个位置 mov edi, offset nume + ((total-1)*6) mov ecx, 6 mov al, 0 rep stosb- 移动的字节数要算对:总共有N个姓名,删第i个的话,需要移动
确认总计数是否更新
删除后必须把存储总姓名数的变量(比如total_nume)减1。如果没更新这个变量,lista功能还是会遍历原来的数量,看起来就像没删除一样。校验输入索引的合法性
要判断用户输入的索引是否在1到当前总姓名数之间。如果输入了超出范围的索引,整个删除逻辑根本不会执行,自然看不到变化。可以加个判断分支,比如索引无效就直接提示并返回。
如果能贴出sterge功能的具体代码片段,能更快定位问题。
内容的提问来源于stack exchange,提问作者Mihai
相关产品推荐
相关产品推荐

