比如:
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