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

汇编调用scanf时将读取结果存入局部变量的实现问题

问题解答

  1. 首先可以明确:mov [ebp - 20], 0的写法完全不符合你的需求,这个指令的作用是把栈帧中ebp-20位置的内存赋值为0,相当于给局部数组x的首元素设为'\0',和给scanf传参没有任何关系。

  2. 你需要给scanf传入的是局部数组x的首地址:
    你之前通过sub esp, 20分配的20字节栈空间就是数组x的存储空间,它的首地址就是ebp - 20。32位x86环境下C语言默认用cdecl调用约定,参数从右向左压栈,scanf("%s", x)需要两个参数,右参数是x的地址,左参数是格式串地址,所以你空缺的位置只需要把ebp - 20这个地址压入栈即可。

两种常用写法都可以实现:

  • 写法1:直接压入地址
push offset formats
push ebp - 20
call scanf
add esp, 8 ; cdecl约定由调用者平衡栈,两个参数共8字节,调用后恢复栈指针
  • 写法2:先用lea取地址再压入(兼容性更好,部分汇编器要求这种写法)
push offset formats
lea eax, [ebp - 20]
push eax
call scanf
add esp, 8

补充注意点

你用的%s格式符不会做输入长度校验,建议改成%19s避免缓冲区溢出,刚好匹配你20字节的数组空间(留1字节存字符串终止符\0)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 10:54:03