CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
山寨机中的战斗机! 程序优化工程师到底对IT界有没有贡献
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  其他开发语言 >  汇编语言

压入堆栈的时候,为什么只压DS和ES?

楼主litop(火龙)2003-11-01 16:45:52 在 其他开发语言 / 汇编语言 提问

各位老大:  
          在这段程序中,为什么只压DS和ES?CS和SS不用压入吗,为什么啊?  
  _OSCtxSw   proc   far  
                    pusha  
                    push   es  
                    push   ds  
   
                    mov   ax,seg   _ostcbcur  
                    mov   ds,ax  
  .........  
                    pop   ds  
                    pop   es  
                    popa  
  问题点数:100、回复次数:21Top

1 楼csdsjkk()回复于 2003-11-03 11:51:17 得分 10

在子程序里,  
  如果要使用(改变)某些寄存器,  
  而这些寄存器又要保持它们在主程序里的原值,  
  那么可以在使用(改变)它们前先把原值‘保护’起来,  
  一个简单的‘保护’方法就是:    
  push   xx  
  用完后再  
  pop   xx  
  恢复原值Top

2 楼bluedreammer(瀟瀟鳥)回复于 2003-11-03 12:57:11 得分 10

cs是代碼段寄存器,沒見過直接push   cs,遠調用子程序的時候,自動把cs壓棧.  
  ss是堆棧段寄存器,一般也不會壓棧了.Top

3 楼dunkel(内心和夜 哪个黑)回复于 2003-11-04 14:07:47 得分 10

堆栈一般都是程序/进程共用的,   所以不需要进行   "保存/恢复"   的操作.    
  至于   cs,   虽然不是象   bluedreammer(瀟瀟鳥)   说的那样   "沒見過直接push   cs",   不过不是为了保存   cs   的,   而往往是为了赋值给其他的段寄存器:     push     cs               pop     ds     (cs->ds).    
  不需要对   cs   进行   "保存/恢复"   是由于执行转移指令对(int?/iret,   call   far/retf)本身就包含了   cs   的保存和恢复功能.Top

4 楼hswxf(黄山一刀)回复于 2003-11-04 21:23:07 得分 10

楼上说的偏激了些吧  
  应该是你说的与bluedreammer(瀟瀟鳥)   说的还有其它一些应用  
  这样才完整一些Top

5 楼qiume(好好回贴,天天胖胖)回复于 2003-11-05 18:11:53 得分 5

在过程调用用只需要保护那些可能受影响的寄存器Top

6 楼bluesky202348(恶魔猎人)回复于 2003-11-05 19:19:08 得分 5

既然那些寄存器在此程序中未用到,又何必要把他们寄存呢?Top

7 楼aabiao()回复于 2003-11-05 23:18:56 得分 5

压入/弹出只是手段  
  目的是保护  
  。。。Top

8 楼o1n(小毛子)回复于 2003-11-05 23:29:51 得分 5

只是你一般只见过push   ds   push   es没见过别的,可并不表示没有这种情况!Top

9 楼W32API()回复于 2003-11-06 00:15:16 得分 5

比较同意     dunkel(内心和夜   哪个黑)   的观点Top

10 楼baobeixiong(宝贝熊)回复于 2003-11-06 17:40:52 得分 0

upTop

11 楼lovenoend(有容乃大)回复于 2003-11-06 18:39:14 得分 5

push   ds   push   es  
  是为了保护数据段,  
  你用push   cs   push   ss也可以,  
  但为了什么  
   
   
  Top

12 楼yinjintao(thinking in money)回复于 2003-11-06 20:40:44 得分 5

push   ss有什么用?Top

13 楼litop(火龙)回复于 2003-11-07 15:05:54 得分 0

cs   和   ss不用保护吗?Top

14 楼yinjintao(thinking in money)回复于 2003-11-07 19:10:57 得分 5

cs不用,ss不太清楚...Top

15 楼W32API()回复于 2003-11-07 20:55:51 得分 5

SS,你只是写应用程序的话,那我看大可不必;写操作系统的话,那也大可不必,页面映射更好。Top

16 楼litop(火龙)回复于 2003-11-08 10:13:01 得分 0

upTop

17 楼stone1982(强)回复于 2003-11-08 11:23:54 得分 5

对于pop而言,你可以从教材中就可以知道,cs段寄存器是不可以作为  
  操作数的(ss是可以的),在进行硬件电路的设计中的,它的作用是大致有了明确用途的  
  我们知道汇编语言是直接面向硬件的,所以其就考虑了各自的功能。  
  Top

18 楼bw78619(Genghis Khan)回复于 2003-11-09 16:44:02 得分 5

cs,ss也用保护,不过当调用call,int指令的时候,他会自动的先将cs压入栈中。  
  Top

19 楼xiaofeng_cxy(萧风)回复于 2003-11-10 10:54:33 得分 5

阁下也在看uc/os啊!!  
  我也是看不懂他的汇编的那段  
  有时间多交流啊!!  
  QQ:422150  
  email:   zhuxiangguo@163.net  
  msn:   zhuxiangguo@msn.comTop

20 楼litop(火龙)回复于 2003-11-13 08:57:07 得分 0

TO:xiaofeng_cxy(萧风)  
        是啊,我觉得汇编的那段太难懂了。你都是搞单片机的吧,那我们交流下啊.我现系南海,你呢?Top

21 楼litop(火龙)回复于 2004-03-03 16:31:27 得分 0

谢谢大家的讨论!Top

相关问题

  • 堆 、?栈 、?堆栈
  • ************************************堆,栈,堆栈********************************
  • 堆,栈?
  • cout和堆栈应用的时候发现了问题??
  • cout和堆栈应用的时候发现了问题??
  • cout和堆栈应用的时候发现了问题??
  • cout和堆栈应用的时候发现了问题??
  • 如何区别堆和堆栈,他们各自在什么时候使用?
  • 堆,栈,静态存储区的区别是什么?什么时候用?
  • 堆栈溢出

关键词

  • ds
  • 寄存器
  • cs
  • es
  • 原值
  • push
  • 保护
  • 保存
  • ss
  • 恢复

得分解答快速导航

  • 帖主:litop
  • csdsjkk
  • bluedreammer
  • dunkel
  • hswxf
  • qiume
  • bluesky202348
  • aabiao
  • o1n
  • W32API
  • lovenoend
  • yinjintao
  • yinjintao
  • W32API
  • stone1982
  • bw78619
  • xiaofeng_cxy

相关链接

  • CSDN Blog
  • 技术文档
  • 代码下载
  • 第二书店
  • 读书频道

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo