. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->包含多个段的程序
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  关于检测点6.1(2)题目的问题  [待解决] 回复[ 8次 ]   点击[ 923次 ]  
891204dh
[帖 主]   [ 发表时间:2009-07-31 00:08 ]   [引用]   [回复]   [ top ] 
荣誉值:2
信誉值:0
注册日期:2009-04-08 06:33
题目:依次用内存0:0~0:15单元中的内容改写程序中的数据,数据的传送用栈来进行
我的代码是
assume cs:code
code segment
    dw 0123H,0456H,0789H,0abcH,0defH,0fedH,0cbaH,0987H
    dw 0,0,0,0,0,0,0,0,0,0        ;定义栈
start: mov ax,cs
       mov ss,ax
       mov sp,24H
       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
这样子做 我发现个问题,就是栈段如果定义太小了,这个程序不能达到题目的要求
程序运行完后
-g

Program terminated normally
-d 0:0 f
0000:0000  68 10 A7 00 BB 13 1C 0E-16 00 B2 03 B1 13 1C 0E   h...............
-d cs:0 f
142C:0000  68 10 A7 00 BB 13 1C 0E-16 00 B2 03 13 3E 4F 03   h............>O.
明显就错误了
可是我将栈段定义为16字的时候
assume cs:code
code segment
    dw 0123H,0456H,0789H,0abcH,0defH,0fedH,0cbaH,0987H
    dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0        ;定义栈
start: mov ax,cs
       mov ss,ax
       mov sp,30H
       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
运行就没有问题了
-g

