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

AT&T Assembly获取用户数字字符串输入转整数相关问题咨询

x86 32位Linux汇编 数字字符串转整数实现方案

核心转换逻辑

ASCII编码中数字字符'0'到'9'对应的十进制值为48到57,转整数的核心规则如下:

  • 初始化寄存器存储最终结果,初始值为0
  • 逐位读取输入字符,直到遇到换行符0xa终止
  • 对每一位有效字符:
    • 减去ASCII值48(即0x30)得到当前位的数值
    • 执行结果 = 结果 * 10 + 当前位数值的运算,完成单步累计
  • 遍历结束后,结果寄存器中存储的就是转换完成的整数

修改后完整代码(新增转换逻辑已加注释)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.08 23:27:01