Assembly 确定十六进制x86程序集中数据和代码段的大小

Assembly 确定十六进制x86程序集中数据和代码段的大小,assembly,x86,hex,Assembly,X86,Hex,如果我正在查看汇编程序.lst文件(列表文件),如何确定.data段和.code段的大小 这是否由段中的最后一个偏移确定?例如,下面是一个列表: 00000000 .data 00000000 00000019 iX dword 25,-2,-3 FFFFFFFE FFFFFFFD 0000000C 0011 FFFB sY word 17,-5,2 dup (17,-4)

如果我正在查看汇编程序
.lst
文件(列表文件),如何确定.data段和.code段的大小

这是否由段中的最后一个偏移确定?例如,下面是一个列表:

 00000000               .data
 00000000 00000019      iX      dword   25,-2,-3 
       FFFFFFFE
       FFFFFFFD
 0000000C 0011 FFFB     sY      word    17,-5,2 dup (17,-4)
       00000002 [
        0011 FFFC
       ]
 00000018  00000003 [       bVal    byte    3 dup(-1,23) ,35
        FF 17
       ] 23
 0000001F 00000015      iNum    dword   21,-43
       FFFFFFD5
 00000027 41 42 43 34 35    bName   byte    "ABC456",29,'DEF'
       36 1D 44 45 46

 00000000               .code
 00000000           _start:
 00000000  B8 00000000          mov eax,0
 00000005  A1 00000002 R        mov  eax, iX[2]
 0000000A  03 05 0000001F R     ADD eax, iNum
 00000010  03 05 00000027 R     ADD eax, dword ptr bName
 00000016  FF 35 0000001F R     PUSH   iNum
 0000001C  FF 35 00000027 R     PUSH dword ptr bName
 00000022  66| 5B           POP   BX
 00000024  5E               POP   ESI

数据段的大小是否为
27h
,代码段的大小是否为
24h

逻辑正常,执行不是:)最后一行
的开始偏移量。数据确实是
27h
,但它包含10个值,因此需要添加该值。与
.code
类似,但这只增加了1个字节。好的。我知道
.data
是27+(10*字节)=37h,但是你怎么知道代码段中的
POP ESI
行只增加了1个字节?不,
27h+10
不是
37h
,因为
10
是十进制的。因为每行都列出了字节,所以很容易对它们进行计数。
POP ESI
是一个值为
5E
的单字节。您是否也可以使用ESP(堆栈指针)-EBP(基本指针)确定段的大小?或者其他间接方法,可能不使用.lst?这可能是个愚蠢的问题,但我是jw。不幸的是,堆栈或基指针与此无关。但是当然还有其他的方法,比如普通的二进制格式通常有内部的报头给出大小,对于当前正在执行的程序,您可以查询操作系统。