. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->寄存器(内存访问)
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  在做入栈操作时,为何有其他内存单元的内容同时被修改?  [待解决] 回复[ 2次 ]   点击[ 318次 ]  
flyjiejie
[帖 主]   [ 发表时间:2009-08-25 20:42 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2009-08-23 10:07
假设将[1000:0,1000:f]作为栈段,大小为16字节,请耐心看完如下在debug中的运行过程:

********************************************************************************
-r(寄存器及内存初始情况)
AX=1234  BX=0000  CX=0000  DX=0000  SP=0010  BP=0000  SI=0000  DI=0000
DS=0B46  ES=0B46  SS=1000  CS=0B46  IP=0100   NV UP EI PL NZ NA PO NC
0B46:0100 50            PUSH    AX
-d ss:0 1f
1000:0000  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................
1000:0010  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................

-t(第一次执行PUSH AX)
AX=1234  BX=0000  CX=0000  DX=0000  SP=000E  BP=0000  SI=0000  DI=0000
DS=0B46  ES=0B46  SS=1000  CS=0B46  IP=0101   NV UP EI PL NZ NA PO NC
0B46:0101 50            PUSH    AX
-d ss:0 1f
1000:0000  00 00 00 00 34 12 00 00-01 01 46 0B AA 05 34 12   ....4.....F...4.
1000:0010  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................

-t(第二次执行PUSH AX)
AX=1234  BX=0000  CX=0000  DX=0000  SP=000C  BP=0000  SI=0000  DI=0000
DS=0B46  ES=0B46  SS=1000  CS=0B46  IP=0102   NV UP EI PL NZ NA PO NC
0B46:0102 50            PUSH    AX
-d ss:0 1f
1000:0000  00 00 34 12 00 00 02 01-46 0B AA 05 34 12 34 12   ..4.....F...4.4.
1000:0010  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................

-t(第三次执行PUSH AX)
AX=1234  BX=0000  CX=0000  DX=0000  SP=000A  BP=0000  SI=0000  DI=0000
DS=0B46  ES=0B46  SS=1000  CS=0B46  IP=0103   NV UP EI PL NZ NA PO NC
0B46:0103 50            PUSH    AX
-d ss:0 1f
1000:0000  34 12 00 00 03 01 46 0B-AA 05 34 12 34 12 34 12   4.....F...4.4.4.
1000:0010  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................

-t(第四次执行PUSH AX)
AX=1234  BX=0000  CX=0000  DX=0000  SP=0008  BP=0000  SI=0000  DI=0000
DS=0B46  ES=0B46  SS=1000  CS=0B46  IP=0104   NV UP EI PL NZ NA PO NC
0B46:0104 92            XCHG    DX,AX
-d ss:0 1f
1000:0000  00 00 04 01 46 0B AA 05-34 12 34 12 34 12 34 12   ....F...4.4.4.4.
1000:0010  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................
********************************************************************************

问题:
在第一次做完"push ax"操作后,内存段[1000:4,1000:d]的内容也被修改为“34 12 00 00-01 01 46 0B AA 05”,且之后每次入栈操作都会把这段数据往内存的低地址位移动,而且这段数据中有一个字节数据还会被修改(好像是在计数),请问这是为什么呢?
tinyparticle
[第1楼]   [ 回复时间:2009-08-26 18:09 ]   [引用]   [回复]   [ top ] 
荣誉值:188
信誉值:4
注册日期:2009-07-05 19:26
debug下T命令引发单步中断过程,在调用中断例程之前,中断过程会使用当前栈空间保存一些cpu运行现场的数据,以便从中断例程返回到你的程序的时候,依然能够正确运行你的程序。 
cpu则先将标志寄存器进栈,再把当前的cs的值进栈,最后将ip的值进栈,这个后面学到中断有讲,这是一种保护,这涉及到中断的知识,后面的章节会学习到的。

LZ提问前可以先看下论坛里的相关问题,这个问题有很多人提过了呦~
flyjiejie
[第2楼]   [ 回复时间:2009-08-26 18:50 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2009-08-23 10:07
今天看第三章最后一个实验,才发觉是一个道理,虽然现在还不是太懂,但谢谢指教了,以后发帖我尽量注意。呵呵。
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved