. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->包含多个段的程序
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  2个很神奇的问题 堆栈疑点。(王爽汇编第一版)  [待解决] 回复[ 5次 ]   点击[ 442次 ]  
cy512118091
[帖 主]   [ 发表时间:2010-10-21 19:30 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-10-21 07:50
这个问题发现于6.2章节,程序6.3。
assume cs:codesg 
codesg segment 
        dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h 
        dw 0,0,0,0,0,0,0,0 
         
start:  mov ax,cs 
        mov ss,ax 
        mov sp,32
         
        mov bx,0 
        mov cx,8 
s:      push cs:[bx] 
        add bx,2 
        loop s 

        mov bx,0 
        mov cx,8 
s0:     pop cs:[bx] 
        add bx,2 
        loop s0 

        mov ax,4c00h 
        int 21h 
codesg ends 
end start 

问题一:将此程序编译连接后,用debug跟踪 ,执行mov ax,cs 后用-d (cs):0看内存中的数据是:
23 01 56 04 89 07 BC 0A-EF 0D ED 0F BA 0C 87 09
00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00
这里是正常的,然后执行 mov ss,ax,再用-d (cs):0看内存中的数据就会变为:
23 01 56 04 89 07 BC 0A-EF 0D ED 0F BA 0C 87 09
00 00 00 00 00 00 55 0B-00 00 27 00 55 0B 5F 05
请问55 0B-00 00 27 00 55 0B 5F 05是哪里来的??

问题二:这个问题就相当神奇了,将此程序编译连接,用debug跟踪后用-t单步执行直至指令 mov ax,4c00h 为止,此时用-d (cs):0查看内存的结果是:
55 0B 00 00 ED 0F EF 0D-BC 0A 89 07 56 04 23 01
55 0B 55 0B 55 0B 55 0B-00 00 43 00 55 0B 5F 05
发现了吧,此时的结果和书上想要达成的结果是不一样的。
然后-q退出,再次跟踪,用-g 43直接执行到指令mov ax,4c00h 后用-d (cs):0查看内存的结果是:
87 09 BA 0C ED 0F EF 0D-BC 0A 89 07 56 04 23 01
87 09 BA 0C ED 0F EF 0D-00 00 43 00 55 0B 5F 05
这才是书上想要的结果。
问题就出来了,为什么单步执行和直接执行所达到的结果是不一样的呢??为什么会出现这种情况??

先给出我的操作环境,windows XP,运行---cmd下的伪DOS。
求解释。
abob
[第1楼]   [ 回复时间:2010-10-23 19:15 ]   [引用]   [回复]   [ top ] 
荣誉值:169
信誉值:0
注册日期:2008-08-19 16:07
请问55 0B-00 00 27 00 55 0B 5F 05是哪里来的?? 
---------------
t命令也叫单步中断。执行中断时会保护现场,在当前ss:sp处压栈要保存的数据。(注意看这些数据有没有cs:ip:),在回看实验二最后一问)

第二个问题同一个问题,是中断搞的鬼。

建议用command,虚拟dos,不要用cmd。他们很像,但还是不同的。
cy512118091
[第2楼]   [ 回复时间:2010-10-24 13:30 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-10-21 07:50
谢谢楼上的回答。
能不能具体说说t命令的单步中断是怎么执行的?第一步怎么样做,第二步怎么样做?
还有cmd和command的区别在何处?
qucklay
[第3楼]   [ 回复时间:2010-10-31 13:19 ]   [引用]   [回复]   [ top ] 
荣誉值:10
信誉值:0
注册日期:2009-06-25 23:01
标志寄存器:055f
CS:0b55
IP:0027
55 0B-00 00 为ISR保存的数据。
iegg
[第4楼]   [ 回复时间:2011-01-06 21:25 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2011-01-06 20:48
不要用T执行4c00h,用p执行试试
bzyxtsg
[第5楼]   [ 回复时间:2011-01-07 10:41 ]   [引用]   [回复]   [ top ] 
荣誉值:14
信誉值:6
注册日期:2010-12-20 13:34
我也是同样的疑惑,昨天晚上用笔和纸在草稿纸上对比了下。现在还困惑中涅!只是达人指点了中断,保护,还是朦朦胧胧。
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved