从汇编来看c语言】的更多相关文章

一.基础研究 将下面的程序编译连接,用debug加载: 首先执行第一条语句: 发现p=(unsigned char *)0x1000;在这里是把1000赋给一个偏移地址为01af.大小为两字节的内存空间.1000是一个值,这里将它强制转换成unsigned char *型的数据,否则赋给p会因为类型不同而出错.我们知道char型数据应该为1字节,那么为什么这里的数据大小为2字节呢?其实这里的1000是指针p的值,而我们定义的char是*p的值的大小,所以p的大小是两个字节,这个是由什么决定的呢?…
1.基础研究 对如图程序进行编译连接,再用debug加载. 我们在偏移地址1fa处查看main函数的内容: 执行到1fd处,发现n的偏移地址为01a6,段地址存储在ds寄存器里,为07c4. 再查看函数f2: 参数a.b的值是用栈来传递的,它们的段地址都存放在ss寄存器中: 局部变量c的值在这里是用si寄存器存储的,因为c正好是int型,那么子函数里定义的局部变量是用寄存器存储吗?我们在这里加一条赋值语句看看会如何: 可见,局部变量d是放在栈里的,而c是放在寄存器si里的,只是函数要将c返回,就…
一. 学习过程 从C语言的角度提出一些问题,这些问题再从汇编的角度考虑,还真的很有意思. (1) 我们用高级语言编程时,一般不可能不用到变量,但是一定要用到变量吗?还有这些变量从汇编的角度是怎么实现的呢?毕竟寄存器和内存空间是不可能存储一个变化的值的,要改变寄存器和内存空间的值,只有重新赋值.但是原来老师讲过,变量的声明是给变量名开辟一个固定大小的内存空间,所以声明变量时一定要给定变量类型.如果不用变量的话,可以给每次要用到的参数重新赋值,但这样就不能用循环等结构,会造成代码重复冗长. (2) …
上一篇分析了c语言的函数调用栈情况,知道了c语言的函数调用机制后,我们来看一下,linux0.11中起动部分的代码是如何从汇编跳入c语言函数的.在LINUX 0.11中的head.s文件中会看到如下一段代码(linux0.11的启动分析部分会在另一部分中再分析,由于此文仅涉及c与汇编代码的问题,). after_page_tables: pushl $ # These are the parameters to main :-) pushl $ pushl $ pushl $L6 # retur…
为什么汇编程序的入口是_start,而C程序的入口是main函数呢?以下就来解释这个问题 在<x86汇编程序基础(AT&T语法)>一文中我们汇编和链接的步骤是: $ as hello.s -o hello.o $ ld hello.o -o hello 我们用gcc main.c -o main开编译一个c程序,其实际分为三个步骤:编译.汇编.链接 $ gcc -S main.c 生成汇编代码 $ gcc -c main.s 生成目标文件 $ gcc main.o 生成可执行文件 我们…
最近,在用keil 写一个小程序时,想实践一下从汇编调用 C语言函数,我们都知道C语言调用汇编函数讨论得较多,但反过来,从汇编中调用C语言的函数未见深入分析:在开始的时候,还是忽视了一个问题,就是对现场的保护和还原,以导于程序跑飞. 下面的一个小的测试用例,主要作用是:从C语言程序中调用一个用汇编写的名为int LEDFLASH(int a, int b).并从该汇编函数中,反过来调言用C语言实现的delay()延时程序.最后的结果是:由P2口控制的LED灯出现闪烁的现象.    C语言源程序所…
事情的经过是这种,博主在用C写一个简单的业务时使用递归,因为粗心而忘了写return.结果发现返回的结果依旧是正确的.经过半小时的反汇编调试.证明了我的猜想,如今在博客里分享.也是对C语言编译原理的一次加深理解. 引子: 首先我想以一道题目引例,比較能体现出问题. 例1: #include <stdio.h> /** 函数功能:用递归实现位运算加法 */ int Add_Recursion(int a,int b) { int carry_num = 0, add_num = 0; if (b…
学习C++的过程中一直有懂一点和迷糊的情绪伴随. 这几天在学习C++的变量定义.变量声明.数据类型等等.很多时候,跟我想的内容不一样.经常是,只知道这个东西是这样子的.却不知道,这个东西能在程序中有什么功能,这个东西是怎么实现这个功能的.一直很迷糊,搞得自己一会儿就陷入死胡同了.没了学习的动力. 刚才中途停下来,看看计算机(个人觉得,还是计算机这个词语能够最贴切地描述computer.电脑这个词,有点不够格.)的控制史.以,机器语言,汇编语言,C语言,C++语言为线,清理了一下顺序. 一开始,我…
汇编实现的从小到大的冒泡排序 主函数由C语言实现,sort函数用汇编语言写 #include <stdio.h>  int buffer[256];      //数据缓冲区  int  bufferlen=0;     //数据缓冲区数据个数 extern sort(int *buffer,int bufferlen);    //汇编函数sort接口 //********从键盘录入数据******** int InputDataFromKeyBoard(int *pBuffer) {  …
用C写程序比直接用汇编写程序更简洁,可读性更好,但效率可能不如汇编程序,因为C程序毕竟要经由编译器生成汇编代码,尽管现代编译器的优化已经做得很好了,但还是不如手写的汇编代码.另外,有些平台相关的指令必须手写,在C语言中没有等价的语法,因为C语言的语法和概念是对各种平台的抽象,而各种平台特有的一些东西就不会在C语言中出现了,例如x86是端口I/O,而C语言就没有这个概念,所以in/out指令必须用汇编来写. C语言简洁易读,容易组织规模较大的代码,而汇编效率高,而且写一些特殊指令必须用汇编,为了把…