首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 汇编语言 >

那些关于ss寄存器的事,该如何处理

2013-03-25 
那些关于ss寄存器的事代码如下:assume cs:codecode segmentstart:mov ax,0b800hmov ss,axnopnopmov ax,4c0

那些关于ss寄存器的事
代码如下:
assume cs:code
code segment
start:mov ax,0b800h
      mov ss,ax
      nop
      nop
      mov ax,4c00h
      int 21h
code ends
end start
与:
assume cs:code
stack segment
db 16 dup(0)
stack ends
code segment
start:mov ax,stack
      mov ss,ax
      nop
      nop
      mov ax,4c00h
      int 21h
code ends
end start
同样都是对ss寄存器赋值,为什么前者不能返回,后者能返回!

[解决办法]
把堆栈段放在其它中断极可能访问的地方,push进堆栈的内容得不到保障,需要pop的时候已经不对了,程序运行就有问题。后者能返回也不是必然的。程序刚加载运行,如果我没记错的话,sp的值好像是0fffeH吧?你的程序只切换了ss,没切换sp,也可能出问题的,只是运行就退出,碰到问题的概率小而已。
[解决办法]
缺省的堆栈是 psp:0000 ,sp 回绕,即将堆栈设置在了 psp 所在段的最后。你将 ss 置为 B800 ,这是视频缓冲区吧,再看看该段最后是什么内容,修改下,再看看,变化了吗?根本就是不可改的虚空地址空间嘛,即无法进行正常的压栈保存操作的,又怎么能正常返回呢?

热点排行