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

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回到开头,实现循环读取。
  • 输入判断:
    1. 先检查read系统调用的返回值:如果返回值≤0,说明读到EOF或出错,直接退出。
    2. 判断字符是否为换行(ASCII 10),是则结束输入。
    3. 判断字符是否为'0'或'1',有效则进入处理逻辑,无效则打印错误信息并退出。
  • 系统调用细节:每次read只读取1个字节,和C的getchar()逻辑一致,逐个获取输入流中的字符。

内容的提问来源于stack exchange,提问作者Erique

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 06:35:20