研究实验二

问题研究过程:

发问:C语言中的变量究竟是什么,通过下面的程序进行C语言中的变量的学习

图1  URL.EXE函数

为了研究main函数的首地址,我首先自作聪明的用了一条_DX=main,这样一条语句,希望通过debug中的G命令执行完程序。通过DX的值得到main 的地址。但很不幸的是,最终DX的值为0000,并没有得到相应的程序执行结果。于是发问:

为什么这个程序没有得到执行。那个G命令到底执行了什么?

基于目前对汇编语言的理解,在这里一定要用main这个符号吗,可不可以换成别的符号?来标识所谓的主程序?

于是打算通过单步执行来进一步仔细研究到底发生了什么:

图2  单步执行结果

然而出现了一堆无关的代码,此时并不清楚这些代码是什么,即CS:IP所指的位置并不知道有什么具体用处。研究了很长时间,但是还是没有想到用debug找出URL的main的地址。因此直接进入三

在程序之前补一句代码,如图:

图3  显示main的地址

得到结果:

图4  main 的偏移地址

即得到了main的偏移地址

此处继续发问:

  1. 书上所采用的单独写一个函数从原理上讲,并不合理,因为此处的main的地址非彼处的main的地址,没有道理认为两者就是同一个地址

然而事实是:两者的main确实是同一个标志!!!

用u cs:1fa查看,得到:

图5  显示结果

继续研究函数的本质:

图6  子程序调用程序清单

图7  子程序调用过程

可以发现,当执行f();的时候确实是通过call的方式,并且还可以看出,从本质上讲,计算机并不区分什么是主程序,什么是子程序,从汇编代码可以看出,main函数任然是一个被调用的子程序,并没有任何的特殊地位!!

通过研究发现:当把main换成其他标志时,进行编译连接的时候,会报错,于是推测,main是编译环境提供的一个标志,有其对应的固定地址。所以,在此回答上面体术的问题:main都是一样的,其表示的地址是一样的。

总结感悟:

通过实践得出的一个最重要的结论就是,c语言中所谓的函数其实本质就是子程序,即使是所谓的main()函数,也是如此。而且汇编语言中的寄存器就是C语言中的变量这一概念。不过这些概念在学习汇编和C语言的时候已经形成了,所以对于本次研究,感觉收获并不是很多。

C语言与汇编衔接1的更多相关文章

  1. arm:c语言和汇编混合编程

    仅作演示. 1.C和汇编可相互调用,汇编子函数格式参考 汇编:普通的函数调用的汇编代码解析 http://www.cnblogs.com/mylinux/p/4139972.html 本文演示了 : ...

  2. C语言ASM汇编内嵌语法

    转载:http://www.cnblogs.com/latifrons/archive/2009/09/17/1568198.html C语言ASM汇编内嵌语法 .3 GCC Inline ASM G ...

  3. C语言与汇编的嵌入式编程:求100以内素数

    写汇编之前,需要搞清楚C语言代码的写法,这里以最简单的算法举例说明 C代码如下: #include <stdio.h> void main(){ int i,j; ; ;i<=;i+ ...

  4. C语言ASM汇编内嵌语法【转】

    转自:http://www.cnblogs.com/latifrons/archive/2009/09/17/1568198.html GCC 支持在C/C++代码中嵌入汇编代码,这些汇编代码被称作G ...

  5. C语言调用汇编实现字符串对换

    1. 前面配置arm交叉编译环境. 2. 配置好qemu-arm C语言代码string-switch.c: #include <stdio.h> #include <stdlib. ...

  6. 《Linux内核分析》week1作业-分析一个简单c语言的汇编代码

    1.C语言源码 #include <stdio.h> int g(int x){ ; } int f(int x){ return g(x); } int main(){ )+; } 2. ...

  7. Keil 中关于C语言编译生成汇编代码函数名规则

    在keil 中 C语言的函数有带参数和不带参数之分. 一般的资料里说fun(void)类型的函数不带参数,所以,keil编译器生成的汇编的调用地址(函数名) 为fun.这没有错.事实上,不管C语言的函 ...

  8. C语言的本质(32)——C语言与汇编之C语言内联汇编

    用C写程序比直接用汇编写程序更简洁,可读性更好,但效率可能不如汇编程序,因为C程序毕竟要经由编译器生成汇编代码,尽管现代编译器的优化已经做得很好了,但还是不如手写的汇编代码.另外,有些平台相关的指令必 ...

  9. C语言的本质(30)——C语言与汇编之ELF文件格式

    ELF(Executable and Linking Format)文件格式是一个开放标准,各种UNIX系统的可执行文件都采用ELF格式,ELF是一种对象文件的格式,用于定义不同类型的对象文件(Obj ...

随机推荐

  1. Django知识补充

    目录 一.文件上传 二.Models补充 三.Django总结 一.文件上传 1.通过form表单或者通过From类上传 views.py from django.shortcuts import r ...

  2. [项目实践] 在项目实战中提升代码效率的的一次应用实践-----使用列表解析式输出当前android设备的CPU核数

    1.先按照初学者思维代码应该是这样的 #coding:utf-8 import os text = os.popen("adb shell command cat /proc/cpuinfo ...

  3. div放在li标签中,无法撑开li标签的问题

    作为一个前端菜鸟,我又碰到问题了,今天把div放到li标签中,发现div并没有把li标签撑开,而是在li标签边界之外,具体情况如下图所示: 那么,怎样才能达到预期的效果(每个li中放置一个div标签, ...

  4. Kafka设计原理

    一.入门 1.简介 Apache Kafka是一个分布式消息发布订阅系统.它最初由LinkedIn公司基于独特的设计实现为一个分布式的提交日志系统( a distributed commit log) ...

  5. Django的settings配置

    静态文件 STATIC_URL = '/static/' # 别名 STATICFILES_DIRS = [ os.path.join(BASE_DIR,'static'), os.path.join ...

  6. 从源码的角度分析List与Set的区别

    很多时候我们在讨论List与Set的异同点时都在说: 1.List.Set都实现了Collection接口 2.List是有序的,可以存储重复的元素,允许存入null 3.Set是无序的,不允许存储重 ...

  7. Spring Boot application starters

    https://docs.spring.io/spring-boot/docs/2.1.0.RELEASE/reference/htmlsingle/#using-boot-dependency-ma ...

  8. AirSim

    https://github.com/Microsoft/AirSim 功能 1 虚拟模拟 2半虚拟模拟 安装教程 环境安装 1安装 cmake 直接下 .exe 2安装cuda 3安装Eigen 3 ...

  9. 转载 【.NET基础】--委托、事件、线程(3)

      之前的两篇文章我们了解了委托和事件,本文我们看一下线程. 1,一个窗体程序,默认拥有一个线程(相当于一个商店里面,只有一个店员),这个默认的线程叫做 UI线程/主线程. 2,进程和线程的关系: A ...

  10. Rman将数据文件恢复到不同的路径

    RMAN> startup nomount connected to target database (not started)Oracle instance started Total Sys ...