一 数据段和栈段在前
【实验5(2)】
assume cs:code,ds:data,ss:stack
data segment
dw 0123h,0456h
data ends
stack segment
dw 0,0
stack ends
code segment
start: mov ax,data
mov ds,ax
mov ax,stack
mov ss,ax
mov sp,16
push ds:[0]
push ds:[2]
pop ds:[2]
pop ds:[0]
mov ax,4c00h
int 21h
code ends
end start
List File [NUL.MAP]:
Libraries [.LIB]:
LINK : warning L4021: no stack segment
C:\DOCUME~1\ADMINI~1>
C:\DOCUME~1\ADMINI~1>debug p14.exe
-u
0B75:0000 B8730B MOV AX,0B73
0B75:0003 8ED8 MOV DS,AX
0B75:0005 B8740B MOV AX,0B74
0B75:0008 8ED0 MOV SS,AX
0B75:000A BC1000 MOV SP,0010
0B75:000D FF360000 PUSH [0000]
0B75:0011 FF360200 PUSH [0002]
0B75:0015 8F060200 POP [0002]
0B75:0019 8F060000 POP [0000]
0B75:001D B8004C MOV AX,4C00
-g 1d
AX=0B74 BX=0000 CX=0042 DX=0000 SP=0010 BP=0000 SI=0000 DI=0000
DS=0B73 ES=0B63 SS=0B74 CS=0B75 IP=001D NV UP EI PL NZ NA PO NC
0B75:001D B8004C MOV AX,4C00
-d ds:0 3
0B73:0000 23 01 56 04 #.V.
-
注意:cx=42h
二 数据段和栈段在后
【实验5(3)】
assume cs:code,ds:data,ss:stack
code segment
start: mov ax,data
mov ds,ax
mov ax,stack
mov ss,ax
mov sp,16
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
Libraries [.LIB]:
LINK : warning L4021: no stack segment
C:\DOCUME~1\ADMINI~1>debug p15.exe
-u
0B7F:0000 B8820B MOV AX,0B82
0B7F:0003 8ED8 MOV DS,AX
0B7F:0005 B8830B MOV AX,0B83
0B7F:0008 8ED0 MOV SS,AX
0B7F:000A BC1000 MOV SP,0010
0B7F:000D FF360000 PUSH [0000]
0B7F:0011 FF360200 PUSH [0002]
0B7F:0015 8F060200 POP [0002]
0B7F:0019 8F060000 POP [0000]
0B7F:001D B8004C MOV AX,4C00
-r
AX=0000 BX=0000 CX=0044 DX=0000 SP=0000 BP=0000 SI=0000 DI=0000
DS=0B6F ES=0B6F SS=0B7F CS=0B7F IP=0000 NV UP EI PL NZ NA PO NC
0B7F:0000 B8820B MOV AX,0B82
-g 1d
AX=0B83 BX=0000 CX=0044 DX=0000 SP=0010 BP=0000 SI=0000 DI=0000
DS=0B82 ES=0B6F SS=0B83 CS=0B7F IP=001D NV UP EI PL NZ NA PO NC
0B7F:001D B8004C MOV AX,4C00
-
注意:cx=44h,
再用u命令查看一步,即知:代码段长度为22h,所以占用空间为30h.
总结:1>cx记录程序的长度,方法为:
(2)小题:cx=20h+22h=42h
(3)小题:cx=30h+10h+4h=44h
2>
疑问:如你所说,当在代码段中定义数据时,数据的起始位置为cs:0;但存在数据段时,依实验5(1)(2)debug结果数据段的段地址当然是X-2(栈段的段地址是X-1),关于这一点,我想知道为什么??另:教材p92页,psp区(紧接后面的是程序区)不是数据区吗,既然如此,我想问的是数据段的段地址为何不是ds(或sa),而偏偏是X-2?
3> 疑问:end start改为end后的程序执行情况.(即实验5(4))