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

汇编语言中scanf读取int失败,读取string正常求助

问题分析与解决

嘿,我一眼就揪出你代码里的问题啦!你把读字符串的逻辑直接照搬来读整数,可这俩的调用逻辑完全不一样,自然会失败。咱们一步步拆解:

核心错误点

1. scanf读整数的参数类型不匹配

当用%i格式符调用scanf时,它需要的是**int类型变量的地址**(也就是int*),用来存储读取到的整数值。但你现在传的是$intBuffer——一个字符数组的地址,scanf会把整数以二进制形式存在这里,而非字符串那样存ASCII码,这直接和后续的输出逻辑脱节了。

2. printf输出整数的参数错误

用%i格式符调用printf时,需要传入的是整数的值,但你push的是$intBuffer(数组的内存地址),这相当于把地址当成整数输出,完全不是你想要的输入值。

修正后的代码

咱们调整变量定义和调用逻辑,让参数类型完全匹配:

.data
intFormat: .string "%i"
.bss
intVar: .space 4  ; 定义4字节的int变量,专门存储整数值
.text
.globl main
main:
# 获取输入:scanf("%i", &intVar)
push $intVar       ; 传入int变量的地址(scanf要求int*类型)
push $intFormat
call scanf
add $8, %esp       ; 清理栈空间,避免后续操作出问题(推荐加上)

# 输出结果:printf("%i", intVar)
mov intVar, %eax   ; 把intVar里的整数值加载到寄存器
push %eax          ; 传入整数的实际值
push $intFormat
call printf
add $8, %esp

# 退出程序
pushl $0
call exit

为什么字符串代码能正常运行?

因为%s格式符对scanf和printf的要求是统一的:都需要传入字符数组的地址——scanf用它存ASCII字符串,printf用它读取字符串内容,所以你的字符串代码逻辑完全匹配,自然能正常工作。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:25:09