第六章实验任务(2)
2009-08-23 13:28
309 查看
题目:将下面的程序编译连接,用debug加载、跟踪,然后回答问题。
源代码:
调试过程:
问题1:CPU执行程序,程序返回前,data断的数据为多少?
解答:data段的数据是:144C:0000 23 01 56 04 00 00 00 00-00 00 00 00 00 00 00 00,结果保持变。
问题2:CPU执行程序,程序返回前,cs=144eh、ss=144dh、ds=14ch。
问题3:设程序加载后,codesg段的段地址为X,则datasg段的段地址为X-2h,stacksg段的段地址为X-1h。道理同上一篇所述。
问题4:对于如下定义的段:
name segment
.....
name ends
如果段中的数据占N个字节,则程序加载后,该段实际占有的空间为?
解答:通过以上第六章的实验1和实验2可以知道,因为段的最小空是16KB,即一个定义的段最少占据16个字节。如果N<16KB时,其长度为16KB。设N/16=s 如果s是个非整数则s=s+1,最终 s*16 就是这个段实际占用的空间,单位为KB。
源代码:
assume cs:codesg,ds:datasg,ss:stacksg datasg segment dw 0123h,0456h datasg ends stacksg segment dw 0,0 stacksg ends codesg segment start: mov ax,stacksg mov ss,ax mov sp,16 mov ax,datasg mov ds,ax push ds:[0] push ds:[2] pop ds:[2] pop ds:[0] mov ax,4c00h int 21h codesg ends end start
调试过程:
-r AX=0000 BX=0000 CX=0042 DX=0000 SP=0000 BP=0000 SI=0000 DI=0000 DS=143C ES=143C SS=144C CS=144E IP=0000 NV UP EI PL NZ NA PO NC 144E:0000 B84D14 MOV AX,144D -u 144E:0000 B84D14 MOV AX,144D 144E:0003 8ED0 MOV SS,AX 144E:0005 BC1000 MOV SP,0010 144E:0008 B84C14 MOV AX,144C 144E:000B 8ED8 MOV DS,AX 144E:000D FF360000 PUSH [0000] 144E:0011 FF360200 PUSH [0002] 144E:0015 8F060200 POP [0002] 144E:0019 8F060000 POP [0000] 144E:001D B8004C MOV AX,4C00 -t AX=144D BX=0000 CX=0042 DX=0000 SP=0000 BP=0000 SI=0000 DI=0000 DS=143C ES=143C SS=144C CS=144E IP=0003 NV UP EI PL NZ NA PO NC 144E:0003 8ED0 MOV SS,AX -t AX=144D BX=0000 CX=0042 DX=0000 SP=0010 BP=0000 SI=0000 DI=0000 DS=143C ES=143C SS=144D CS=144E IP=0008 NV UP EI PL NZ NA PO NC 144E:0008 B84C14 MOV AX,144C -t AX=144C BX=0000 CX=0042 DX=0000 SP=0010 BP=0000 SI=0000 DI=0000 DS=143C ES=143C SS=144D CS=144E IP=000B NV UP EI PL NZ NA PO NC 144E:000B 8ED8 MOV DS,AX -t AX=144C BX=0000 CX=0042 DX=0000 SP=0010 BP=0000 SI=0000 DI=0000 DS=144C ES=143C SS=144D CS=144E IP=000D NV UP EI PL NZ NA PO NC 144E:000D FF360000 PUSH [0000] DS:0000=0123 -t AX=144C BX=0000 CX=0042 DX=0000 SP=000E BP=0000 SI=0000 DI=0000 DS=144C ES=143C SS=144D CS=144E IP=0011 NV UP EI PL NZ NA PO NC 144E:0011 FF360200 PUSH [0002] DS:0002=0456 -t AX=144C BX=0000 CX=0042 DX=0000 SP=000C BP=0000 SI=0000 DI=0000 DS=144C ES=143C SS=144D CS=144E IP=0015 NV UP EI PL NZ NA PO NC 144E:0015 8F060200 POP [0002] DS:0002=0456 -t AX=144C BX=0000 CX=0042 DX=0000 SP=000E BP=0000 SI=0000 DI=0000 DS=144C ES=143C SS=144D CS=144E IP=0019 NV UP EI PL NZ NA PO NC 144E:0019 8F060000 POP [0000] DS:0000=0123 -t AX=144C BX=0000 CX=0042 DX=0000 SP=0010 BP=0000 SI=0000 DI=0000 DS=144C ES=143C SS=144D CS=144E IP=001D NV UP EI PL NZ NA PO NC 144E:001D B8004C MOV AX,4C00 -d ds:0 144C:0000 23 01 56 04 00 00 00 00-00 00 00 00 00 00 00 00 #.V............. 144C:0010 00 00 4C 14 4C 14 4C 14-00 00 1D 00 4E 14 30 0E ..L.L.L.....N.0. 144C:0020 B8 4D 14 8E D0 BC 10 00-B8 4C 14 8E D8 FF 36 00 .M.......L....6. 144C:0030 00 FF 36 02 00 8F 06 02-00 8F 06 00 00 B8 00 4C ..6............L 144C:0040 CD 21 CC 8D 86 74 FF 50-E8 E7 6D 83 C4 06 C4 5E .!...t.P..m....^ 144C:0050 F8 26 8B 47 06 26 8B 57-08 89 46 FC 89 56 FE C4 .&.G.&.W..F..V.. 144C:0060 5E FC 26 80 7F 04 00 75-03 E9 84 00 26 8B 07 26 ^.&....u....&..& 144C:0070 8B 57 02 89 46 F4 89 56-F6 8A 46 08 26 38 47 04 .W..F..V..F.&8G. -r AX=144C BX=0000 CX=0042 DX=0000 SP=0010 BP=0000 SI=0000 DI=0000 DS=144C ES=143C SS=144D CS=144E IP=001D NV UP EI PL NZ NA PO NC 144E:001D B8004C MOV AX,4C00 -t AX=4C00 BX=0000 CX=0042 DX=0000 SP=0010 BP=0000 SI=0000 DI=0000 DS=144C ES=143C SS=144D CS=144E IP=0020 NV UP EI PL NZ NA PO NC 144E:0020 CD21 INT 21 -q
问题1:CPU执行程序,程序返回前,data断的数据为多少?
解答:data段的数据是:144C:0000 23 01 56 04 00 00 00 00-00 00 00 00 00 00 00 00,结果保持变。
问题2:CPU执行程序,程序返回前,cs=144eh、ss=144dh、ds=14ch。
问题3:设程序加载后,codesg段的段地址为X,则datasg段的段地址为X-2h,stacksg段的段地址为X-1h。道理同上一篇所述。
问题4:对于如下定义的段:
name segment
.....
name ends
如果段中的数据占N个字节,则程序加载后,该段实际占有的空间为?
解答:通过以上第六章的实验1和实验2可以知道,因为段的最小空是16KB,即一个定义的段最少占据16个字节。如果N<16KB时,其长度为16KB。设N/16=s 如果s是个非整数则s=s+1,最终 s*16 就是这个段实际占用的空间,单位为KB。
相关文章推荐