字符串对齐函数异常:为何文本未按预期对齐?
字符串对齐函数未按预期工作的问题分析
你的汇编实现代码存在多处逻辑错误,导致三种对齐方式都无法正确工作,以下是具体问题:
1. 寄存器滥用与计算逻辑混乱
在pad_spaces段,代码将总需填充的空格数(size - 输入长度)存入ebx,但后续对齐分支的逻辑完全偏离预期:
- 居中对齐时,
shr ebx,1计算出左侧应填充的空格数,但后续代码完全没有处理左侧空格的填充,仅在输入字符串后补了部分空格。 - 右对齐时,错误地将空格填充在输入字符串右侧,而非左侧;左对齐时则完全没有填充右侧的补位空格。
2. 对齐方向完全颠倒
右对齐(align=2)分支错误
右对齐要求输入字符串靠右侧,左侧补空格,但代码逻辑是:
- 错误地在输出起始位置提前设置终止符(随后被输入字符串覆盖)
- 将输入字符串从输出缓冲区起始位置开始复制
- 在输入字符串右侧填充空格
最终得到的是左对齐的结果(如Hello),而非预期的Hello。
左对齐(align=0)分支错误
左对齐要求输入字符串靠左侧,右侧补空格,但代码仅复制了输入字符串,未填充右侧的补位空格,且提前在output+空格数位置设置的终止符被输入字符串覆盖,最终输出长度远小于指定的size。
居中对齐(align=1)分支错误
居中对齐需要先填充左侧空格,再复制输入字符串,最后填充右侧剩余空格,但代码:
- 未处理左侧空格的填充
- 仅在输入字符串后填充了总空格数的一半(
shr ebx,1的结果),未处理剩余的1个空格(当总空格数为奇数时)
最终输出既不居中,长度也不达标。
3. 终止符处理错误
所有对齐分支中提前设置终止符的操作完全多余,且会被后续的字符串复制操作覆盖。正确的做法应该是在填充完所有空格和输入字符串后,在output[size-1]位置设置终止符(保证输出缓冲区的所有字节都被正确填充)。
内容的提问来源于stack exchange,提问作者Jakub Nevrlý
相关产品推荐
相关产品推荐

