答案:内存管理有
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
这个例子没有展示函数调用,我碰巧找到的
上一个:再用keil软件编译汇编语言时为什么总出现 file has been changed outside the eit
下一个:汇编语言程序1一直加到200