程序中,我们定义一个变量时会为变量分配内存,比如定义了一个变量int a;那么在内存中会为变量a分配4字节的内存。那在哪块内存空间为这个变量分配内存呢?大多数编程语言,定义变量时,这个变量可能是局部变量或者全局变量,这里只关注有变量的编程语言,暂不去关心什么变量不变性,变量不变,或无变量的那些编程语言了。通常局部变量是在一个被称为栈空间中分配内存的变量。
void fn2()
{
int i = 0;
}
比如像上面简单程序中定义了一个局部变量,在函数中定义了一个变量int i,这个是在栈空间中分配的变量。
那么栈空间是个什么东西?
栈空间
通常我们的程序在加载后系统会为程序运行建立一个程序运行空间和程序状态段(TSS, task-state segment)。这个程序运行空间由代码段、stack段、以及一个或多个数据段组成。
这个栈空间就是所说的堆栈段,这个是我们习惯的叫法,其实不应该和堆扯上关系,实际上就是一个被称为“栈”的段,即这里的stack段。
栈
这个栈空间对于这个程序来说,其实也是一个全局共享的一块内存空间,所有的程序在运行时,整个期间都只有这么一个栈空间,也就是stack段。当然也有例外。
这个栈是怎么维护的?
上面说了这个栈空间其实也是一块内存空间,那么是怎么维护的呢?既然是一块内存空间,那么就有起始地址,当然也有最终的截止地址,也就是有个上限或下限。以x86为例, 通过bp(或ebp,rbp什么的)寄存器来指向这块空间的起始地址,这个寄存器就是基指针寄存器。另外,还有一个sp(或esp,rsp什么的)指向当前位置,比如,我们需要在栈上分配内存的时候,我们就将sp往下移动一段距离,留出指定大小的空间给变量使用。
不管采用哪种编程语言编程,好像都离不开函数。
函数调用
先来个简单的函数
void fn()
{
}
通常函数调用时,会为函数调用维护一个栈空间,这个栈空间其实是栈帧。
pushl %ebp movl %esp, %ebp ... ... popl %ebp ret
也就是相当于在函数调用时,会为这个函数调用在栈空间中开辟一块独立的空间,这个空间就是栈帧空间。当然这个栈帧空间通常是在编程语言中就为你设计好了的,程序在编译时就会为这个函数编译生成这个维护栈空间的代码。
比如上面的这段编译后的代码。
栈帧
当然这个栈帧的维护也不是必须的,如果不维护这么一个栈帧,那么所有的函数调用都共享整个栈空间,这也是上面所说的“栈空间对于这个程序来说,其实也是一个全局共享的一块内存空间,所有的程序在运行时,整个期间都只有这么一个栈空间”。
_kset_protected_mode_enable: mov %cr0, %eax or $0x01, %eax mov %eax, %cr0 ret
在这个函数定义时并没有去维护独立的栈帧空间。
栈和栈帧的区别
栈上分配
上面只是说了下栈空间包括栈帧是怎么维护的。那栈上变量是怎么分配内存的呢?
pushl %ebp movl %esp, %ebp subl $16, %esp movl $0, -4(%ebp) ... ... leave ret
有意思的enter和leave
栈
关于汇编中的调用栈
_TEXT SEGMENT _sum PROC NEAR push ebp mov ebp, esp mov eax, DWORD PTR 8[ebp] mov ecx, DWORD PTR 12[ebp] add eax, ecx pop ebp ret 0 _sum ENDP _TEXT ENDS
int num = 0; _asm push 111; _asm push 222; _asm call sum; _asm pop ebx; _asm pop ebx; _asm mov num, eax; printf("sum: %d\n", num);
相关推荐
【汇编API】是计算机编程领域的一个重要概念,特别是在低级编程和系统级开发中扮演着关键角色。汇编API,或称为汇编语言应用程序接口,是指一组用汇编语言编写的功能函数或子程序,供程序员在开发软件时调用,以实现...
以上软件为网上收集来的反汇编专用软件 PIC16FDisAsm.exe 为pic16fxxx单片机反汇编软件 u51V12.rar为mcs51单片机反汇编软件 EMCdasm.exe为emc单片机反汇编软件 reavr.rar为AVR单片机反汇编软件 STM8反汇编.rar为stm8...
" Linux下的汇编语言.pdf" Linux下的汇编语言是指在Linux操作系统下的汇编语言编程。汇编语言是一种低级编程语言,使用symbolic representation来表示机器语言指令。汇编语言在操作系统与硬件打交道的过程中,需要...
什么是汇编语言(Assembly Language)?请简要介绍汇编语言的特点和作用。 汇编语言与高级编程语言相比有哪些优势和劣势?请说明汇编语言的优点和限制。 汇编语言中的寄存器(Registers)是什么?请列举常见的CPU...
机器码与汇编语言是计算机科学中的两个基本概念,它们都是与硬件紧密相关的编程语言形式。机器码,也称为机器语言,是计算机硬件能够直接理解和执行的唯一指令集,由二进制数字组成。而汇编语言则是一种介于机器码和...
"51系列单片机反汇编工具"是一款专门针对51单片机的程序进行反汇编的软件,它允许用户将机器语言代码转换回更易读的汇编语言。汇编语言是一种低级编程语言,与机器语言直接对应,每个指令都与单片机硬件的特定操作相...
《经典汇编程序100例》是一份珍贵的学习资源,专为汇编语言初学者设计,旨在通过一系列实例帮助他们提升汇编编程技巧。汇编语言是计算机科学的基础之一,它是一种低级编程语言,直接对应于机器指令,因此理解和掌握...
汇编语言(Assembly Language)是面向机器的程序设计语言.汇编语言是一种功能很强的程序设计语言,也是利用计算机所有硬件特性并能直接控制硬件的语言。汇编语言”作为一门语言,对应于高级语言的编译器,需要一个...
《GNU汇编语法手册》是一本详尽介绍GNU汇编语言的权威指南,适用于那些希望深入理解计算机底层工作原理和程序设计的读者。在本文中,我们将深入探讨GNU汇编语言的基本概念、语法以及在实际编程中的应用。 GNU汇编...
汇编金手指是一款专为汇编语言学习而设计的软件工具。这款软件为用户提供了丰富的汇编语言学习资源,包括指令系统、常用伪操作、DOS中断、BIOS中断、错误信息、高级汇编以及ASCII码表等内容。这些资源的集中为学习和...
8. **汇编和反汇编**:学习汇编语言还需要了解如何将高级语言编译成汇编代码(汇编过程),以及如何将汇编代码转换回可执行的机器代码(链接过程)。 9. **实践应用**:汇编语言常用于系统级编程,如操作系统内核、...
### ARM GCC 内联汇编参考手册解析 #### 关键知识点概述 本手册主要介绍了如何在C语言中使用GCC提供的内联汇编功能来编写针对ARM架构的代码。内联汇编是一种强大的技术,允许开发者在C代码中插入低级汇编指令,...
### CCS 中 C 语言程序调用线性汇编 #### 一、引言 随着数字信号处理(DSP)技术的发展,对于程序效率的要求越来越高。在实际应用中,尤其是在需要进行高性能计算的应用场景下,仅仅依靠高级语言(如C语言)往往...
注意: 我的程序用的是宽屏幕调试运行的,这样就导致了一个问题(汇编中画圆和分辨率的问题):在普通屏幕的显示器上运行,球是个“椭圆”。。 ----------------------------- ...
汇编语言(Assembly Language)是面向机器的程序设计语言。 汇编语言中,用助记符(Memoni)代替操作码,用地址符号(Symbol)或标号(Label)代替地址码。这样用符号代替机器语言的二进制码,就把机器语言变成了汇编语言...
MIPS反汇编器是一种工具,它能够将MIPS架构机器语言代码转换成人类可读的汇编语言。这个“MIPS反汇编器(修正版)”是针对原始版本的改进,可能修复了一些错误或者增加了额外的功能,使得对MIPS指令集的解析和展示...
STM8S反汇编器是一款专门针对STM8系列微控制器的工具,用于将STM8的机器码转换为可读的汇编语言代码。STM8是意法半导体(STMicroelectronics)生产的一系列8位微控制器,广泛应用于各种嵌入式系统设计。反汇编器在...
AVR反汇编软件ReAVR320setup是一款专为Atmel AVR微控制器设计的高级工具,它能够将已烧录到闪存中的HEX文件进行反汇编,从而帮助开发者理解并分析程序的执行流程。在嵌入式开发领域,尤其是对于使用汇编语言或者低级...
《汇编语言精粹——深度探索8大CHM文件》 汇编语言,作为计算机科学的基础,是直接与机器硬件对话的语言,对于理解和优化程序性能至关重要。本资源库包含了精心整理的8个CHM(Compiled Help Manual)文件,旨在提供...
中断控制LED灯亮灭【汇编语言】.zip中断控制LED灯亮灭【汇编语言】.zip中断控制LED灯亮灭【汇编语言】.zip中断控制LED灯亮灭【汇编语言】.zip中断控制LED灯亮灭【汇编语言】.zip中断控制LED灯亮灭【汇编语言】.zip...