您的位置:首页 > 编程语言 > C语言/C++

汇编语言里面的内存管理和C语言之间的联系

2012-02-20 15:41 225 查看
 

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 dos float