当前位置:首页 > 内存 > 正文

c 内存管理(c语言内存管理开源软件)

  • 内存
  • 2024-06-08 20:59:54
  • 6089

一、汇编语言里面的内存管理和C语言里面怎么联系的。内存管理包括1)变量管理。除了全局变量和静态变量(那些在任何函数外部定义的变量,一般不会出现在C语言中,静态变量是带有static关键字的变量)这些变量在函数进入时创建,在函数退出时销毁。
2)函数调用,this也在栈上。
3)使用库函数动态分配内存。C库中的函数实际上是调用DOS函数,调用接口为int21H,函数号设置为AX。我不记得功能号了。详细内容请参阅相关技术指南。
对于1)和2),例如:
fu(intj)
{inti;}
如果调用fu(2),那么汇编代码大概是
push
pushdi
注意泛型函数调用不会保存所有寄存器
push2
将参数压入栈
callfu
调用子函数
movbpsp
保存堆栈指针
subsp2
sp是堆栈指针,堆栈向后增长,即从高位向低位增长。这个操作必须为变量i留出空间
movspbp
重置堆栈指针
ret2
这个函数的参数占用两个字节,ret2进行了这个修正。
这通常是它的样子。汇编语言也有内存分配的指令,这个指令分配的内存和C语言中的全局变量或者静态变量是一样的
我建议你看一下C语言是如何编译成的。大会。如果是VC,按ctr键+功能,或者ATL+功能键,我不记得你一一尝试了,你会看到C语言对应的汇编语言,如果是TC,你可以找到。程序TCC位于其目录中并使用TCC/?看来TCC-S目标文件可以将目标文件编译成汇编语言
intmain(void)
{
longi,j,k;
floatfa,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);
*/
}
Turboc生成的汇编代码
_mainprocnearnear代表本地进程
pushbp保存bp,因为bp有时被用作普通变量
movbp,sp保存sp,如上所述
subsp,20allocate局部变量
;?debugL8
movwordptr[bp-18],0注意局部变量是用[bp-18]表示的,所以一定要保存刚才输入的原因sp
movwordptr[bp-20],0
jmpshort@5
@4:
;?debugL10
movwordptr[bp-14],0
movwordptr[bp-16],132
;?debugL11
movdx,wordptr[bp-14]
movax,wordptr[bp-16]
xorcx,cx
movbx,10000
pushcs
callnearptrLXMUL@
movwordptr[bp-10],dx
movwordptr[bp-12],ax
;?debugL12
movdx,wordptr[bp-10]
movax,wordptr[bp-12]
addwordptr[bp-16],ax
adcwordptr[bp-14],dx
@3:
addwordptr[bp-20],1
adcwordptr[bp-18],0
@5:
cmpwordptr[bp-18],1525
jl@4
jne@10
cmpwordptr[bp-20],-7936
jb@4
@10:
@2:
movdx,17156
movax,21037
movwordptr[bp-6],dx
movwordptr[bp-8],ax
;?debugL24
FLDdwordptr[bp-8]
FMULqwordptrDGROUP:s@
FSTPdwordptr[bp-4]
FWAIT
;?debugL25
FLDdwordptr[bp-8]
FLDdwordptr[bp-4]
FADD
FSTPdwordptr[bp-8]
FWAIT
@7:
addwordptr[bp-20],1
adcwordptr[bp-18],0
@9:
cmpwordptr[bp-18],1525
jl@8
jne@11
cmpwordptr[bp-20],-7936
jb@8
这个例子没有显示函数调用,我发现