当前位置: 代码迷 >> 汇编语言 >> 程序中段与段之间段地址连续和不连续的有关问题
  详细解决方案

程序中段与段之间段地址连续和不连续的有关问题

热度:5143   发布时间:2013-02-26 00:00:00.0
程序中段与段之间段地址连续和不连续的问题?
assume cs:code,ds:data,ss:stack  
code segment 
 start:  
mov ax,stack  
mov ss,ax  
mov sp,16  
mov ax,data  
mov ds,ax  
push ds:[0]  
push ds:[2]  
pop ds:[2]  
pop ds:[0]  
 mov ax,4c00h  
 int 21h  
code ends  
data segment  
dw 0123h,0456h  
data ends  
 stack segment  
  dw 0,0 
 stack ends  
 end start  
刚刚看始王爽的汇编,这是实验五第三小题中发现的疑问: 当code段位于“data”“stack”段之前的时候,编译后三个段的段地址是不连续的,而当data和stack段位于code段之前时,编译后段地址是连续的,求解?

------解决方案--------------------------------------------------------
段寄存器一定认真学习好。。这样就好明白其中的奥妙。。。
------解决方案--------------------------------------------------------
1.实模式是1M寻址范围,怎么访问必须看书。。2句话说不清。
2.stack以ss指定的段为起始地址,push和pop默认就是读写ss指定的偏移段。
3.解释一条:
push ds:[0]----->把ds偏移段offset=0的数据push到ss指定的stack栈顶
------解决方案--------------------------------------------------------
链接程序Link决定各段在内存中的分布?
------解决方案--------------------------------------------------------
代码加载上来也占空间啊,转载进内存的时候肯定是顺序的,你在中间穿插了代码不就不连续了?
------解决方案--------------------------------------------------------
因为你的code段长度大于1节(1 paragraph=16 bytes),实际分配了3节,而data、stack的数据都小于1节,实际分配了1节。
所以,如果段顺序是cs、ds、ss,那么三个段地址就是xxxx、xxxx+3、xxxx+4,就不连续了,如果是ds、ss、cs的顺序,则三个段地址是xxxx、xxxx+1、xxxx+2,就连续了。
你可以把data、stack分配的空间改大到1节以上,则不论段顺序如何,段地址都不连续了。

------解决方案--------------------------------------------------------
段与段之间 默认连接间隔距离是1节(1 paragraph=16 bytes)
段定义其实还有其它属性的,不过王爽这本书里不会讲到。
LZ编译连接的时候,会出现一个警告,提示没有堆栈,就是因为,设置SS需要段属性里 要定义。
(平常定义段名data和stack,好像属于一个段组里的。具体可以看 杨季文 那本黑色的书,第7第8章)。
  相关解决方案