您好、欢迎来到现金彩票网!
当前位置:老k棋牌 > 栈内容 >

汇编学习-堆栈与子程序

发布时间:2019-08-20 03:32 来源:未知 编辑:admin

  任何程序在运行过程中都需要使用堆栈,操作系统为每一个程序(进程及线程)设置一个堆栈。在使用高级语言编程时,源程序中使用的函数调用、局部变量都要用到堆栈,由编译器来负责生成有关的机器指令。我的理解,堆栈就是维护当前线程中运行状态的一个数据结构,这种状态包括:需要传递的变量,函数的返回地址,局部变量等等。

  ESP 寄存器中的内容作为堆栈的当前指针。PUSH, POP, CALL, RET 等指令都与堆栈有关,使用 SS:ESP 指向堆栈单元。

  EBP 寄存器中的内容作为堆栈的“基准”指针。SS:EBP 指向的地址作为基准地址。在函数(子程序)内部,可以使用 [EBP+立即数] 的形式来取得主程序传递的参数,使用 [EBP-立即数] 的形式来访问局部变量。

  从上述的描述可以看出,整个堆栈的是一个经典的先入后出的栈结构,在栈中还存在着“栈帧”这样的结构,用来表示当前函数运行的环境,里面存放着当前函数的局部变量,所需的返回地址。栈帧由 EBP 所指出,EBP 和 ESP 之间即为当前函数帧,调用函数和被调用函数的栈帧是相邻存放,这样即可通过 EBP加减固定的数,来获取主调函数所传递的函数参数。

  堆栈是经过精心设计的结构,使得编程人员能够方便的设计函数来实现结构化设计,高级语言也得益于这种结构,c 语言基本上就是汇编的一种简单的翻译。这里要强调的是,在用汇编写程序的时候,完全可以不按这种结构来设计,比如参数我们可以放到指定的内存区,被调用的函数到指定的内存区去取出传递给它的参数;也可以让函数参数全部通过寄存器来传送,尤其是在 ARM 这种寄存器特别多,而且每个寄存器的地位都相同的处理器之中。之所以要设计出堆栈,就是为了能够以统一的方式来编写程序。

  对于 c 语言,函数有好几种调用规则。最常见的是两种,cdecl 方式和 stdcall 方式。

  (2)主程序按从右向左的顺序将参数逐个压栈,最后一个参数先入栈。每一个参数压栈一次。

  (3)在子程序中,使用 [EBP+X] 的方式来访问参数。X=8 代表第 1 个参数;X=12 代表第二个参数,依次类推

  (5)由主程序执行“ADD ESP, n”指令调整 ESP,达到堆栈平衡。

  与Cdecl的不同是,堆栈的平衡不是由主程序完成,而是由子程序通过调用“RET n”指令主动平衡。

  这些调用规则,都是针对 c 语言来说的,在 c 语言和汇编需要互相调用的情况;c 语言编写的不通的二进制函数库之间,都要注意函数的调用规则。

  文章同步发表于:在高级语言程序设计中,我们不仅要求程序能够顺序执行,还要求其能够执行不同分支,或者重复执行某些操作。在汇编语言中,同样具有相同的...博文来自:lyyyuna 的小花园

  C/C++中的计时函数是clock(),而与其相关的数据类型是clock_t。在MSDN中,查得对clock函数定义如下:clock_tclock(void);这个函数返回从“开启这个程序进程”到“程...博文来自:取而代之的专栏

  最近刚学了汇编语言的子程序调用,刚开始有些迷惑,现在大概弄懂了点。1:程序内部调用子程序            先看个例子:编制一个子程序,求y=x^4,x为字节,y为字,且不会溢出版本1:子程序的参...博文来自:cqp_snow的博客

  汇编语言:简单的子程序设计本文内容来源于王爽《汇编语言(第三版)》实验10编写子程序这次要求编写三个子程序,所有思路提示在书中给出了,需要了解的同学可以到书中寻找相关提示(尽管网上有电子书,但我强烈建...博文来自:weixin_30782871的博客

  汇编语言-子程序调用ret与ref指令retret==popIPret指令用栈中的数据,修改IP的内容,从而实现近转移;功能介绍retf指令用栈中的数据,修改CS和IP的内容,从而实现远转移CPU执行...博文来自:weixin_30920597的博客

  堆栈:“先进后出”的存储区,存在于堆栈段中,SP在任何时候都指向栈顶。一、PUSH指令(字入栈)1、格式:PUSH源操作数(字)PUSHAX;AX进栈2、功能(1)首先将栈顶指针减2,即(SP)-2=...博文来自:似水流年

  由于之前转载的那个教程最后一篇,代码太长了,虽然注释很详细但我实在看不下去了。。。原文在这里于是根据《INTEL汇编程序设计第五版》第八章8.2小结以及网上的内容整理如下。--------------...博文来自:移动开发记录

  堆栈操作指令处理器通常用硬件支持堆栈(Stack)数据结构,它是一个按“先进后出(FirstInLastOut,FILO)存取原则组织的存储区域,也可以说是“后进先出(Last...博文来自:Clown_pan的博客

  字符串操作指令    汇编语言中,串操作指令LODSB/LODSW是块装入指令,其具体操作是把SI指向的存储单元读入累加器,LODSB就读入AL,LODSW就读入AX中,然后SI自动增加或减小1或2....博文来自:wyfwx的专栏

  【任务】编制一个子程序,求y=x4,自变量x为字节,应变量y可以在一个字内存放而不溢出(1)版本1:子程序的参数由寄存器dl提供,返回结果在ax中;(2)版本2:子程序不变,主程序中提供如...博文来自:weixin_34315665的博客

  LODSB/LODSW取字符串指令LODSB/LODSW将位于DS段由SI所指的存储单元的内容取到AL或AX中。用LODSB时,取的是字节,取完后,地址自动加1或减l;用LODSW时取的是字,取完后地...博文来自:beswkwangbo的专栏

  首先、堆与栈的区别       一、预备知识—程序的内存分配一个由C/C++编译的程序占用的内存分为以下几个部分1、栈区(stack)—由编译器自动分配释放,存放函数的参数值,局部变量的值等。...博文来自:LL-Studio的专栏

  根据咱们学汇编的经验呀,汇编用的最多的是寄存器和内存之间的不断相互传值传地址,井然有序。    然而,你知道它们具体是怎么进行数据传递和交换的吗?                       ...博文来自:吴童鞋的博客

  任何程序在运行过程中都需要使用堆栈,操作系统为每一个程序(进程及线程)设置一个堆栈。在使用高级语言编程时,源程序中使用的函数调用、局部变量都要用到堆栈,由编译器来负责生成有关的机器指令。我的理解,堆栈...博文来自:shenjianxz的博客

  本文章系作者原创,未经许可,不得转载。汇编堆栈变量存储指针先说栈的概念,栈其实也是一种。。。。。先说内存的概念吧。。。。。额先说计算机吧,简单来说的话,可以把计算机理解成由CPU,内存,硬盘组成,而C...博文来自:whynat的博客

  一、什么是堆栈1.堆栈就是一块内存,操作系统在程序启动的时候已经分配好的,供程序执行时使用; 2.和数据结构中的堆栈无关。   堆栈是一块4GB的内存:   二、在DTDebug中查看堆栈将任意的...博文来自:李燕良的博客

  这是以前面试搜狐碰上的一道笔试题:用数组的方式实现Stack,博文来自:mousekingking的专栏

  当发生函数调用的时候,栈空间中存放的数据是这样的:1、调用者函数把被调函数所需要的...博文来自:maimang1001的专栏

  /*顺序栈栈的抽象数据类型ADT栈(stack)Data同线性表。元素具有相同的类型,相邻元素具有前驱和后继关系OperationInitStack(*S):初始化操作,建立一个空栈SDestroyS...博文来自:最暖一天

  我们所接触到的段寄存器有四种:CS、DS、ES、SS,CS段是代码段,当然是存放代码的段了。DS和ES是存放数据的段。这个SS是堆栈段,什么是堆栈呢?堆栈又有什么用呢?一、什么是堆栈堆栈是一种线性表(...博文来自:ccboby的专栏

  转载自:程序加载后堆栈情况:ss为堆栈的首地址,sp为堆栈的长度,当sp=0时堆栈满;入栈时向低地址伸展(sp先减2再写值),出栈时向高地址伸展。 使用bp寄存器 bp为基址寄存器,一般在函数中用来保...博文来自:Azure_Sky_2014

  现今的CPU中都有栈的设计。8086CPU提供相关的指令来以栈的方式访问内存空间。这意味着,我们在基于8086CPU编程的时候,可以将一段内存当作栈来使用。8086CPU提供入栈和出栈指令:(最基...博文来自:rakish_wind的博客

  从简单的算法初探过程汇编转载自捣乱小子趁年轻,用代码实现梦想—忽视汇编较于我们日常接触的高级语言,诸如c语言,c++,java等等,汇编语言是更接近机器的语言,它的常用操...博文来自:zcabcd123的专栏

  大家都知道,栈区是存储函数,局部变量的一块内存区域。      那么让我们从汇编的角度,来看看函数的执行过程。首先,当我们使用pushl将数据入栈时,栈顶会移动,以容纳新增加的值。实际上,我们能不断将...博文来自:Runing Out of the world

  gcc产生的代码,可以使用objdump查看它对应的汇编代码(gcc查看汇编代码),本文主要介绍条件语句if语句的汇编表示 有以下代码:intmax(intx,inty){if(xy)returnx...博文来自:零丁若叹

  熟悉函数调用时的堆栈操作是学好汇编语言的必备知识,在此只写出了最简单的函数调用过程,有错误的地方,欢迎批评指正.注:该程序通过VS2012编译. 函数调用方式为C调用方式: A.用栈自右向左传参   ...博文来自:jxz_dz的博客

  代码段(正文段)(TEXT)代码段就是存储程序文本的,所以有时候也叫做文...博文来自:Rain的专栏

  1.堆栈:就是一段内存,操作系统在程序启动的时候已经分配好的,供程序执行时使用。2.查看堆栈:dd(FS所对应的地址)堆栈在使用时从地址高位往地址低位使用ESP:栈指针寄存器,ESP中存储了当前的堆栈...博文来自:菜是原罪

  本AI的汇编环境是32位80*86nasm就是这样。先讲下刚刚听那个视频感受,比人类给我讲的要直观些,毕竟是看着跟着汇编代码看olydbg里堆栈区。也不能说讲得多好,就是暂时性让我明白,这个汇编里堆栈...博文来自:[一曝十寒 ]

  前言:进出堆栈中的数据的长度需要满足规定:必须是字(16位)或双字(32位)进栈与出栈指令一般成对使用通用进栈指令格式:PUSH源操作数操作数:源操作数可以是字长为16位或32位的立即数、寄存器操作数...博文来自:ZSM_KP的博客

  创建堆栈框架总体看来,构建一个堆栈框架包含了以下几个步骤:如果要调用的函数有参数,将参...博文来自:dsz211的专栏

  在以BUF为首址的字节数据存储区中,存放着5个学生的课程成绩表(百分制),每个学生的相关信息包括:姓名(占6个字节,都以0DH为结束标记),语文成绩(1个字节),数学成绩(1个字节),英语成绩(1...博文来自:Sea_Luo的博客

  硬件堆栈用来保存调用子程序的返回地址,软件堆栈用来保存局部变量和工作寄存器。 一般会把返回地址自动存入堆栈,而没有被单片机自动入栈但是也需要保存的内容比如状态寄存器、通用寄存器等,就得通过PUSH等指...博文来自:kerwinash的专栏

  :Finsh_system_init();这个函数开头是小写的。。。搞了好一会儿。。。

http://theenigmaco.com/zhannarong/534.html
锟斤拷锟斤拷锟斤拷QQ微锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷微锟斤拷
关于我们|联系我们|版权声明|网站地图|
Copyright © 2002-2019 现金彩票 版权所有