汇编解决的第一个小问题
来源:互联网 发布:电脑故障修复软件 编辑:程序博客网 时间:2024/05/22 20:28
一朝掌握汇编语言,终生理解计算机系统。--题记现在计算机发展及其迅速,我们能学可学的东西很多,汇编语言已经不再像以前那样必要,但是底层的东西变化却很慢,学习以下我觉得是不吃亏的,尤其是以后立志走C/C++ 路线的程序员。一句话:我学的就是情怀!昨天学妹问我一个问题,很简单。是这样的。#include<stdio.h>int main(){ char a; short b; scanf("%c",&a); scanf("%d",&b); printf("%c %d \n",a,b);}为什么这里的a 变量不能打印。现在我们逐层分析:相信C语法不错的同学都能看到%d 和 short 不对等,语法不对,确实是这样。可是为什么这样?这就需要了解变参函数知识了,变参函数中参数不对等,对很靠近答案了。但是明明是b错了,但是为什么是a有问题?我们看看汇编代码:.file"tt.c".section.rodata.LC0:.string"%c".LC1:.string"%hd".LC2:.string"%c %d \n".text.globlmain.typemain, @functionmain:.LFB0:.cfi_startprocpushq%rbp.cfi_def_cfa_offset 16.cfi_offset 6, -16movq%rsp, %rbp.cfi_def_cfa_register 6subq$16, %rspleaq-1(%rbp), %raxmovq%rax, %rsimovl$.LC0, %edimovl$0, %eaxcall__isoc99_scanfleaq-4(%rbp), %raxmovq%rax, %rsimovl$.LC1, %edimovl$0, %eaxcall__isoc99_scanfmovzwl-4(%rbp), %eaxmovswl%ax, %edxmovzbl-1(%rbp), %eaxmovsbl%al, %eaxmovl%eax, %esimovl$.LC2, %edimovl$0, %eaxcallprintfleave.cfi_def_cfa 7, 8ret.cfi_endproc.LFE0:.sizemain, .-main.ident"GCC: (GNU) 4.9.2 20150212 (Red Hat 4.9.2-6)".section.note.GNU-stack,"",@progbits我们可以看到,edi 寄存器保存的是变参。当我们使用"%d"接收参数的时候,想当于直接给存放b的寄存器强制放了4字节内容,我们知道程序在运行时是以栈的形式存储变量的,所以4字节的b强行符覆盖到了a.所以变量a 的内容被改变了。
查看原文:http://zmrlinux.com/2016/05/30/%e6%b1%87%e7%bc%96%e8%a7%a3%e5%86%b3%e7%9a%84%e7%ac%ac%e4%b8%80%e4%b8%aa%e5%b0%8f%e9%97%ae%e9%a2%98/
0 0
- 汇编解决的第一个小问题
- 终于写成自己的第一个线性汇编小程序
- 第一个8086汇编小程序
- 编写第一个javascript的XPCOM,以及一些小问题的解决。
- 解决的第一个小小的问题
- 汇编学习笔记,第一个编译错误的问题
- 自己解决的第一个java问题
- php第一个解决的问题
- 我的第一个汇编
- Python小白第一个小程序出现的问题
- 解决个小问题
- 第一个小问题waitkey()
- 解决了第一个问题
- ejb的问题(我第一个小作业)
- 第一个servlet小程序可能遇到的问题
- selenium第一个小程序遇到的问题
- 第一个python小程序出现的问题
- 第一个velocity碰到的问题及解决
- 时间类
- oracle不等于号取不到null值
- Geekband C++面向对象高级编程(下) 第一周笔记 暗影行者
- 最全电商分类信息(03)
- 修改电脑ip为固定ip不能上网
- 汇编解决的第一个小问题
- 使用jQuery插件flexigrid搭建项目框架
- c++单例模板
- 最全电商分类信息(04)
- iOS CGContextRef的使用
- redhat linux安装jdk1.8
- Python爬虫学习系列
- Android SDK,ADT,以及API的理解
- FTP远程文件传输,无法上传,解决