自定义汇编字符串转长整型函数返回错误结果
看起来你在把C语言的字符串转长整型函数改写成汇编实现时卡壳了——现在的代码居然把"123\n"这种字符串转换成了1230,完全不是你想要的123。我来给你唠唠这类问题里最容易踩的几个坑,以及对应的排查方向:
循环终止条件没写对
我猜你大概率是没在遇到非数字字符(比如这里的换行符\n)时停下处理。很多新手写汇编版本时,只会判断字符是不是字符串结束符\0,但标准的字符串转数字函数(比如C里的strtoll)是遇到第一个非数字字符就停止转换的。要是你的汇编代码里没检查当前字符是否在'0'到'9'这个区间内,而是一股脑处理到字符串结尾,那\n这种非数字字符就会被错误当成有效数字参与计算,结果自然就歪了。数字累积的逻辑顺序搞反了
字符串转数字的核心逻辑是结果 = 结果 * 10 + (当前字符 - '0'),要是你在汇编里把这个顺序搞反了(比如先加字符值再乘10),或者乘10的操作出了问题,也会导致结果异常。比如你现在得到的是1230,刚好是正确结果的10倍,这说不定是你多执行了一次乘10的操作——比如处理完'3'之后没终止循环,又对\n做了一次“乘10加错误值”的操作,而这个错误值刚好被当成了0,才会得到1230。字符转数字的步骤漏了关键判断
还有一种可能是,你在把字符转换成数字时,没先验证这个字符是不是真的数字,就直接做了sub al, '0'的操作。换行符\n的ASCII码是10,减去'0'(ASCII 48)会得到-38,要是你的代码没处理有符号数的问题,这个负数被塞进长整型里就可能导致奇怪的结果,不过你得到的是1230,那更可能是你误把\n判定成了'0',比如判断数字的逻辑写错了(比如只查了小于等于'9',没查大于等于'0')。
给你个实用的调试小技巧:用gdb单步跟踪你的汇编代码,每处理一个字符就看看存结果的寄存器(比如rax)里的值是啥,这样一眼就能看到是哪一步开始结果不对的,排查起来效率高多了。
备注:内容来源于stack exchange,提问作者nononoitsadow

