. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->寄存器(内存访问)
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  问一下本书61页的问题3.8 , 谢谢!  [待解决] 回复[ 2次 ]   点击[ 535次 ]  
feier
[帖 主]   [ 发表时间:2007-06-27 20:49 ]   [引用]   [回复]   [ top ] 
荣誉值:5
信誉值:3
注册日期:2007-06-23 22:00
问一下本书61页的 问题3.8
mov ax,1000H
mov ss,ax
mov sp,0010H
mov ax,001AH
mov bx,001BH
push ax
push bx
sub ax,ax
sub bx,bx
pop bx
pop ax
我在机器上试过了,代码根本执行不到mov sp,0010H这句,我把cs=1000,ip=0000,当执行完
mov ax,1000H
ip=0003,
再执行完mov ss,ax这句,
ip=0008了,所以就执行不到mov sp,0010H这句。
mov ss,ax的机器码是两个字节,不应该是5个字节啊
请大家帮忙看看!谢谢了
cxn
[第1楼]   [ 回复时间:2007-07-15 20:41 ]   [引用]   [回复]   [ top ] 
荣誉值:179
信誉值:6
注册日期:2007-07-09 19:18
这个问题问的好,这是8086系列cpu就是这样设计的。mov sp,10H 实际上也执行了你可以用debug的R命令查看sp的值发现已经改变了。
之所这样设计是有道理的,ss:sp永远都指向栈顶如果改变了ss的值而不改变sp的值那么ss:sp就会指向错误的栈,这时如果有数据进栈就会发生错误,比如发生中断. 所以cpu在设计时就设计成了如果在改变ss的值后会紧接着再执行一条语句的形式来避免栈出错. 这种设计思想还存在于其它个别的指令上.
13784632020
[第2楼]   [ 回复时间:2010-07-08 21:06 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:2
注册日期:2010-07-02 05:46
一楼回答得好,我一直考虑是在指定ss时合并执行了sp这一句,但不知道原因,原来避免出现错误栈啊
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved