汇编程序中出现栈的时候在linux 栈上执行函数PUSH之前,SS和SP刚设置好的时候栈中就有内容了,怎么回事?里面是什么?

在实模式下,若SS=2200H,SP=2000H,AH=3000H,写出执行“PUSH AX”指令后SS、SP和相应得堆栈中的内容。_百度知道
在实模式下,若SS=2200H,SP=2000H,AH=3000H,写出执行“PUSH AX”指令后SS、SP和相应得堆栈中的内容。
我有更好的答案
(SS)=2200H (SP)=1FFEH (23FFFH)=30H (23FFEH)=00H
采纳率:64%
这个是否写错了:AH=3000H 应该是AX=3000H吧?否则,不溢出才怪。 请楼主先确定这个问题
为您推荐:
其他类似问题
堆栈的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。汇编语言 设AX=2875H BX=34DFH SS=1307H SP=8H 依次执行PUSH AX PUSH BX POP AX POP CX后_百度知道
汇编语言 设AX=2875H BX=34DFH SS=1307H SP=8H 依次执行PUSH AX PUSH BX POP AX POP CX后
栈顶的指针变为多少? AX? BX? CX?求具体计算和推理过程谢谢
我有更好的答案
SP=H,其对应物理地址为,CX=2875H,栈顶指针值sp=8H,后入先出原则,把上一条指令压入堆栈的值弹出到ax,
即AX=34DFHPOP CXsp+2--&sp=8 ,把最先压入堆栈的值弹出到CX;sp=6 ,AX=34DFH,BX=34DFH,指令执行完毕后,即CX=2875H所以,AX不变PUSH BXsp-2--&sp=4 ,BX不变POP AXsp+2--&sp=6 ,根据先入后出;sp-2--&gtPUSH AX
,栈顶指针的逻辑地址为:SS
采纳率:64%
sp+2--&sp=6PUSH BX
//sp+2--&sp=6
AX=34DFHPOP CX
/&#47,AX=34DFH,BX=34DFH,CX=2875H栈顶指针的逻辑地址为:
SS;sp-2--&gt:8H=13078H,指令执行完毕后;/sp-2--&sp=4 POP AX
&#47:SP=H,其对应物理地址为;sp=8
CX=2875H所以PUSH AX
为什么BX也等于34DFH
入栈操作不改变原来寄存器的值,所以,BX=3D4FH
为您推荐:
其他类似问题
pop的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。2141人阅读
汇编语言(8)
1、内存中字的存储
2、ds和【address】
CPU要读写一个内存单元的时候,必须先给出这个内存单元的地址,在8086CPU中,内存地址由段地址和偏移地址组成,
其中,段地址存放在段寄存器DS中,DS称作数据段寄存器。
如果我们要将内存地址为14A70的内存单元中的数据送入AL中,可以用如下的程序段进行:
Mov bx,1000H把段地址1000H送入bx中。
mov ds,把bx中的数值送入ds中。
Mov al,[4a70]把段地址为1000H,偏移地址位4a70H的内存单元中的数据送入al中。
[address]表示一个内存单元,内存单元中的address表示偏移地址,它的中文翻译就是地址的意思。
内存单元[address],我们可以知道它的地址是多少,但它的数值是多少,我们并不知道。
3、mov指令
传送指令mov可以完成以下4种传送:
1:将数据直接送入寄存器。
如:mov ax,1230H。
2:将一个寄存器中的数据送入另一个寄存器。
如:mov ax,bx
3:将一个内存单元中的数据送入一个寄存器。
如:mov ax,[27b0]
4:将一个寄存器中的数据送入内存单元中。
如:mov [607c],bx
注意:不能直接用数据送给段寄存器,如:mov ds,1230H 是错误的,必须要用一个寄存器来进行中转。比如:
Mov bx,1230H
Mov ds,bx
这样就行了。为什么8086CPU不支持将数据直接送入段寄存器呢?这属于8086CPU硬件设计的问题,我们只要知道这一
点就行了。
4、add和sub指令
Mov指令有两个操作对象,add和sub同样有两个操作对象。
Add为加法指令,格式:add 操作对象1,操作对象2。功能:两数相加,并把结果保存到操作对象1中。
Add有以下几种形式:
Add 寄存器,数据
如:add ax, 8
Add 寄存器,寄存器
如:add ax, bx
Add 寄存器,内存单元
如:add ax, [27a0]
Add 内存单元,寄存器
如:add [46e9], bx
Sub为减法指令,格式:sub 操作对象1,操作对象2。功能:两数相减,即从操作对象1减去操作对象2,其结果保存到
操作对象1中。
Sub 也有以下几种形式:
Sub 寄存器,数据
如:sub ax, 9
Sub 寄存器,寄存器
如:sub ax, bx
Sub 寄存器,内存单元
如:sub ax, [b027]
Sub 内存单元,寄存器
如:sub [8601], bx
前面讲过(参见2.7节),对于8086PC机,在编程时,可以根据需要,将一组内存单元定义为一个段。我们可以将一组长度
为N(N≤64KB)、地址连续、起始地址为16的倍数的内存单元当作专门存储数据的内存空间,从而定义了一个数据段。
比如:用123B0H~123B9H这段内存空间来存放数据,我们就可以认为123B0H~123B9H这段内存是一个数据段,长度
为10个字节。
如何访问数据段中的数据呢?首先用DS存放数据段的段地址,然后用相关的指令访问数据段中的内存单元。
比如,将123B0H~123B9H的内存单元定义为数据段,现在要累加这个数据段中的前3个单元中的数据,代码如下:
Mov ax, 123BH
Mov ds,将123BH送入ds中,作为数据段的段地址。
Mov al, 0用al存放累加结果,先把al中的数据清零。
Add al, [0]将数据段第一个单元(偏移地址为0)中的数值加到al中。
Add al, [1]将数据段第二个单元(偏移地址为1)中的数据加到al中。
Add al, [2]将数据段第三个单元(偏移地址为2)中的数据加到al中。
在1.5节中,我们说过,在内存中指令和数据没有任何区别,都是二进制信息,CPU在工作的时候,把有的信息看作指令,
把有的信息看作数据,那么CPU在什么时候把它看作指令?在什么时候把它看作数据呢?在2.5节中我们回答了第一个问题,现
在可以回答第二个问题了。
答:只要把这一段内存单元的段地址放到DS中,在用mov、add、sub等访问内存单元的指令时,CPU就会将这些内存单
元看作数据来访问。
栈是一种具有特殊的访问方式的存储空间,它的特殊性就在于:最后进入这个空间的数据最先出去。可以用一个盒子和3本书
来描述栈的这种操作方式。
入栈:把A放入栈中,再把B放入栈中,然后再把C放入栈中。就形成了A、B、C
出栈:先出栈顶C,然后是B,然后A,
特点:先进后出
入栈和出栈。入栈就是将一个新的元素放到栈顶,出栈就是从栈
顶取出一个元素。栈顶的元素总是最后入栈,需要出栈时又最先被从栈中取出,栈的这种操作规则被称为LIFO(last in first out,
后进先出)
7、cpu提供的栈机制
现今的CPU中都有栈的设计。8086CPU提供的入栈和出栈指令,最基本的两个是push(入栈)和pop(出栈)。比如:
Push ax 表示将寄存器ax中的数据送入栈中,pop ax 表示从栈顶取出数据送入ax。8086CPU的入栈和出栈操作都是以字为
单位进行的。
下面两张图描述了push和pop指令的执行过程。
上面两张图指令的执行过程,写成代码如下:
Mov ax, 123H
Mov bx, 2266H
Mov cx, 1122H
注意:字型数据用两个内存单元存放,高地址单元存放高8位,低地址单元存放低8位。
看了上面两张图后,现在提出两个问题。问题1:我们将1FH这段内存当作栈来使用,CPU是如何知道这段空
间是栈?关于这个问题将在3.10节解答。
问题2:push ax等入栈指令执行时,要将寄存器中的数据放入当前栈顶单元的上方,成为新的栈顶元素;pop ax等指令执
行时,要从栈顶单元取出数据送入寄存器中。显然,push、pop在执行的时候,CPU必须要知道哪个单元是栈顶单元,可是,如
答:8086CPU中,有两个寄存器,堆栈段寄存器SS,堆栈指针寄存器SP,栈顶的段地址存放在SS中,偏移地址存放在
SP中,任意时刻,SS:SP指向栈顶元素,push和pop指令在执行时,CPU从SS和SP中得到栈顶单元的地址。
现在,我们可以完整地描述push和pop指令的功能了,例如:push ax。push ax的执行,由以下两步完成:
1. SP=SP-2,SS:SP指向当前栈顶前面的单元,以当前栈顶前面的单元为新的栈顶。
2. 将ax中的数据送入SS:SP指向的内存单元处,SS:SP此时指向新栈顶。
下图描述了push ax的执行过程。
将1FH这段空间当作栈段,SS=1000H,栈空间大小为16字节,栈最底部的字单元地址为E,任
意时刻,SS:SP指向栈顶,当栈中只有一个元素的时候,SS=1000H,SP=000EH,栈为空,就相当于栈中唯一的元素出栈后,
SP=SP+2,原来为000EH,加2后SP=0010H,所以,当栈为空的时候,SS=1000H,SP=0010H。
换一个角度看,任意时刻,SS:SP指向栈顶元素,当栈为空的时候栈中没有元素,也就不存在栈顶元素,所以SS:SP只能指
向栈的最底部单元下面的单元,该单元的偏移地址为栈最底部的字单元的偏移地址+2,栈最底部字单元的地址为E,
所以,栈空时,SP=0010H。
接下来,我们描述pop指令的功能,例如:pop ax。Pop ax的执行过程和push ax刚好相反,由以下两步完成:
1. 将SS:SP指向的内存单元处的数据送入ax中。
2. SP=SP+2,SS:SP指向当前栈顶下面的单元,以当前栈顶下面的单元为新的栈顶。
下图描述了pop ax的执行过程。
注意:上图中,出栈后,SS:SP指向新的栈顶1000EH,pop操作前的栈顶元素,1000CH处的数据2266H依然存在,但
是,它已不在栈中,当再次执行push等入栈指令后,SS:SP移至1000CH,并在里面写入新的数据,将它覆盖。
8、push指令 pop指令
Push和pop指令的格式有如下两种形式:
第一种形式:push 寄存器将一个寄存器中的数据入栈。
Pop 寄存器出栈,用一个寄存器接收出栈的数据。
这一种形式,它们可以在栈和寄存器之间传送数据。
注意:上面的寄存器可以是段寄存器,比如,可以是:push ds、pop ds。
第二种形式:push 内存单元将一个内存单元中的字型数据入栈(注意,栈操作都是以字为单位)。
Pop 内存单元出栈,用一个内存字单元接收出栈的数据。
比如:mov ax, 1000H
Mov ds,将内存单元的段地址放在DS中。
Push [2a38]将内存单元[2a38]中的字型数据入栈。
Pop [2a3a]出栈,出栈的数据送入内存单元[2a3a]。
这一种形式,它们可以在栈和内存单元之间传送数据。
指令执行时,CPU要知道内存单元的地址,可以在push、pop指令中给出内存单元的偏移地址,段地址在指令执行时,CPU
从DS中取得。
Push和pop实质上是一种内存传送指令,与mov指令不同的是,push和pop指令访问的栈空间的地址不是在指令中给出
的,而是由SS:SP指出的。同时,push和pop指令还要改变SP中数值。Mov指令只需一步操作,就是传送,而执行push、
Pop指令需要两步操作,执行push时,先改变SP,后向SS:SP处传送;执行pop时,先读取SS:SP处的数据,后改变SP。
前面讲过(参见2.7节),对于8086PC机,在编程时,可以根据需要,将一组内存单元定义为一个段。我们可以将长度为N
(N≤64KB)的一组地址连续、起始地址为16的倍数的内存单元,当作栈空间来用,从而定义了一个栈段。
比如,我们将1FH这段内存空间当作栈来用,以栈的方式进行访问,这段空间就可以认为是一个栈段,大小为
16个字节。
如何使得如push、pop等栈操作指令访问我们定义的栈段呢?那就是要将SS:SP指向我们定义的栈段。
现在我们来回答3.8节中的第一个问题。答:只要这段内存单元被SS:SP指向,那么,CPU就会把这段空间当作栈来使用。
就职:深信服科技
QQ讨论群:
微信:chenyu_920310以下试题来自:
单项选择题假设(SP)=0100H,(SS)=2000H,执行PUSH BP指令后,栈顶的物理地址是(
)。A.2000HB.00FEHC.20FEHD.1000H
为您推荐的考试题库
你可能感兴趣的试题
1A.机器指令B.系统命令C.作业控制命令D.低级通信原语2A.16位B.32位C.36位D.64位3A.网络层B.应用层C.表示层D.传输层4A.报文交换B.电路交换C.分组交换D.信元交换5A.AIX是IBM的UNIX系统B.Solaris是SCO公司的UNIX系统C.HP-UX与DigitalUNIX都是HP公司的UNIX系统D.SunOS是Sun公司的UNIX系统
热门相关试卷
最新相关试卷

我要回帖

更多关于 gdb 执行栈 被破坏 的文章

 

随机推荐