计算机内存或文件系统中的文件都只不过是一维二进制数组及其对应的二进制地址。所以在计算机的世界里没有乱码,乱码是人类世界的概念。

栈中的变量通常包括:

  • 函数参数
  • 函数体内声明的局部变量(或叫临时变量)
  • 返回值保存在寄存器(eax)中

栈中的变量(参数、局部变量)退出其作用域时,没有一个动作、一段逻辑或代码去释放栈中变量占据的内存,仅仅是没人再去例会当前栈顶上方的若干遗留(历史数据、垃圾值)下来可被后续压栈操作覆盖的无用数据而已。(所以,函数调用结束,释放堆栈的说法是不准确的,仅仅是移动栈顶指针,包括磁盘上删除文件,是释放内存吗,也不是,仅仅是其占据的内存重新标识为可写而已)。

vs 环境的配置

新建 win32 应用程序的空项目完成之后,需要作如下设置,以使 vs 这个 ide 不为我们做更多额外的动作,我们才可看到最原汁原味的 C 语言对应的反汇编代码:

  • (0)Debug 而非 Release 模式
  • (1)项目 ⇒ 属性 ⇒ 配置属性 ⇒ C/C++ ⇒ 预编译头 、预编译头:不使用预编译头
  • (2)项目 ⇒ 属性 ⇒ 配置属性 ⇒ C/C++ ⇒ 代码生成、基本运行时检查:默认值
  • (3)项目 ⇒ 属性 ⇒ 配置属性 ⇒ 链接器 ⇒ 高级 ⇒ 随机基址:否

编写如下代码:

int gv = 3;
int func1(int p1, int p2){return p1 + p2;
}
int main(){int lv = 4;gv = func1(lv, 2);return 0;
}

进入汇编代码阅读环境

以下快捷键(vs2013)会随着 vs 版本的不同而有所区别。

  • (1)F11:进入调试环境,以及执行单步的动作
  • (2)Ctrl + Alt + D:debug,反汇编窗口
  • (3)Ctrl + Alt + G:寄存器窗口
  • (4)Ctrl + Alt + M +1/2:分别为内存 1 窗口,和内存 2 窗口

这些都可在调试状态(按下 F11)下,菜单栏 ⇒ 调试 ⇒ 内存(寄存器、反汇编)等看到。

一些简单的结论

当单步到:

int lv = 4;
00411289 C7 45 FC 04 00 00 00 mov         dword ptr [lv],4  

会看到常量 4 其实占据着从 0041128C 开始的四字节的内存,并非谣传的常量不占内存。

C 语言指针与汇编地址(一)相关推荐

  1. c语言 指针不能赋值吗,程序员编程C语言指针答疑:指针赋值没那么简单

    C语言指针,纸老虎 一.程序员编程C语言答疑合集 更多C语言学习答疑文章,请参阅:程序员编程C语言答疑文章合集 也可以加入下方我的"C语言答疑课堂"圈子,第一时间看到我给大家带来的 ...

  2. C语言编程拼错的纸条,程序员编程C语言指针答疑:小心scanf函数给指针输错值...

    一.程序员编程C语言答疑合集 https://m.toutiaocdn.com/group/6718545102257521166/?app=news_article&timestamp=15 ...

  3. c语言指针的地址存放,c语言 - *指针 和 地址

    最近在研究oc的底层,全是c/c++的代码,虽然以前学过也写过,其实不怎么用都忘得差不多了. 首先我们来了解一下 * 和 &这两个符号 通俗点儿理解其实&地址就是就是一个存放地址的变量 ...

  4. C语言指针值传递和地址传递

    C语言传参分为值传传递和地址传递.C语言指针传参时,可以通过指针引用方式改变指针指向的值.改变变量,可以使用指针应用方式,改变地址,使用指针的指针引用方式. C语言值传递: 形参是实参的拷贝,改变形参 ...

  5. 对指针变量取地址_C语言指针简介(amp;和*运算符)

    取地址符(&) 和  取值符(*) (1)& 运算符 :用于取一个对象的地址 例如:int *p;    p = &c;    将c的地址赋值给指针变量p,我们称p为 &quo ...

  6. C语言之指针本身地址与指针向的地址(四十四)

     栗子一:int**与int* #include <stdio.h>void main(){int a =8;int *p1 = &a;int **p2 = p1;//二级指针p2 ...

  7. C语言关于传入子函数的指针形参的地址改变

    这个问题是在学习链表时遇到的,在做实验二的过程中想要实现插入(或删除)操作时,我们会调用子函数传入首元结点地址作为指针形参,通过一系列变化(一般是循环)找到待处理结点后进行相应处理. 我们总能轻易地改 ...

  8. 64位程序怎么判断指针是否有效_C 语言指针怎么理解?

    注: 看完这篇一定会让你理解透彻指针的本质 是的,这一篇的文章主题是「指针与内存模型」 说到指针,就不可能脱离开内存,学会指针的人分为两种,一种是不了解内存模型,另外一种则是了解. 不了解的对指针的理 ...

  9. char类型怎么输入 c语言_还没搞懂C语言指针?这里有最详细的纯干货讲解(附代码)...

    21ic综合自网络信息 指针对于C来说太重要.然而,想要全面理解指针,除了要对C语言有熟练的掌握外,还要有计算机硬件以及操作系统等方方面面的基本知识.所以本文尽可能的通过一篇文章完全讲解指针. 为什么 ...

最新文章

  1. 如何在ALV中输出标题头
  2. python基础学习笔记——方法返回值
  3. 手摇泵PHP一32_节能手摇泵的制作方法
  4. 开源纯C#工控网关+组态软件(七)数据采集与归档
  5. 谈谈Java虚拟机——Class文件结构
  6. linux抹掉所有分区,找到了linux分区顺序错乱修复方法
  7. 设计模式--策略模式(strategy)
  8. 【POJ1442】Black Box
  9. 已知a/b,求c的位置
  10. 第六天:对项目后端日志存储
  11. Edge浏览器启用ie模式,并且打开调试面板
  12. Ubuntu 修改鼠标中键功能
  13. 计算机系统中的数据计量单位-位(bit)、字节(Byte)、字(word)
  14. php 读取 eml,php如何读取解析eml文件以及生成网页的示例分享
  15. mysql server has gone away_mysql server has gone away的解决方法
  16. 从杉数到滴滴——未入门算法工程师工作日记(快手篇)
  17. 阐述清楚浮动的几种方法
  18. 产业安全专家谈|金融行业如何践行《反电信网络诈骗法》?
  19. 3D数学读书笔记——笛卡尔坐标系统
  20. cpuz测试分数天梯图_I7 3930K 不同频率下性能测试(CPUZ分数、功耗、游戏实测)

热门文章

  1. 数据处理——数据编码
  2. linux部署多个jar 会宕机_我常用的自动化部署技巧,贼好用,推荐给大家!
  3. Hive数据倾斜及处理
  4. Linux下安装ActiveMQ(CentOS7)
  5. 面包屑php源码,自己写的面包屑导航
  6. 将n划分成最大数不超过m的划分数
  7. CUDA精进之路(三):图像处理——图像灰度化、灰度直方图统计
  8. MYSQL C API风格demo
  9. 电脑操作精典密笈60式
  10. matplotlib使用参考地址