. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->包含多个段的程序
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  提个问题,郁闷了十天了.总是想不通.  [待解决] 回复[ 7次 ]   点击[ 640次 ]  
wsay666
[帖 主]   [ 发表时间: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,那不是只说明栈顶在哪里吗?
wsrf
[第1楼]   [ 回复时间:2009-07-05 19:29 ]   [引用]   [回复]   [ top ] 
荣誉值:33
信誉值:0
注册日期:2008-10-16 10:01
8086汇编是没法给出栈段的大小的,所以只能人为控制,就是说你必须留出足够的空间来作为栈来使用。
blueapple1987
[第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,数值上等于栈空间字节数
mywiil
[第3楼]   [ 回复时间:2009-07-14 15:37 ]   [引用]   [回复]   [ top ] 
荣誉值:61
信誉值:4
注册日期:2008-10-14 16:29
如仅指明了,SS和SP,那不是只说明栈顶在哪里吗?
==============
是的。但是,我们在进行栈操作的时候,变动的是sp这个偏移地址,所以,如果不算越界的话,从栈顶到0的这段空间就是栈的合理空间,栈操作都会影响到。(实际上,在dos下是没有越界检测的,所以,当sp==0的时候,在push的话,会产生段内环绕,sp编程000EH,如此,栈操作依然能够操作现在对应的内存)
basket123
[第4楼]   [ 回复时间:2009-07-28 14:59 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2009-07-25 09:36
你确定你这段程序能得到你预想的结果吗?你debug,可以看到前面运行的指令会改变后面的指令,那么运行到后面时就不是原先写的指令了,cpu是一条一条执行下去,即使后面的指令改了,只要可执行,它是不会报错的
891204dh
[第5楼]   [ 回复时间:2009-07-31 00:25 ]   [引用]   [回复]   [ top ] 
荣誉值:2
信誉值:0
注册日期:2009-04-08 06:33
第一个DW 相当于数据段 从CS:0~CS:F
第二个DW 相当于栈段 从CS:10~CS:1F
再下来就相当于 代码段了
891204dh
[第6楼]   [ 回复时间:2009-07-31 00:27 ]   [引用]   [回复]   [ top ] 
荣誉值:2
信誉值:0
注册日期:2009-04-08 06:33
有时候这样的栈段长度太短,会不够用,因为系统在执行某些指令的时候也会用到栈,所以SP会超界,也就是会改变CS:0~CS:F中的高地址的一些数据,程序执行就会出错了,所以有时应该把栈段定义长点,比如16个字的长度
891204dh
[第7楼]   [ 回复时间:2009-07-31 00:27 ]   [引用]   [回复]   [ top ] 
荣誉值:2
信誉值:0
注册日期:2009-04-08 06:33
不知道说得对不对 有错的地方还请大家指出!
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved