. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->包含多个段的程序
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  第六章检测点6.1(2)困惑处,望高手指点  [待解决] 回复[ 2次 ]   点击[ 623次 ]  
debugkkk
[帖 主]   [ 发表时间:2008-05-12 16:06 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:16
注册日期:2008-03-17 20:21
先来正确的代码,如下为栈空间为5个字单元时的代码 
ASSUME CS:CODE 
CODE SEGMENT 
     DW 0123H,0456H,0789H,0ABCH,0DEFH,0CBAH,0FEDH,0987H 
     DW 0,0,0,0,0 

START:MOV AX,CS 
      MOV SS,AX 
      MOV SP,1AH 
      MOV AX,0 
      MOV DS,AX 
      MOV BX,0 
      MOV CX,8       
   S:PUSH [BX] 
     POP CS:[BX] 
     ADD BX,2 
     LOOP S 
      
  MOV AX,4C00H 
  INT 21H 
CODE ENDS 
END START 

再来用4个子单元做栈空间时的代码 
ASSUME CS:CODE 
CODE SEGMENT 
     DW 0123H,0456H,0789H,0ABCH,0DEFH,0CBAH,0FEDH,0987H 
     DW 0,0,0,0 

START:MOV AX,CS 
      MOV SS,AX 
      MOV SP,18H 
      MOV AX,0 
      MOV DS,AX 
      MOV BX,0 
      MOV CX,8       
   S:PUSH [BX] 
     POP CS:[BX] 
     ADD BX,2 
     LOOP S 
      
  MOV AX,4C00H 
  INT 21H 
CODE ENDS 
END START 
debug结果如JCD612-4.jpg所示,可以正确改写。 
http://www.asmedu.net/blog/user/bigimg.jsp?neighborId=8606&pic=pic_1210578526953.jpg 

再来用3个子单元做栈空间的代码: 

ASSUME CS:CODE 
CODE SEGMENT 
     DW 0123H,0456H,0789H,0ABCH,0DEFH,0CBAH,0FEDH,0987H 
     DW 0,0,0 

START:MOV AX,CS 
      MOV SS,AX 
      MOV SP,16H 
      MOV AX,0 
      MOV DS,AX 
      MOV BX,0 
      MOV CX,8       
   S:PUSH [BX] 
     POP CS:[BX] 
     ADD BX,2 
     LOOP S 
      
  MOV AX,4C00H 
  INT 21H 
CODE ENDS 
END START 

debug结果如JCD612-3.jpg所示,即程序中的0987H没有被正确改写 
http://www.asmedu.net/blog/user/bigimg.jsp?neighborId=8606&pic=pic_1210578517187.jpg 

再来用2个子单元做栈空间的代码: 

ASSUME CS:CODE 
CODE SEGMENT 
     DW 0123H,0456H,0789H,0ABCH,0DEFH,0CBAH,0FEDH,0987H 
     DW 0,0 
START:MOV AX,CS 
      MOV SS,AX 
      MOV SP,14H 
      MOV AX,0 
      MOV DS,AX 
      MOV BX,0 
      MOV CX,8       
   S:PUSH [BX] 
     POP CS:[BX] 
     ADD BX,2 
     LOOP S 
      
  MOV AX,4C00H 
  INT 21H 
CODE ENDS 
END START 

debug结果如JCD612-2.jpg所示,即程序中的0cbaH,0987H没有被正确改写 
http://www.asmedu.net/blog/user/bigimg.jsp?neighborId=8606&pic=pic_1210578505562.jpg 

再来只用1个子单元做栈空间的代码: 

ASSUME CS:CODE 
CODE SEGMENT 
     DW 0123H,0456H,0789H,0ABCH,0DEFH,0CBAH,0FEDH,0987H 
     DW 0 
START:MOV AX,CS 
      MOV SS,AX 
      MOV SP,12H 
      MOV AX,0 
      MOV DS,AX 
      MOV BX,0 
      MOV CX,8       
   S:PUSH [BX] 
     POP CS:[BX] 
     ADD BX,2 
     LOOP S 
      
  MOV AX,4C00H 
  INT 21H 
CODE ENDS 
END START 
debug结果如JCD612-1.jpg所示,即程序中的0fedH,0cbaH,0987H没有被正确改写 
http://www.asmedu.net/blog/user/bigimg.jsp?neighborId=8606&pic=pic_1210578492015.jpg 

不会弄链接,大家自己点过去看看吧! 


实在不明白为什么只用1-3个子单元做栈空间时拷贝会出错,还望高手指点。
yigeling
[第1楼]   [ 回复时间:2008-05-12 21:00 ]   [引用]   [回复]   [ top ] 
荣誉值:7
信誉值:0
注册日期:2008-01-29 17:57
就是t或p命令也需要用栈,栈太小时,可能冲掉前面的数据。
mouse
[第2楼]   [ 回复时间:2008-05-13 09:15 ]   [引用]   [回复]   [ top ] 
荣誉值:472
信誉值:12
注册日期:2007-10-16 15:34
这个问题和实验三碰到的问题有联系,中断的保护现场使用到了栈,也就是当前的ss,sp,所以会出现栈中有些数据变化了,或是程序直接错误退出(实验三)。
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved