AT&T Assembly获取用户数字字符串输入转整数相关问题咨询
x86 32位Linux汇编 数字字符串转整数实现方案
核心转换逻辑
ASCII编码中数字字符'0'到'9'对应的十进制值为48到57,转整数的核心规则如下:
- 初始化寄存器存储最终结果,初始值为0
- 逐位读取输入字符,直到遇到换行符
0xa终止 - 对每一位有效字符:
- 减去ASCII值
48(即0x30)得到当前位的数值 - 执行
结果 = 结果 * 10 + 当前位数值的运算,完成单步累计
- 减去ASCII值
- 遍历结束后,结果寄存器中存储的就是转换完成的整数
修改后完整代码(新增转换逻辑已加注释)
msg: .ascii "Insert a number:" .equ STDOUT,1 .equ WRITE,4 .equ EXIT,1 .equ STDIN,0 .equ READ,0 msg_end: .equ len, msg_end - msg .text .globl _start _start: movl $WRITE, %eax movl $STDOUT, %ebx movl $msg, %ecx movl $len, %edx int $0x80 movl $READ, %eax movl $STDIN, %ebx movl %esp, %ecx movl $6, %edx int $0x80 movl $1, %ecx # 输入长度计数器 _input: xor %ebx, %ebx movb (%esp), %bl inc %esp inc %ecx cmp $0xa, %ebx jne _input sub %ecx, %esp # 指针回到输入首字符 # 以下为新增字符串转整数逻辑 xor %eax, %eax # 初始化存储最终整数的寄存器,初始值为0 movl %esp, %esi # 用esi存输入字符串的起始指针 convert_loop: movzbl (%esi), %ebx # 读取当前字符到ebx,高位补0 cmp $0xa, %bl # 碰到换行符结束转换 je convert_done sub $0x30, %bl # ASCII转成单数字值 imul $10, %eax, %eax # 已有结果乘10 add %ebx, %eax # 加上当前位的数值 inc %esi # 指针移到下一个字符 jmp convert_loop convert_done: # 此时%eax中已经存储转换完成的整数,可按需使用 # 原有回显输入的逻辑 movl $WRITE, %eax movl $STDOUT, %ebx movl %ecx, %edx movl %esp, %ecx int $0x80 movl $EXIT, %eax int $0x80
补充说明
如果需要验证转换结果是否正确,可以在convert_done后新增整数转字符串打印的逻辑,或者通过gdb调试查看%eax寄存器的数值确认转换结果。
内容的提问来源于stack exchange,提问作者ASM student
相关产品推荐
相关产品推荐

