. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->寄存器(内存访问)
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  push执行的时候为什么sp要减2?  [待解决] 回复[ 11次 ]   点击[ 509次 ]  
yuqian4872
[帖 主]   [ 发表时间:2009-05-08 01:35 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2008-11-12 22:30
如题?难道就是说是CPU的设计问题,不用管??
mess
[第1楼]   [ 回复时间:2009-05-08 09:00 ]   [引用]   [回复]   [ top ] 
荣誉值:337
信誉值:0
注册日期:2008-01-01 17:48
比如这个指令 mov ax,0
执行过程是把0这个数据送入ax中。

难道就是说是CPU的设计问题,不用管??
------------
push要比,mov多一步操作。在3.7讲cpu提供的栈机制的内容中介绍了push 和 pop的执行过程,这两个步骤是要熟练掌握的。
deepblue
[第2楼]   [ 回复时间:2009-05-08 09:04 ]   [引用]   [回复]   [ top ] 
荣誉值:56
信誉值:0
注册日期:2008-01-19 14:51
我看楼主假设的挺有道理,书上不是都说“8086cpu的入栈和出栈都是以字为单位进行的”。而且8086cpud的数据总线宽度是16,16bit正好是一个字。

既然一次操作一个字那么,sp——栈顶指针改变就是2了。:)
deepblue
[第3楼]   [ 回复时间:2009-05-08 09:08 ]   [引用]   [回复]   [ top ] 
荣誉值:56
信誉值:0
注册日期:2008-01-19 14:51
那为什么是减,说抽象点和cpu栈机制相关,说白了就是栈向高地址还是向低地址增长有关了
liucuan11
[第4楼]   [ 回复时间:2009-05-10 16:42 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2009-05-06 21:40
比如这个指令 mov ax,0 
执行过程是把0这个数据送入ax中。 
难道就是说是CPU的设计问题,不用管?? 
---------------------
书4页:存储单元可以存储8位二进制,即一个字节Byte。
而14页:寄存器AX,可以存储16位二进制,即两个字节(Byte),也就是所说的一个字(Word )
------------
为什么是减
假如将10000H-1000FH这段空间当作栈,栈为空,那么SS:SP指向1000:0010
当执行push ax后,1000EH-1000FH就存放AX数据,SS:SP就指向1000:000E,也就是SP=SP-2
zhenglxd
[第5楼]   [ 回复时间:2009-05-12 12:43 ]   [引用]   [回复]   [ top ] 
荣誉值:30
信誉值:0
注册日期:2009-04-09 10:05
给你个逻辑模型自己去揣摩 往一个浴缸里 放入物体 水面会发生变化 同样的 把这个物体拿出 水面也会发生变化 这个逻辑模型 和栈是一个道理
t181935471
[第6楼]   [ 回复时间:2009-05-25 22:21 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2009-04-09 19:14
这是8086cpu的栈机制,不用过分纠缠在上面
sdker
[第7楼]   [ 回复时间:2009-06-01 03:39 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2007-12-01 07:17
因为PUSH执行之前 SP指向的是当前栈顶
PUSH执行的时候是当前栈顶SP-2 给出的是数据入栈的位置咯
yjyyjs1987
[第8楼]   [ 回复时间:2009-06-01 22:26 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2009-06-01 21:36
你这个问题问得很基础,同时我也觉得挺深刻,因为越是简单的问题越能引发别人的思考,关于这个SP的问题,打个比方,如果你要把数据89D8从寄存器存入内存中,那么,它是传送两个字节,对不对,好,我把他存入1000:0,即10000H中,那么我们汇编指令为:MOV 【0】,ax .AX寄存器存着89D8这个数据,存入以后,请问我们的IP是不是会变化,变化了多少呢,答案是2,以此类比,我们的数据入栈,比如栈为空时,我们将89D8入栈,入了以后,好,请问我们的数据是不是要占空间那,它会占据栈中两个字节的空间,而我们入栈时指针sp指向的是你89D8占据空间之前的那个内存单元的位置(指的是上一个子单元),以此类推,你要对下个数据入栈时,咱们的指针SP是不是要相应的减去2,对吧?这下呢明白了吧!前面我说到,IP变化,其实和SP时相通的,都是告诉我们一个道理,我们想内存写入数据,它是会占据空间的,而IP和SP刚好就为我们指出他们下一刻往哪存入数据。
zhenglxd
[第9楼]   [ 回复时间:2009-06-05 17:08 ]   [引用]   [回复]   [ top ] 
荣誉值:30
信誉值:0
注册日期:2009-04-09 10:05
回复:[第8楼]
------------------
你的答复很基础, 我觉得 无规矩不成方圆 sp和ip 这个p是 pointer的意思 指针
其实是个变量
你要去操作内存 总不能每次 都打上 完整的 物理地址吧!

对于 一些函数 和类 肯定要用到变量的
sp,ip 性质和变量差不多!
当你要设计一个无比复杂的东西的时候, 栈的主要作用就是 存储具体的数据 赋给变量

就好象 你有一对东西 你要运动非常远地方 我们用不同的交通工具(变量)去运输不同的物体,如果没有交通工具呢? 那几乎是不可能完成的任务了
那么什么东西被运到什么地方 总要有标记对应吧。
iteny
[第10楼]   [ 回复时间:2009-07-20 20:50 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2009-07-20 10:14
看图啊,要指向低位当然要减了,PUSH是从高往低的
auty95
[第11楼]   [ 回复时间:2009-10-21 13:35 ]   [引用]   [回复]   [ top ] 
荣誉值:2
信誉值:0
注册日期:2009-10-09 11:42
我问楼主一个问题:为什么CS:IP 在载入下一条指令的时候 IP值会增加?
cpu对于确定的事情会有自动的操作,但是数据段就没有这么一个指针  因为我们读取数据不是顺序读取的
希望我说的你能理解。
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved