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 ...
随机推荐
- Centos7下gogs数据配置迁移
工作需要把测试版的gogs迁移到正式版gogs,顺便记下笔记防止以后需要忘记了 环境: centos7测试版gogs:192.168.1.63 centos7正式版gogs:192.168.0.100 ...
- Navicat连接Oracle的几个问题及解决方案
1.用Navicat连接Oracle数据库时报错ORA-28547:connection to server failed,probable Oracle Net admin error 解决方案: ...
- nginx服务器开启缓存、反向代理
一.反向代理配置 1.反向代理服务器配置如下 反向代理就是需要这一行proxy_pass来完成.当我们要访问后端web服务器的时候,我们只需要访问代理服务器就可以了,此时代理服务器就充当后端web服务 ...
- mysql中case的一个例子
最近遇到一个问题: year amount num 1991 1 1.1 1991 2 1.2 1991 3 1.3 1992 1 2.1 1992 2 2.2 1992 3 3.3 把上面表格的数据 ...
- 1024. Video Stitching
//使用java dfs public int videoStitching(int[][] clips, int T) { //bfs Queue<Integer> queue = ne ...
- (16)Python练习题
练习题一: 练习题二:
- 【Lucene4.8教程之中的一个】使用Lucene4.8进行索引及搜索的基本操作
版权声明:本文为博主原创文章.转载请注明来自http://blog.csdn.net/jediael_lu/ https://blog.csdn.net/jediael_lu/article/deta ...
- js常见错误类型
(1)SyntaxError SyntaxError是解析代码时发生的语法错误 // 变量名错误 var 1a; // 缺少括号 console.log 'hello'); (2)ReferenceE ...
- 移动App测试实战—专项测试
我们在进行了手工的功能测试之后,也开发了一些自动化测试用例,并且做了性能测试之后,测试工作看似比较完整了.但是当我们的App在大量的用户那里被安装和使用的时候,还是会有很多我们之前没有预料的问题 ...
- PAT A1118 Birds in Forest (25 分)——并查集
Some scientists took pictures of thousands of birds in a forest. Assume that all the birds appear in ...