汇编语言里面的内存管理和C语言之间的联系
2012-02-20 15:41
281 查看
C的内存管理有 1)变量管理。除了全局变量和静态变量(那些定义在任何函数以外的变量,一般C语言中不出现,静态变量是有static关键字的变量)是在堆栈中管理的,进入函数创建这些变量,退出函数就销毁了。 2)函数调用,这个也是在堆栈中。 3)用库函数动态分配的内存。C库里的函数实际上是调用DOS 功能,调用接口是int 21H,功能号放在AX里。功能号我记不清了。具体参见相关技术指南。 对于1)和2),举个例子: fu(int j) { int i;} 如果调用fu(2),那么汇编代码大概是 push si push di 注意,一般函数调用不保存所有寄存器 push 2 调用参数入堆栈 call fu 调用子函数 mov bp sp 把堆栈指针保存一下 sub sp 2 sp是堆栈指针,堆栈是倒着来的,也就是从高位到低位增长。这个操作是为了给fu的变量i留出空间 mov sp bp 恢复堆栈指针 ret 2 这个函数的参数占了两个字节,ret 2 就是做这个修正的。 大体上就是这个样子。汇编语言也有内存分配指令,这个指令分配的内存跟C语言里全局变量或者静态变量是一样的。 建议你看一下C语言编译成汇编语言的样子。如果是VC,你按ctr+功能键,或者ATL+功能键,具体哪个记不清了,你一个一个试试吧,就能看到C语言对应的汇编语言。如果是TC的话,你在它的目录下找TCC这个程序,用TCC /? 看一下怎么用。好像是 TCC 目标文件 -S 就能将目标文件编译成汇编语言 int main(void) { long i, j, k; float fa, fb; /* t = GetTickCount(); */ for (i = 0; i < 100000000; i++) { j = 132; k = j * 10000; j += k; } /* t = GetTickCount() - t; printf("%ld %ld\n", i, t); t = GetTickCount(); */ for (i = 0; i < 100000000; i++) { fa = 132.321; fb = fa * 10000.123; fa += fb; } /* t = GetTickCount() - t; printf("%ld %ld\n", i, t); */ } turbo c 生成的汇编代码 _main proc near near 表示本地过程 push bp 保存一下bp,因为bp有时被用作普通变量 mov bp,sp 保存sp,上面说过的 sub sp,20 分配本地变量 ; ?debug L 8 mov word ptr [bp-18],0 注意看了,本地变量是用[bp-18]表示的,这也是为什么要保存刚进入的sp的原因 mov word ptr [bp-20],0 jmp short @5 @4: ; ?debug L 10 mov word ptr [bp-14],0 mov word ptr [bp-16],132 ; ?debug L 11 mov dx,word ptr [bp-14] mov ax,word ptr [bp-16] xor cx,cx mov bx,10000 push cs call near ptr LXMUL@ mov word ptr [bp-10],dx mov word ptr [bp-12],ax ; ?debug L 12 mov dx,word ptr [bp-10] mov ax,word ptr [bp-12] add word ptr [bp-16],ax adc word ptr [bp-14],dx @3: add word ptr [bp-20],1 adc word ptr [bp-18],0 @5: cmp word ptr [bp-18],1525 jl @4 jne @10 cmp word ptr [bp-20],-7936 jb @4 @10: @2: ; ?debug L 21 mov word ptr [bp-18],0 mov word ptr [bp-20],0 jmp short @9 @8: ; ?debug L 23 mov dx,17156 mov ax,21037 mov word ptr [bp-6],dx mov word ptr [bp-8],ax ; ?debug L 24 FLD dword ptr [bp-8] FMUL qword ptr DGROUP:s@ FSTP dword ptr [bp-4] FWAIT ; ?debug L 25 FLD dword ptr [bp-8] FLD dword ptr [bp-4] FADD FSTP dword ptr [bp-8] FWAIT @7: add word ptr [bp-20],1 adc word ptr [bp-18],0 @9: cmp word ptr [bp-18],1525 jl @8 jne @11 cmp word ptr [bp-20],-7936 jb @8 这个例子没有展示函数调用,我碰巧找到的
相关文章推荐
- 从汇编语言看C语言的内存管理
- 《从汇编语言到Windows内核编程》学习笔记 (第一章 汇编指令与C语言)
- c语言与汇编语言混编注意事项及参数传递方法
- windows下32位汇编语言学习笔记 第十章 内存管理部分 1
- 为何C语言(的函数调用)需要堆栈,而汇编语言却不需要堆栈
- ARM中ADS环境下C语言和汇编语言混合编程及示例
- 用汇编语言对INS8250串行接口芯片编程,实现两台微机之间的全双工异步串行通信
- 《从汇编语言到Windows内核编程》学习笔记 (第一章 汇编指令与C语言)
- 在C语言中嵌入汇编语言方法
- c语言转汇编语言shell脚本
- C语言和go语言之间的交互 - C语言中使用go语言,使用的go语言又使用了c语言
- windows下32位汇编语言学习笔记 第十章 内存管理部分 2
- 为何C语言(的函数调用)需要堆栈,而汇编语言却不需要堆栈
- ARM基础:为何C语言(的函数调用)需要堆栈,而汇编语言却不需要堆栈
- C语言和汇编语言开发单片机
- STC51单片机自学经验分享 新手学习51单片机用汇编语言还是C语言
- 汇编语言的寻址方式与C语言中的指针是一个东西。
- 浅谈单片机中C语言与汇编语言的转换
- 从汇编语言写到c语言
- 为何C语言(的函数调用)需要堆栈,而汇编语言不需要