Program terminated normally
-d0:0 f
0000:0000  68 10 A7 00 BB 13 1E 0E-16 00 B2 03 B1 13 1E 0E   h...............
-d cs:0 f
142F:0000  68 10 A7 00 BB 13 1E 0E-16 00 B2 03 B1 13 1E 0E   h...............
是因为,程序在运行的时候,系统也用到了栈,一开始栈段太小,所以SP超界了,导致程序运行错误,可是书上就是定义了10字的栈段呀,在我电脑上(XP的CMD)运行就是错了,书中 程序6.3 那个例子也是一样的,这个例子中一开始用的是16字的栈段,我后面觉得这样弄栈段太长了,所以只用了8字的栈段,也是出了像上面据说的一样的错误
只是想说说这个栈段有时不能定义太短了,不知我这样子认为是否对不对?
inuyashall
[第1楼]   [ 回复时间:2009-08-01 23:43 ]   [引用]   [回复]   [ top ] 
荣誉值:9
信誉值:1
注册日期:2009-05-09 14:55
我认为你第一个程序是正确的(好歹dw 0,0,0,0,0,0,0,0,0,0 是书上给的啊= =//)

1、dw(define word)只是定义了一个数据段。
 是     mov ax,cs 
       mov ss,ax 
       mov sp,30H 
将ss:sp指向cs:30h的,从而把刚才定义的10个字单元用作字空间。

2、应该在 mov ax,4c00H 之前(CPU执行后,程序返回前)查看内存单元中的内容(我觉得这就是你的问题所在)。不信你试试看~你的第一个程序没问题~
貌似 mov ax,4c00H int 21H 跟中断之类的有关,执行它就会改变内存单元中的数据。
不好意思,我也是新人,还没看到那里~呼叫高人啊~!
tinyparticle
[第2楼]   [ 回复时间:2009-08-02 01:56 ]   [引用]   [回复]   [ top ] 
荣誉值:188
信誉值:4
注册日期:2009-07-05 19:26
LZ的第一个问题
内存0:0~0:15单元共16个字节,书中栈设定了10个字(20个字节),不存在栈过小的问题。其实根据这个程序来说1个字就够(只用到一个字,压入一个字,立即就出栈了)

第二个问题
程序返回到操作系统后,内存中的数据可能被其它程序改变了。
在程序返回前你查看一下内存中的数据,应该是正确的。
当执行了int 21h这条指令,我们调试的程序就结束了生命,此时回到了debug的内存空间里。 
所以你在执行int 21h指令之前查看内存才是你想查看的。
下面是sp取值24H时,debug单步跟踪的结果
-t
AX=0000  BX=000E  CX=0001  DX=0000  SP=0024  BP=0000  SI=0000  DI=0000
DS=0000  ES=0C3E  SS=0C4E  CS=0C4E  IP=003B   NV UP EI PL NZ NA PO NC
0C4E:003B 83C302        ADD     BX,+02
-t
AX=0000  BX=0010  CX=0001  DX=0000  SP=0024  BP=0000  SI=0000  DI=0000
DS=0000  ES=0C3E  SS=0C4E  CS=0C4E  IP=003E   NV UP EI PL NZ AC PO NC
0C4E:003E E2F6          LOOP    0036
-t
AX=0000  BX=0010  CX=0000  DX=0000  SP=0024  BP=0000  SI=0000  DI=0000
DS=0000  ES=0C3E  SS=0C4E  CS=0C4E  IP=0040   NV UP EI PL NZ AC PO NC
0C4E:0040 B8004C        MOV     AX,4C00
-t
AX=4C00  BX=0010  CX=0000  DX=0000  SP=0024  BP=0000  SI=0000  DI=0000
DS=0000  ES=0C3E  SS=0C4E  CS=0C4E  IP=0043   NV UP EI PL NZ AC PO NC
0C4E:0043 CD21          INT     21
-d 0:0 f
0000:0000  68 10 A7 00 BB 13 5D 06-16 00 9E 03 B1 13 5D 06   h.....].......].
-d 0c4e:0 f
0C4E:0000  68 10 A7 00 BB 13 5D 06-16 00 9E 03 B1 13 5D 06   h.....].......].
-
891204dh
[第3楼]   [ 回复时间:2009-08-06 02:28 ]   [引用]   [回复]   [ top ] 
荣誉值:2
信誉值:0
注册日期:2009-04-08 06:33
谢谢楼上两位大虾的帮助,小弟明白了,
是因为程序返回后,把栈段中的数据改变了,
原来是因为这个int 21H
谢谢你们的回答!
heiok.com
[第4楼]   [ 回复时间:2009-11-05 10:32 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:16
注册日期:2009-10-21 20:01
我与2楼一样的看法.当时我想,既然一入一出只要2个字节(一个字),为何还要定义10个字?
sysop
[第5楼]   [ 回复时间:2009-11-06 08:26 ]   [引用]   [回复]   [ top ] 
荣誉值:2
信誉值:1
注册日期:2008-06-04 14:46
LZ的第一个问题
内存0:0~0:15单元共16个字节,书中栈设定了10个字(20个字节),不存在栈过小的问题。其实根据这个程序来说1个字就够(只用到一个字,压入一个字,立即就出栈了)
......
------------------
回复:确实如此。。。。一开始也觉得不可思议,用5个字怎么可能把8个字都压进栈里。。。却忽略了 push之后马上pop了。。。。
yisheng1025
[第6楼]   [ 回复时间:2009-12-07 13:51 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:2
注册日期:2009-12-06 15:51
谁也帮我看看,基本和他一样的问题,
assume cs:codesg  
codesg segment  
  dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h  
  dw 0h,0h  
  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  
codesg ends  
end start       
这是错误的           


assume cs:codesg  
codesg segment  
  dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h  
  dw 0h,0h  
  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  
codesg ends  
end start       
这是正确的,  
问题是:用内存0:0~0:f中的内容覆盖程序中的数据
xouou_53320
[第7楼]   [ 回复时间:2010-02-03 21:49 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-01-13 15:12
-t

AX=0000  BX=000E  CX=0001  DX=0000  SP=0024  BP=0000  SI=0000  DI=0000
DS=0000  ES=0B67  SS=0B77  CS=0B77  IP=003B   NV UP EI PL NZ NA PO NC
0B77:003B 83C302        ADD     BX,+02
-t

AX=0000  BX=0010  CX=0001  DX=0000  SP=0024  BP=0000  SI=0000  DI=0000
DS=0000  ES=0B67  SS=0B77  CS=0B77  IP=003E   NV UP EI PL NZ AC PO NC
0B77:003E E2F6          LOOP    0036
-t

AX=0000  BX=0010  CX=0000  DX=0000  SP=0024  BP=0000  SI=0000  DI=0000
DS=0000  ES=0B67  SS=0B77  CS=0B77  IP=0040   NV UP EI PL NZ AC PO NC
0B77:0040 CD21          INT     21
-d 0:0 f
0000:0000  68 10 A7 00 BB 13 79 05-16 00 AD 03 B1 13 79 05   h.....y.......y.
-d cs:0 f
0B77:0000  68 10 A7 00 BB 13 79 05-16 00 AD 03 B1 13 79 05   h.....y.......y.
-

当cx=0时循环结束  int21
此时查看  完全一样的
regex
[第8楼]   [ 回复时间:2010-02-03 22:49 ]   [引用]   [回复]   [ top ] 
荣誉值:61
信誉值:0
注册日期:2009-12-19 01:51
同意2楼的。
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved