汇编语言中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
相关产品推荐
相关产品推荐

