当前位置: 代码迷 >> 汇编语言 >> 关于程序中的段之间的距离有关问题
  详细解决方案

关于程序中的段之间的距离有关问题

热度:185   发布时间:2016-05-02 04:38:20.0
关于程序中的段之间的距离问题
比如:

assume ds:data,ss:stack,cs:code
data:segment
    ......
data:ends

stack:segment
    ......
stack:ends

code:segment
    ......
code:ends
end

以上程序 比如data为1000,那么stack和code是不是一定是1001和1002,而且每个段的开始的偏移地址都是0,所以在程序中,两个段之间至少相隔16个字节?
------解决方案--------------------
当然不是“一定是1001和1002”了,也可能比它们大(如果前面的段的大小超过了 16 字节的话);后面的说法应该是对的吧。
------解决方案--------------------
楼主的前一问,可采用2楼“zara”的回复。但后一问就不要采用他说的了。
看到楼主的问题,我都觉得很高兴。因为好几次看到类似的这个问题(都觉得很亲切了),那说明这个问题确实是个问题,因为有很多人问,也就是有很多人不理解。
以前,我回复过类似问题,很幸运,我又找到了回复处,但那个问问题的对我的回答只给3/20分,也许是认为我回复的很幼儿园。那就不说了。。。

现在再翻录到这,供有心者参考。


8086汇编程序段首地址不是一定为16的倍数!
王爽书上那么说,是因为那本书是入门用来入门.不牵涉复杂的.那么说,是方便刚入门的学习者的学习.

一般在80386以下汇编编译时,对段间的连接默认定位类型设为PARA(节-16字节).简单地说就是以16字节为最小单位进行连接.
当然,段间连接还有其他类型.

如:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;      首地址不一定是16的倍数     ;  
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
      STACKS  SEGMENT   BYTE
              DB        31 DUP (1)
      STACKS  ENDS

       DATAS  SEGMENT   BYTE
              DB        "ABCDEFG"
       DATAS  ENDS

       CODES  SEGMENT   BYTE
              ASSUME    CS:CODES,DS:DATAS,SS:STACKS
      START:
              MOV       AX,DATAS
              MOV       DS,AX
              MOV       AX,STACKS
              MOV       SS,AX
              MOV       SP,16
              NOP
              NOP
              NOP
              MOV       AH,4CH
              INT       21H
       CODES  ENDS
              END       START

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-u
0BB4:0006 B8B30B        MOV     AX,0BB3  ;注意这里,CS起始地址不是XXXX:0000
0BB4:0009 8ED8          MOV     DS,AX
0BB4:000B B8B20B        MOV     AX,0BB2
0BB4:000E 8ED0          MOV     SS,AX
0BB4:0010 BC1000        MOV     SP,0010
0BB4:0013 90            NOP
0BB4:0014 90            NOP
0BB4:0015 90            NOP
0BB4:0016 B44C          MOV     AH,4C
0BB4:0018 CD21          INT     21
0BB4:001A 8B2D          MOV     BP,[DI]
-g13

AX=0BB2  BX=0000  CX=003A  DX=0000  SP=0010  BP=0000  SI=0000  DI=0000
DS=0BB3  ES=0BA2  SS=0BB2  CS=0BB4  IP=0013   NV UP EI PL NZ NA PO NC
0BB4:0013 90            NOP
-d ss:0
0BB2:0000  01 01 01 01 01 01 01 01-00 00 13 00 B4 0B 9F 05   ................
0BB2:0010  01 01 01 01 01 01 01 01-01 01 01 01 01 01 01 41   ...............A;这个A是DS段的首数据,它的地址不是XXXX:0000
0BB2:0020  42 43 44 45 46 47 B8 B3-0B 8E D8 B8 B2 0B 8E D0   BCDEFG..........;B8 B3 0B是CS段的MOV     AX,0BB3,它的地址也不是XXXX:0000
  相关解决方案