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下chkconfig设置MySql自动启动
1.将服务文件拷贝到init.d下,并重命名为mysql cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysql 2.赋予可执 ...
- Django框架的使用教程--类视图-中间间-模板[六]
类视图 类视图的使用 视图函数 class class_view(View): """类视图""" def get(self, reques ...
- 第 16 章 C 预处理器和 C 库(预定义宏)
/*------------------------------------- predef.c -- 预定义宏和预定义标识符 ------------------------------------ ...
- 删除排序数组中的重复项的golang实现
给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度. 不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成. 给定数组 ...
- bootstrap-datepicker default value
$('.selectDate').datepicker({ format : "yyyy/mm/dd", autoclose : true, startDate : new Dat ...
- UVA1600-Patrol Robot(BFS进阶)
Problem UVA1600-Patrol Robot Accept:529 Submit:4330 Time Limit: 3000 mSec Problem Description A rob ...
- D - C Looooops POJ - 2115 欧几里德拓展
题意:就是看看for(; ;)多久停止. 最让我蛋疼的是1L和1LL的区别!让我足足wa了12发! 1L 是long类型的, 1LL为long long类型的! 思路: 这就是欧几里德扩展的标准式子了 ...
- WebSockets通信
WebSockets通信 1. websocket是什么?WebSocket是一种网络通信协议.2. 为什么需要websocket?我们有http协议,为什么还需要websocket协议呢?因为htt ...
- Tarjan学习笔记
\(Tarjan\)是个很神奇的算法. 给一张有向图,将其分解成强连通分量们. 强连通分量的定义:一个点集,使得里面的点两两可以互相到达,并且再加上另一个点都无法满足强连通性. \(Tarjan\)的 ...
- Luogu P1962 斐波那契数列(矩阵乘法模板)
传送门(其实就是求斐波那契数列....) 累了 明天再解释 做这道题需要一些关于矩阵乘法的基础知识. 1. 矩阵乘法的基础运算 只有当矩阵A的列数等于矩阵B的行数时,A与B可以相乘(A的行数不一定等于 ...