当前位置:编程问答 > 汇编语言 >

汇编语言里面的内存管理和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 这个例子没有展示函数调用,我碰巧找到的

上一个:再用keil软件编译汇编语言时为什么总出现 file has been changed outside the eit
下一个:汇编语言程序1一直加到200

CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,