汇编调用scanf时将读取结果存入局部变量的实现问题
问题解答
首先可以明确:
mov [ebp - 20], 0的写法完全不符合你的需求,这个指令的作用是把栈帧中ebp-20位置的内存赋值为0,相当于给局部数组x的首元素设为'\0',和给scanf传参没有任何关系。你需要给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
相关产品推荐
相关产品推荐

