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

 
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

这个例子没有展示函数调用,我碰巧找到的
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值