|
主题 : : 检测点6.1中第二小题的一些问题,求助~~~! [待解决] |
回复[ 19次 ]
点击[ 646次 ] | |
|
|
|
|
|
[帖 主]
[ 发表时间:2009-04-29 18:17 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2009-04-26 14:09 |
assume cs:codesg
codesg 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,28h (这是第二空,不能理解)
mov ax,0
mov ds,ax
mov bx,0
mov cx,8
s:push [bx]
pop cs:[bx] (这是第三空,能理解)
add bx,2
loop s
int 21h
codesg ends
end start
首先题目中定义为栈段的dw 0,0,0,0,0,0,0,0,0,0
为什么要定义10个字型数据作为栈段?
我看后面的程序好象都用不了那么多吧?
第二个问题是后面填的第二空,我看了别人的答案
就不明白这数是怎么来的了
请各位高手指点下啊 | | |
|
|
|
|
|
[第1楼]
[ 回复时间:2009-04-30 16:24 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2009-04-22 18:44 |
回答:
1)定义为栈段的dw 0,0,0,0,0,0,0,0,0,0中为什么要定义10个字型数据作为栈段?的原因:确实如楼主所说,后面的程序用不了那么多的内存空间,用这么多开辟内存空间是为分析所用。但有一点要说明的是你要仔细看看每次debug过程中定义成堆栈段的那段内存数据变化情况,定义多出来的那些内存空间是用来说明每次变化过程中堆栈所保存的相关寄存器AX,BP,IP,CS寄存器以及标志寄存器中的内容,以便于你自己在每次debug过程中分析。(P75的图分析了么?《汇编语言(第2版)》)
2)我个人认为第二空填十进制数值为36(十六进制数值为24h)。原因如下:
a.程序中(dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h)定义了8个字型单元存储这些数据,程序中(dw 0,0,0,0,0,0,0,0,0,0)定义了10个字单元用作栈空间,总共为8+10=18个字单元空间,转换成字节型单元为36个字节型单元空间。实际内存中存储数据(地址空间为cs:0000h~cs:0023h, 数据写在代码段时,存储数据的的段基址为cs段)为:
cs:0000h 23h
cs:0001h 01h ;存储了字内容0123h
cs:0002h 56h
cs:0003h 04h ;存储了字内容0456h
...
cs:0010h 00h
cs:0011h 00h ;存储了字内容0000h
...
cs:0020h 00h
cs:0021h 00h ;存储了字内容0000h
cs:0022h 00h
cs:0023h 00h ;存储了字内容0000h
当定义空栈时,栈指针指向栈底的下一个内存空间位置(注意当前定义的栈的栈底为cs:0023h!)(楼主参看p60(《汇编语言(第2版)》王爽)页第三段文字说明)。所以第二空应该填写十六进制24h(十进制数值为36) | | |
|
|
|
|
|
[第2楼]
[ 回复时间:2009-04-30 16:26 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2009-04-22 18:44 |
| 以上是个人的分析,有所纰漏之处,恳请交流,感激之情言语之所不能及。 | | |
|
|
|
|
|
[第3楼]
[ 回复时间:2009-04-30 17:24 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2009-04-26 14:09 |
首先非常感谢你这么详细的讲解,谢谢
按你的算法,栈底的最下面的地址应该为ss:24h是吗?
那我看到的答案的28H不是会超出栈段吗?
但,我用28H这个值debug出来的结果一样没出错
不是说栈超界是错误的吗?
为什么还能正常运行程序?? | | |
|
|
|
|
|
[第4楼]
[ 回复时间:2009-05-04 10:31 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2009-05-02 11:54 |
| 我看的答案是1a 我一看就表示怀疑答案的正确性 我的理解也是24H | | |
|
|
|
|
|
[第5楼]
[ 回复时间:2009-05-04 10:32 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2009-05-02 11:54 |
|
|
|
|
|
|
[第6楼]
[ 回复时间:2009-05-04 10:36 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2009-05-02 11:54 |
|
|
|
|
|
|
[第7楼]
[ 回复时间:2009-05-04 14:22 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2009-04-22 18:44 |
关于栈越界这个问题,我个人是这样认为的,栈越界实际只是针对用户所编写的程序来说的,计算机是没有能力管这些问题的。计算机只是根据用户把内存划分出来供用户使用,用户把计算机划分出来的地址空间是用栈的机制还是堆的方式甚至队列的方式来用这段内存空间,是完全由用户来指定的。
提出栈越界这个说法:1)是为了防止用户在用户不确定的内存空间写入或读出脏数据(这是主要的原因);2)方便用户在程序中明确分析与指定数据处理过程。
以上是个人的理解,恳请指正。 | | |
|
|
|
|
|
[第8楼]
[ 回复时间:2009-05-11 12:44 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2009-04-22 12:29 |
|
|
|
|
|
|
[第9楼]
[ 回复时间:2009-05-20 21:50 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2008-07-10 21:10 |
| 我用的是第二版,要是第二个空为28H,我觉得很难让人理解! | | |
|
|
|
|
|
[第10楼]
[ 回复时间:2009-05-24 08:01 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2009-01-17 12:29 |
| 我的理解是 定义了10字的空间做为栈,已知上面的8个字数据占用地址为CS:0到CS:F,那么这十个字占用地址应为CS:10到CS:23H,那么栈底SP就为CS:24。所以为24H。 | | |
|
|
|
|
|
[第11楼]
[ 回复时间:2009-12-12 15:51 ]
[引用]
[回复]
[ top ] | |
荣誉值:2
信誉值:0
注册日期:2009-12-07 22:09 |
哈哈。。看了上面的描述我也弄懂SP的设定了。。。
书是有两版本的,
一个是定义5个单元字形数据 0,0,0,0,0
sp=(8+5)*2 d=26d=1A h
一个是定义10个单元的字形数据0,0,0,0,0,0,0,0,0,0
sp=(8+10)*2 d=36d=24 h | | |
|
|
|
|
|
[第12楼]
[ 回复时间:2010-01-05 13:48 ]
[引用]
[回复]
[ top ] | |
荣誉值:6
信誉值:0
注册日期:2009-12-18 19:53 |
|
|
|
|
|
|
[第13楼]
[ 回复时间:2010-01-05 17:09 ]
[引用]
[回复]
[ top ] | |
荣誉值:61
信誉值:0
注册日期:2009-12-19 01:51 |
| 【栈空间设置在程序内】, 这话太重要啦! 我开始sp算的是16H, debug结果不对, 后来看大家分析又再好好看了看题目,唉。。。我算的16H再加上定义的8个程序段里字, 可不是24H嘛~(看书 还是不够仔细) | | |
|
|
|
|
|
[第14楼]
[ 回复时间:2010-01-10 02:05 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2009-09-27 16:19 |
| 我刚刚试过,mov sp,27h刚好可以,小于27不可以。 | | |
|
|
|
|
|
[第15楼]
[ 回复时间:2010-01-26 21:35 ]
[引用]
[回复]
[ top ] | |
荣誉值:3
信誉值:2
注册日期:2010-01-04 23:00 |
我计算出也是24H。
但是我怀疑:当数据内存信息所占内存不满16字节整数倍时,系统会分配到16字节整数倍内存。
这个我也是试了几次才发现。 | | |
|
|
|
|
|
[第16楼]
[ 回复时间:2010-02-08 09:47 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:1
注册日期:2010-01-22 20:12 |
| 呵呵原来如此我得到的答案也是1ah,很是怀疑原来是版本的问题啊 | | |
|
|
|
|
|
[第17楼]
[ 回复时间:2010-08-28 20:46 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2010-08-25 18:20 |
...
cs:0020h 00h
cs:0021h 00h ;存储了字内容0000h
cs:0022h 00h
cs:0023h 00h ;存储了字内容0000h
当定义空栈时,栈指针指向栈底的下一个内存空间位置(注意当前定义的栈的栈底为cs:0023h!)(楼主参看p60(《汇编语言(第2版)》王爽)页第三段文字说明)。所以第二空应该填写十六进制24h(十进制数值为36)
--------------------------------
(注意当前定义的栈的栈底为cs:0023h!)--> cs:0022h 才是栈底地址
一个字的地址是它低8位的那个地址,栈空时,sp=sp(栈底)+2
所以空栈时,栈底地址是cs:0024h
--------------------------------
我是新手 | | |
|
|
|
|
|
[第18楼]
[ 回复时间:2010-08-30 11:02 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2010-08-13 11:06 |
我记得 8个字=16字节=0010
10个字=8+2字=16+4字节=0014
然后0010+0014=0024
0023是存放一个字时的栈顶,0023+2=0025 是栈空是的栈顶,所以答案应该是0025吧? | | |
|
|
|
|
|
[第19楼]
[ 回复时间:2010-08-30 11:04 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2010-08-13 11:06 |
| 算错了,果然应该是0024,0010-0023=20字节。 | | |