GCC环境下汇编语言如何逐个读取字符串中的单个值?
实现GCC汇编循环读取输入字符(类似C的getchar())
要实现循环逐个读取输入字符,核心是用循环结构配合系统调用,每次读取一个字符后做判断:是有效字符(0/1)就处理,是换行就结束,否则报错退出。以下是修改后的完整代码:
.section .data input_prompt: .asciz "Enter a string of 0s and 1s: " invalid_message: .asciz "Invalid input: program terminating\n" newline: .byte 10 state: .int 0 # initial state (EE) .section .bss input: .byte 0 .section .text .globl main main: # Print the input prompt movl $4, %eax # syscall: write movl $1, %ebx # file descriptor: stdout lea input_prompt, %ecx # 提示字符串 movl $29, %edx # 字符串长度 int $0x80 # 调用系统调用 # 循环读取字符的入口 read_loop: # 读取单个字符 movl $3, %eax # syscall: read movl $0, %ebx # file descriptor: stdin lea input, %ecx # 存储输入的缓冲区 movl $1, %edx # 每次读1个字节 int $0x80 # 调用系统调用 # 判断read的返回值:如果返回<=0,说明EOF或错误,直接退出 cmpl $0, %eax jle exit_program # 取出读取的字符,判断是不是换行(ASCII 10) movb input, %al cmpb $10, %al je exit_program # 是换行就结束循环 # 判断是不是'0'(ASCII 48)或'1'(ASCII 49) cmpb $48, %al je valid_char cmpb $49, %al je valid_char # 走到这里说明是无效字符,打印错误信息 movl $4, %eax movl $1, %ebx lea invalid_message, %ecx movl $34, %edx # 错误信息长度 int $0x80 jmp exit_program # 报错后退出 valid_char: # 这里可以添加对有效字符的处理逻辑,比如打印、存储等 # 示例:把当前字符打印出来 movl $4, %eax movl $1, %ebx lea input, %ecx movl $1, %edx int $0x80 # 回到循环开头,继续读下一个字符 jmp read_loop exit_program: # 退出程序的系统调用 movl $1, %eax # syscall: exit movl $0, %ebx # 退出码0 int $0x80
关键修改点说明:
- 循环结构:用
read_loop标签标记循环入口,每次读完字符后通过jmp read_loop回到开头,实现循环读取。 - 输入判断:
- 先检查
read系统调用的返回值:如果返回值≤0,说明读到EOF或出错,直接退出。 - 判断字符是否为换行(ASCII 10),是则结束输入。
- 判断字符是否为'0'或'1',有效则进入处理逻辑,无效则打印错误信息并退出。
- 先检查
- 系统调用细节:每次
read只读取1个字节,和C的getchar()逻辑一致,逐个获取输入流中的字符。
内容的提问来源于stack exchange,提问作者Erique
相关产品推荐
相关产品推荐

