C语言与汇编衔接1
研究实验二
问题研究过程:
发问: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的偏移地址
此处继续发问:
- 书上所采用的单独写一个函数从原理上讲,并不合理,因为此处的main的地址非彼处的main的地址,没有道理认为两者就是同一个地址
然而事实是:两者的main确实是同一个标志!!!
用u cs:1fa查看,得到:

图5 显示结果
继续研究函数的本质:

图6 子程序调用程序清单

图7 子程序调用过程
可以发现,当执行f();的时候确实是通过call的方式,并且还可以看出,从本质上讲,计算机并不区分什么是主程序,什么是子程序,从汇编代码可以看出,main函数任然是一个被调用的子程序,并没有任何的特殊地位!!
通过研究发现:当把main换成其他标志时,进行编译连接的时候,会报错,于是推测,main是编译环境提供的一个标志,有其对应的固定地址。所以,在此回答上面体术的问题:main都是一样的,其表示的地址是一样的。
总结感悟:
通过实践得出的一个最重要的结论就是,c语言中所谓的函数其实本质就是子程序,即使是所谓的main()函数,也是如此。而且汇编语言中的寄存器就是C语言中的变量这一概念。不过这些概念在学习汇编和C语言的时候已经形成了,所以对于本次研究,感觉收获并不是很多。
C语言与汇编衔接1的更多相关文章
- arm:c语言和汇编混合编程
仅作演示. 1.C和汇编可相互调用,汇编子函数格式参考 汇编:普通的函数调用的汇编代码解析 http://www.cnblogs.com/mylinux/p/4139972.html 本文演示了 : ...
- C语言ASM汇编内嵌语法
转载:http://www.cnblogs.com/latifrons/archive/2009/09/17/1568198.html C语言ASM汇编内嵌语法 .3 GCC Inline ASM G ...
- C语言与汇编的嵌入式编程:求100以内素数
写汇编之前,需要搞清楚C语言代码的写法,这里以最简单的算法举例说明 C代码如下: #include <stdio.h> void main(){ int i,j; ; ;i<=;i+ ...
- C语言ASM汇编内嵌语法【转】
转自:http://www.cnblogs.com/latifrons/archive/2009/09/17/1568198.html GCC 支持在C/C++代码中嵌入汇编代码,这些汇编代码被称作G ...
- C语言调用汇编实现字符串对换
1. 前面配置arm交叉编译环境. 2. 配置好qemu-arm C语言代码string-switch.c: #include <stdio.h> #include <stdlib. ...
- 《Linux内核分析》week1作业-分析一个简单c语言的汇编代码
1.C语言源码 #include <stdio.h> int g(int x){ ; } int f(int x){ return g(x); } int main(){ )+; } 2. ...
- Keil 中关于C语言编译生成汇编代码函数名规则
在keil 中 C语言的函数有带参数和不带参数之分. 一般的资料里说fun(void)类型的函数不带参数,所以,keil编译器生成的汇编的调用地址(函数名) 为fun.这没有错.事实上,不管C语言的函 ...
- C语言的本质(32)——C语言与汇编之C语言内联汇编
用C写程序比直接用汇编写程序更简洁,可读性更好,但效率可能不如汇编程序,因为C程序毕竟要经由编译器生成汇编代码,尽管现代编译器的优化已经做得很好了,但还是不如手写的汇编代码.另外,有些平台相关的指令必 ...
- C语言的本质(30)——C语言与汇编之ELF文件格式
ELF(Executable and Linking Format)文件格式是一个开放标准,各种UNIX系统的可执行文件都采用ELF格式,ELF是一种对象文件的格式,用于定义不同类型的对象文件(Obj ...
随机推荐
- 【Linux】磁盘的分区与命名规则
1,Startx:切换到图形界面 2,Pwd:查看当前目录 3,Whoami:查看当前用户 4,Cd: 1. 命令格式: cd [目录名] 2. 命令功能: 切换当前目录至dirNam ...
- nginx1.14的安装
编译安装nginx1.14.2 #拷贝指定文件到当前目录下[root@localhost ~]# find /usr/share -iname "*.jpg" -exec cp { ...
- [BZOJ 3829][POI2014] FarmCraft
先贴一波题面... 3829: [Poi2014]FarmCraft Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 421 Solved: 197[ ...
- Numbers
Encoding style, data structure, more content about the list, use the list as a stack, use the list a ...
- activiti获取可回退的节点
在处理流程回退时,需要获取某个节点当前可以回退到的节点,简单分析下: 1. 只支持回退到userTask. 2. 如果流程流转过某节点时生成了多个任务,从其中某一个任务回退到该节点后,不处理另外的任务 ...
- RelativeLayout 总结
1)参考元素获取:id: 2)位置关系设置: 3)对齐关系设置:
- Reflection 反射
版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/A__17/article/details/30571923 1.概念:所谓的反射.能够理解为在运行时 ...
- centos7下安装docker(9容器对资源的使用限制-内存)
一个docker Host上面会运行若干容器,每个容器都需要CPU,内存和IO资源.容器提供了控制分配多少CPU,内存给每个容器的机制,避免摸个容器因占用太多资源而影响其他 ...
- ORA-01031: insufficient privileges 错误解决
OS:linux redhat5.5 32bit 数据库:Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 1.问题描述:该数据库监 ...
- CGLIB 和 JDK生成动态代理类的区别(转)
文章转自http://luyuanliang.iteye.com/blog/1137292 AOP 使用的设计模式就是代理模式,是对IOC设计的补充.为了扩展性,往往会加上反射,动态生成字节码,生成代 ...