|
主题 : : 提个问题,郁闷了十天了.总是想不通. [待解决] |
回复[ 7次 ]
点击[ 640次 ] | |
|
|
|
|
[帖 主]
[ 发表时间:2009-07-04 12:36 ]
[引用]
[回复]
[ top ] | |
荣誉值:1
信誉值:8
注册日期:2009-06-27 18:30 |
第118页程序6.3如下:
assume cs:code
code 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
code ends
end start
在这里栈段在CS中,段地址和CS段地址相同,我想问的是:这个栈段的大小是多少呢?1.和CS段相同大小.还是2、大小为CS:0--CS:32。总是不得其解,望清楚的不吝指教!!!在线等。具体说明一下,我总是对栈段的大小设定糊涂。如仅指明了,SS和SP,那不是只说明栈顶在哪里吗? | | |
|
|
|
|
[第1楼]
[ 回复时间:2009-07-05 19:29 ]
[引用]
[回复]
[ top ] | |
荣誉值:33
信誉值:0
注册日期:2008-10-16 10:01 |
8086汇编是没法给出栈段的大小的,所以只能人为控制,就是说你必须留出足够的空间来作为栈来使用。 | | |
|
|
|
|
[第2楼]
[ 回复时间:2009-07-14 14:17 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2009-07-09 16:47 |
我也是初学者,才学了3天,对于你这个问题谈一下我的看法
1.本例子是在引出一个程序中多个段而设计的
2.本例子中的堆栈段和代码段公用了同一个段地址
3.关于段大小,SS段的大小为32(20h)字节,代码段要大一些,因为后面还有一些代码,具体多少我们就不用去关心了。
4.对于一个栈来讲,指明了ss和sp就可以了,空栈的时候sp指向栈的最高地址+1,数值上等于栈空间字节数 | | |
|
|
|
|
[第3楼]
[ 回复时间:2009-07-14 15:37 ]
[引用]
[回复]
[ top ] | |
荣誉值:61
信誉值:4
注册日期:2008-10-14 16:29 |
如仅指明了,SS和SP,那不是只说明栈顶在哪里吗?
==============
是的。但是,我们在进行栈操作的时候,变动的是sp这个偏移地址,所以,如果不算越界的话,从栈顶到0的这段空间就是栈的合理空间,栈操作都会影响到。(实际上,在dos下是没有越界检测的,所以,当sp==0的时候,在push的话,会产生段内环绕,sp编程000EH,如此,栈操作依然能够操作现在对应的内存) | | |
|
|
|
|
[第4楼]
[ 回复时间:2009-07-28 14:59 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2009-07-25 09:36 |
你确定你这段程序能得到你预想的结果吗?你debug,可以看到前面运行的指令会改变后面的指令,那么运行到后面时就不是原先写的指令了,cpu是一条一条执行下去,即使后面的指令改了,只要可执行,它是不会报错的 | | |
|
|
|
|
[第5楼]
[ 回复时间:2009-07-31 00:25 ]
[引用]
[回复]
[ top ] | |
荣誉值:2
信誉值:0
注册日期:2009-04-08 06:33 |
第一个DW 相当于数据段 从CS:0~CS:F
第二个DW 相当于栈段 从CS:10~CS:1F
再下来就相当于 代码段了 | | |
|
|
|
|
[第6楼]
[ 回复时间:2009-07-31 00:27 ]
[引用]
[回复]
[ top ] | |
荣誉值:2
信誉值:0
注册日期:2009-04-08 06:33 |
有时候这样的栈段长度太短,会不够用,因为系统在执行某些指令的时候也会用到栈,所以SP会超界,也就是会改变CS:0~CS:F中的高地址的一些数据,程序执行就会出错了,所以有时应该把栈段定义长点,比如16个字的长度 | | |
|
|
|
|
[第7楼]
[ 回复时间:2009-07-31 00:27 ]
[引用]
[回复]
[ top ] | |
荣誉值:2
信誉值:0
注册日期:2009-04-08 06:33 |
|