精华内容
下载资源
问答
  • 程序: mov ax,1000H mov ss,ax mov sp,0010H ;设置AX和BX的值 mov ax,001AH mov bx,001BH ...在8086中,段寄存器不能直接传值,要通过一般寄存器,所以先...push指令后,栈的情况如图: 此时bx的值在上面,ax的值在...

    程序:

    mov	ax,1000H
    mov	ss,ax
    mov sp,0010H
    
    ;设置AX和BX的值
    mov	ax,001AH
    mov bx,001BH
    
    ;压栈
    push ax
    push bx
    
    ;出栈
    pop ax
    pop bx
    

    解释:
    在8086中,段寄存器不能直接传值,要通过一般寄存器,所以先将值传到ax中,在送入ss中
    push指令后,栈的情况如图:

    在这里插入图片描述
    此时bx的值在上面,ax的值在下面,所以要交换值,只需先 pop ax就行

    展开全文
  • 可以使用pushq和popq(汇编指令)将数据存入中或是从中取出,将指针减小一个适当量可以为没有指定初始数据在站上分配空间。类似地,可以通过增加指针来释放空间。当x86-64过程需要存储空间超出...

    过程(函数)调用时的栈(运行时栈)

    运行时栈

    每个进程都有自己的栈空间,x86-64的栈向低地址方向增长,而栈栈指针%rsp指向栈顶元素。可以使用pushq和popq(汇编指令)将数据存入栈中或是从栈中取出,将栈指针减小一个适当的量可以为没有指定初始值的数据在站上分配空间。类似地,可以通过增加栈指针来释放空间。当x86-64过程需要的存储空间超出寄存器能够存放的大小时,就会在栈上分配空间。这个部分称为过程的栈帧(stack fram)。
    通用的栈帧结构
    为了提供空间和时间效率,x86-64过程只分配自己所需要的的栈帧部分。例如许多过程有6个或者更少的参数,那么所有的参数都可以通过寄存器传递。因此,上图中画出的某些栈帧部分可以省略。实际上,许多函数甚至根本不需要栈帧。当所有的局部变量都可以保存在寄存器中,而且该函数不会调用任何其他函数(有时称为叶子过程,此时把过程调用功能看做树结构)时,就可以这样处理。

    过程调用的汇编指令

    函数(过程)调用的过程就是将参数及返回地址传入栈帧的过程,同时也将程序计数器转换到函数里面的第一条指令。
    汇编指令中,call指令的作用就是调用一个过程,将返回地址(调用返回后的下一条指令地址)压入占中,设置程序计数器PC为过程的第一条指令的地址。而ret指令的作用是从过程中返回,它将从栈中弹出栈顶元素(此时是返回的指令地址,也即是call指令最后压入的地址),将程序计数器设为这个地址。

    参数传递

    x86-64中,可以通过寄存器最多传递6个整形(例如整数和指针)参数,寄存器的使用时有特殊顺序的,根据传入参数的顺序,会分配对应顺序的寄存器。寄存器使用的名字取决于要传递的数据类型的大小,如下表所示。
    传递函数参数的寄存器
    如果一个函数有大于6个整形参数,超过6个的部分就要通过栈来传递。假设过程P调用过程Q,有n个整型参数,且n>6,那么P的代码分配的栈帧必须要哦能容纳7到n号参数的存储空间,而第7个参数位于栈顶。
    在这里插入图片描述

    有些时候局部数据必须存放在内存中

    常见情况包括:

    1. 寄存器不足够存放所有的本地数据
    2. 对一个局部变量使用地址运算符’&’,因此必须能够为它产生一个地址
    3. 某些局部变量是数组或结构,因此必须能够通过数组或结构引用被访问到。

    函数(过程)调用的举例

    对于以下函数:
    call_proc
    我们考虑程序运行到调用proc时,分析如何完成proc的调用,以下是汇编代码:
    在这里插入图片描述
    首先对于call_proc中的局部变量,我们可以看到,在调用proc函数的时候,对x1,x2,x3,x4都进行了取址操作,因此需要在栈上分配空间。对照汇编代码,首先减小栈指针%rsp以分配空间,先后对x1,x2,x3,x4分配内存并复制。然后从proc的参数列表自右向左的顺序设置参数,将第8,7个参数依次压入占中,然后将第6,5,4,3,2,1个参数分别保存在对应的寄存器中,接着执行call proc指令,该指令将返回地址(proc调用完的后一条指令)压入栈中,并将程序计数器设置为proc的第一条指令。程序自此进入proc函数执行过程。

    通俗的说函数调用过程

    首先将按参数列表从右到左的顺序压入栈中(超过6个参数的部分)或保存在寄存器中(前6个参数),调用call指令,将返回地址压入栈中,将程序计数器PC设置为被调用过程的第一条指令地址,随后将控制移交给被调用过程,运行被调用过程中的指令。

    参考文献

    深入理解计算机系统

    展开全文
  • S和队列Q的初始状态为空,元素e1、e2、e3、e4、e5、e6依次通过S,一个元素出栈后即进入队列Q,若6个元素出队的序列是e2、e4、e3、e6、e5、e1,则S的容量至少应该是 3 解答 出队先出e2表示e1,e2进栈后出e2...

    题目

    设栈S和队列Q的初始状态为空,元素e1、e2、e3、e4、e5、e6依次通过栈S,一个元素出栈后即进入队列Q,若6个元素出队的序列是e2、e4、e3、e6、e5、e1,则栈S的容量至少应该是 3

    解答

    出队先出e2表示e1,e2进栈后出e2(这时栈的容量最大为2),接着出e4,e3表示e3,e4进栈后出e4,e3(这时栈的容量最大为3),再出e6,e5表示e5,e6进栈后出e6,e5(这时栈的容量最大为3),最后出e1,所以答案应该是 3

    欢迎关注我的微信公众号,定期分享硬件、单片机、嵌入式Linux技术文章:

    在这里插入图片描述

    展开全文
  • 2019-09-06 10:09:07
    栈的初始状态为空,当字符序列a3_作为栈的输入时,输出长度为3的且可以用作C语言标识符的字符串序列有(3)个。 解: 首先,栈的顺序是先进后出 字符序列为a3_ 1)a入栈,再出栈,然后3入栈,再出栈,入栈,再出栈 ...

    设栈的初始状态为空,当字符序列a3_作为栈的输入时,输出长度为3的且可以用作C语言标识符的字符串序列有(3)个。

    解:
    首先,栈的顺序是先进后出
    字符序列为a3_
    1)a入栈,再出栈,然后3入栈,再出栈,入栈,再出栈 序列是a3
    2)a入栈,再出栈,然后3,_入栈,再出栈,序列是a_3
    3)a入栈,3入栈,再出栈,a出栈, 入栈,再出栈 序列是3a
    4) a入栈,3入栈,再出栈, _入栈,序列是3_a
    5) a入栈,3入栈,_入栈,序列是_3a
    其次,C语言的标识符不能以数字开头,去除3a_和3_a 答案为3

    展开全文
  • HVM的初始状态

    2015-10-18 20:04:24
    对于虚拟处理器来说,程序计数器的初始值以及指针已经在外界定义了:也就是通过VMM的命令进行参数设置,或者通过虚拟指令vmstart创建了新的虚拟处理器实例。除了以上的初始寄存器设定,其他的
  • TCP马上要准备好了。 上回tcp_init函数并没有说完。因为这个函数做了许多重要事情。这次接着说。 2474 tcp_hashinfo.bhash_size = 1 ; 2475 for (i = 0; i ; i++) { 2476 spin_lock_init(&tcp_ha
  • 长度为s,起始为0因为后进先出,队列先进先出。又因为元素E1.。E6是顺序入栈,那么分析过程如下:按照出栈过知程分析,因为给定出栈顺序:E2,E4,E3,E6,E5,E1,E2要进栈,所以道E1必须进栈,进栈顺序:E1,E2,...
  • java中线程的状态以及线程分析

    千次阅读 2017-03-09 18:48:10
    初始状态。线程刚刚被创建,并且start()方法还未被调用 RUNNABLE 运行状态。表示线程正在java虚拟机中执行,但是可能正在等待操作系统其他资源,比如CPU BLOCKED 阻塞状态。表示线程正在等待...
  • [Bluetooth(SDK)]蓝牙协议栈的状态

    千次阅读 2006-06-22 00:10:00
    可以使用BTH_NAMEDEVENT_STACK_INITED来检查协议栈的初始化情况,它定义在%_WINCEROOT%/Public/Common/Sdk/Inc/Bt_api.h中。要打开这个命名事件需要使用OpenEvent函数。// 确定协议栈是否已初始化BOOL fStackUp = ...
  • 栈的操作

    2018-07-24 12:52:15
    (1)将10000H~1000FH这段空间当作初始状态栈是空(据此设置SS、SP); (2)设置AX=001AH,BX=001BH; (3)利用,交换AX和BX中数据。 (下面列出源代码,并截图说明运行结果)。 源代码: assume cs:...
  • (C语言)

    2020-03-15 15:22:30
    示例一:一个栈的初始状态为空,现将元素1,2,3,4,5,A,B,C,D,E入栈,得到的结果: (1)依次入栈,则出栈的顺序:E.D.C.B.A.5.4.3.2.1. (2)进一个出一个:1,2,3,4,5,A,B,C,D,E 模拟一个栈:(C语...
  • 汇编中栈的练习

    2013-09-11 11:20:57
    1:将A0000H~A000FH这段内存空间作为初始状态栈为空。将AX,BX,DX寄存器中数据入栈。mov ax,a000 mov ss,ax mov sp,0010 push ax push bx push dx 2:a 将A0000H~A000FH这段内存空间作为初始状态栈为空。 ...
  • Java实现栈的顺序存储

    2019-05-08 14:35:29
    Java实现栈的顺序存储 栈的特点是后进先出,栈的插入和删除操作受限制,栈的插入和删除操作只允许在线性表的一端操作。...1、栈的初始化,设置栈状态为空 2、判断栈的状态是否为空 3、判断栈的状态是否已满 ...
  • 题目:设栈的的初始状态为空,元素a,b,c,d,e,f依次通过栈s,出栈顺序为c,f,e,d,b,a,求栈的最小容量。 解析:首先栈是一个先入后出的数据结构,最先入栈的元素最后出栈,最后入栈的元素最先出栈。 step1:a入栈 ,...
  • 第三章 初始CC2640蓝牙协议

    千次阅读 2016-03-17 11:33:06
    蓝牙协议由两部分组成:控制端和主机。控制端和主机遵循标准蓝牙基本传输速率或者增强型数据传输速率。这两部分是单独进行工作。所有配置文件和应用都是在GAP和GATT层上进行。 物理层(PHY)是一种带宽...
  • 1、SQL优化,采用预编译方式并将SQL语句修改为大写,尽量减少Oracle数据库硬解析2、复用部分代码,减少变量重复计算3、根据最小知识原则、变量作用域最小化原则控制数据安全访问4、部分变量由堆变量改为变量,...
  • 几个有关栈的题目

    2021-01-25 20:37:04
    栈的顺序存储空间为S(1:50),初始状态为top=-1。现经过一系列正常的入栈与退栈操作后,top=30,则当前栈中的元素个数为( D )。 A.20 B.19 C.31 D.30 设栈的顺序存储空间为S(1:m),初始状态为top=m+1,则...
  • MS蓝牙协议栈状态(转载)

    千次阅读 2007-07-20 13:29:00
    可以使用BTH_NAMEDEVENT_STACK_INITED来检查协议栈的初始化情况,它定义在%_WINCEROOT%/Public/Common/Sdk/Inc/Bt_api.h中。要打开这个命名事件需要使用OpenEvent函数。// 确定协议栈是否已初始化BOOL fStackUp = ...
  • 在做以太网过程中,借助老衲五木一些书籍,比较详细了解了LWIP协议建立TCP连接和断开连接过程,跟踪源码,查看控制块状态转换后一些理解有必要记录下来。我们都知道TCP建立连接时三次握手,断开连接时...
  • 一、栈的逻辑结构 1.栈定义 2.栈与线性表的区别与联系 3.栈的相关运算 4.要对栈状态进行标示,仅需要一个参数即可。 二、顺序栈 1.顺序栈数据结构 2.顺序栈初始化 3.判断栈空和栈满 4.压栈 5.弹栈 6.取...
  • 数据结构——共享栈的栈满条件判断

    千次阅读 多人点赞 2020-09-08 09:42:04
    共享判断条件,即判断两个栈顶位置的状态,其根本是由两个栈顶指针操作方式决定。 用入栈操作来说有以下两种操作方式:(1)栈顶指针先加1,再赋值,那么栈顶指针所指地方是最后入栈元素(2)若先...
  •  所以栈的基本函数可以有栈的初始化 出入栈过程中栈的状态判断 是否为空或满 以及销毁  实现顺序栈的基本运算的算法  (1)初始化栈  (2)判断栈s是否为空  (3)一次入栈a, b, c, d, e  (4)再次判断栈s...
  • 模板

    2019-09-03 16:47:59
    栈的基本状态有:一般状态...无论采用哪种数据结构,栈类中都应该包括以下基本操作:初始化、入栈、出栈、栈清空访问栈顶元素、检查栈的状态(满或空) #include<iostream> #include<cassert> using n...
  • 采用静态一维数组来存储。...◆ 用top=0表示的初始状态,每次top指向栈顶在数组中的存储位置。 ◆ 结点进栈:首先执行top加1,使top指向新的栈顶位置,然后将数据元素保存到栈顶(top所指的当前位置)。 ◆

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,010
精华内容 404
关键字:

栈的初始状态