. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->寄存器(内存访问)
主题 : :  第三章最后一个任务整不明白  [待解决] 回复[ 25次 ]   点击[ 2541次 ]  
helloworld
[帖 主] [ 发表时间:2007-10-25 11:21 ] 
荣誉值:10
信誉值:6
注册日期:2007-10-20 14:34
0B07:0100 mov ax,2000
0B07:0103 mov ss,ax
0B07:0105 mov sp,10 
0B07:0108 mov ax,3123 
0B07:010B push ax
0B07:010C mov ax,3366
0B07:010F push ax 

实验问我20000H---2000FH的数据为什么会改变,那这不明摆着代码将栈段设为20000H-2000FH这个范围,push以后,肯定是将ax的数据压进这个段里的,那所以就变了嘛,但我不知道他怎么把cs:ip的数据压进去了,而不是将3123压进去?
zhang898600
[第23楼] [ 回复时间:2012-07-09 12:02 ] 
荣誉值:0
信誉值:0
注册日期:2012-06-11 21:15
执行T命令会产生中断,中断程序执行前会将相关寄存器的值入栈保存起来,顺序如下:
先是标志寄存器入栈 
接着CS寄存器入栈 
接着IP寄存器入栈
然后执行中断程序,但是中断程序是一个子程序,这个子程序的开头也会将子程序中用到的一些寄存器的值先入栈保存起来(比如子程序中用到AX,在程序开头就要先PUSH AX,这样做是为了防止原先AX中的内容会被修改),T命令产生的中断例程可能用到了BP,AX寄存器所以会接着将他们入栈,顺序如下: 
接着是BP寄存器入栈 
最着是AX寄存器入栈 
当执行完中断子程序后出栈的顺序如下:
POP AX
POP BP
POP IP
POP CS
POPF(标志寄存器出栈)
此时SP指向的栈顶为空(恢复到了原先状态),但是入栈操作的数据依然会留在内存单元当中,所以T命令的整个过程SP的值是没有发生变化的
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved