|
主题 : : 关于检测点6.1(2)题目的问题 [待解决] |
回复[ 8次 ]
点击[ 923次 ] | |
|
|
|
|
[帖 主]
[ 发表时间: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字的栈段,也是出了像上面据说的一样的错误
只是想说说这个栈段有时不能定义太短了,不知我这样子认为是否对不对? | | |
|
|
|
|
[第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 跟中断之类的有关,执行它就会改变内存单元中的数据。
不好意思,我也是新人,还没看到那里~呼叫高人啊~! | | |
|
|
|
|
[第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.....].......].
- | | |
|
|
|
|
[第3楼]
[ 回复时间:2009-08-06 02:28 ]
[引用]
[回复]
[ top ] | |
荣誉值:2
信誉值:0
注册日期:2009-04-08 06:33 |
谢谢楼上两位大虾的帮助,小弟明白了,
是因为程序返回后,把栈段中的数据改变了,
原来是因为这个int 21H
谢谢你们的回答! | | |
|
|
|
|
[第4楼]
[ 回复时间:2009-11-05 10:32 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:16
注册日期:2009-10-21 20:01 |
我与2楼一样的看法.当时我想,既然一入一出只要2个字节(一个字),为何还要定义10个字? | | |
|
|
|
|
[第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了。。。。 | | |
|
|
|
|
[第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中的内容覆盖程序中的数据 | | |
|
|
|
|
[第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
此时查看 完全一样的 | | |
|
|
|
|
[第8楼]
[ 回复时间:2010-02-03 22:49 ]
[引用]
[回复]
[ top ] | |
荣誉值:61
信誉值:0
注册日期:2009-12-19 01:51 |
|
|