. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->包含多个段的程序
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  关于实验5(1)、(3)的对比!!  [待解决] 回复[ 2次 ]   点击[ 472次 ]  
cfcxg
[帖 主]   [ 发表时间:2009-04-22 15:59 ]   [引用]   [回复]   [ top ] 
荣誉值:9
信誉值:3
注册日期:2008-12-21 10:26
D:\tools\masm5>debug p10.exe
-r
AX=0000  BX=0000  CX=0042  DX=0000  SP=0000  BP=0000  SI=0000  DI=0000
DS=13D0  ES=13D0  SS=13E0  CS=13E2  IP=0000   NV UP EI PL NZ NA PO NC
13E2:0000 B8E113        MOV     AX,13E1
-u cs:0 22
13E2:0000 B8E113        MOV     AX,13E1
13E2:0003 8ED0          MOV     SS,AX
13E2:0005 BC1000        MOV     SP,0010
13E2:0008 B8E013        MOV     AX,13E0
13E2:000B 8ED8          MOV     DS,AX
13E2:000D FF360000      PUSH    [0000]
13E2:0011 FF360200      PUSH    [0002]
13E2:0015 8F060200      POP     [0002]
13E2:0019 8F060200      POP     [0002]
13E2:001D B8004C        MOV     AX,4C00
13E2:0020 CD21          INT     21

p10.asm
assume cs:code,ds:data,ss:stack
data segment
     dw 0123h,0456h,0789h,0abch,0defh,0fdeh,0cdah,0987h
data ends
stack segment
     dw 0,0,0,0,0,0,0,0
stack ends
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
end start

D:\tools\masm5>debug p11.exe
-r
AX=0000  BX=0000  CX=0050  DX=0000  SP=0000  BP=0000  SI=0000  DI=0000
DS=13D0  ES=13D0  SS=13E0  CS=13E0  IP=0000   NV UP EI PL NZ NA PO NC
13E0:0000 B8E413        MOV     AX,13E4
-u cs:0 22
13E0:0000 B8E413        MOV     AX,13E4
13E0:0003 8ED0          MOV     SS,AX
13E0:0005 BC1000        MOV     SP,0010
13E0:0008 B8E313        MOV     AX,13E3
13E0:000B 8ED8          MOV     DS,AX
13E0:000D FF360000      PUSH    [0000]
13E0:0011 FF360200      PUSH    [0002]
13E0:0015 8F060200      POP     [0002]
13E0:0019 8F060000      POP     [0000]
13E0:001D B8004C        MOV     AX,4C00
13E0:0020 CD21          INT     21
p11.asm
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,0789h,0abch,0defh,0fdeh,0cdah,0987h
data ends
stack segment
     dw 0,0,0,0,0,0,0,0
stack ends
end start
大家好,以上是实验5第一题与第三题的原文件与编译连接后加载时的状态对比。不知道大家有没有发现这个源文件所不同的就是,代码段一个在原文件的最前面,另一个是在原文件的最后面,其余完全一样,指令和数据没有一点差别。可为什么在编译连接后,用debug加载时,CX寄存器的值有所不同,代码段在前面的p11加载后CX的值是50,代码段在后面的p10加载后CX的值确是42,大家都知道CX所代表的是程序文件的大小,可是两程序的指令没有任何差别,难道仅仅是代码段的顺序不一样就会导致编译后文件大小不一样吗?,请大家能帮助小弟分析一下CX产生差别的原因。谢谢了!
mess
[第1楼]   [ 回复时间:2009-04-23 12:20 ]   [引用]   [回复]   [ top ] 
荣誉值:337
信誉值:0
注册日期:2008-01-01 17:48
这个问题不能光分析代码段,而cx也不是值程序代码段的长度。(嫌上面的程序长,写个小程序试试~)

cx值的不同源自程序占内容实际的空间,最后一个段所占的实际内存空间未必是16字节的倍数。
cfcxg
[第2楼]   [ 回复时间:2009-04-23 15:40 ]   [引用]   [回复]   [ top ] 
荣誉值:9
信誉值:3
注册日期:2008-12-21 10:26
这么说,楼上朋友是不是说堆栈段的定义在编译连接后所得到的内存空间大小,未必会按程序要求的大小分配,有可能会多于实际所要的空间,是这样吗?

看来有空我还得作个短点的程序再试试:)
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved