如何知道命令的确定位置 - 在编译/ link/ 加载 - 通过 MAP LST 文件组装 x86 masm

how to know where the commands where determinated - in the compilation/ link/ load - assembly x86 masm by MAP&LST files

我正在尝试检查红圈中的命令何时确定 - 在编译 process/link process/load 过程中,但我不知道该怎么做 :((

我读了一点,发现我需要查看代码的 LST 和 MAP 文件 (p1.asm, p2.asm),在那里我会得到answear...但不幸的是,正如我所说,我没有找到 ansswears....

非常感谢您的帮助,

我在此处添加代码和 LST、MAP 文件

这是代码: p1.asm -

.model small
.data
 char dw 2E41h ;'A'
 public char
 msg db 'My string$'
 public msg

.code
 mov ax,bx
L1: mov cx,ax
 jmp L2

.code
HERE:
 mov ax, @data
 mov ds, ax
 mov ax, 0B800h
 mov es, ax

 jmp far ptr L1
L2:
 extern CONT:near
 jmp CONT
end HERE

p2.asm -

.model small
.stack 100h
.data
 extern char:word
 extern msg:byte
.code
public CONT
CONT:
 mov ax,char
 mov es:[340h], ax

 mov bx, offset msg
 mov dl, msg[5]
 mov dh,ds:[msg+6]

 mov ah,4ch
 int 21h
 end

第一个文件 - (p1.LST) :

Microsoft (R) Macro Assembler Version 6.11          07/08/18 02:41:49
p1.asm                               Page 1 - 1


                .model small
 0000               .data
 0000 2E41           char dw 2E41h ;'A'
                 public char
 0002 4D 79 20 73 74 72      msg db 'My string$'
       69 6E 67 24
                 public msg

 0000               .code
 0000  8B C3             mov ax,bx
 0002  8B C8            L1: mov cx,ax
 0004  EB 0F             jmp L2

 0006               .code
 0006               HERE:
 0006  B8 ---- R         mov ax, @data
 0009  8E D8             mov ds, ax
 000B  B8 B800           mov ax, 0B800h
 000E  8E C0             mov es, ax

 0010  EA ---- 0002 R        jmp far ptr L1
 0015               L2:
                 extern CONT:near
 0015  E9 0000 E         jmp CONT
                end HERE
Microsoft (R) Macro Assembler Version 6.11          07/08/18 02:41:49
p1.asm                               Symbols 2 - 1




Segments and Groups:

                N a m e                 Size     Length   Align   Combine Class

DGROUP . . . . . . . . . . . . .    GROUP
_DATA  . . . . . . . . . . . . .    16 Bit   000C     Word    Public  'DATA'    
_TEXT  . . . . . . . . . . . . .    16 Bit   0018     Word    Public  'CODE'    


Symbols:

                N a m e                 Type     Value    Attr

@CodeSize  . . . . . . . . . . .    Number   0000h   
@DataSize  . . . . . . . . . . .    Number   0000h   
@Interface . . . . . . . . . . .    Number   0000h   
@Model . . . . . . . . . . . . .    Number   0002h   
@code  . . . . . . . . . . . . .    Text     _TEXT
@data  . . . . . . . . . . . . .    Text     DGROUP
@fardata?  . . . . . . . . . . .    Text     FAR_BSS
@fardata . . . . . . . . . . . .    Text     FAR_DATA
@stack . . . . . . . . . . . . .    Text     DGROUP
CONT . . . . . . . . . . . . . .    L Near   0000     _TEXT External
HERE . . . . . . . . . . . . . .    L Near   0006     _TEXT 
L1 . . . . . . . . . . . . . . .    L Near   0002     _TEXT 
L2 . . . . . . . . . . . . . . .    L Near   0015     _TEXT 
char . . . . . . . . . . . . . .    Word     0000     _DATA Public
msg  . . . . . . . . . . . . . .    Byte     0002     _DATA Public

       0 Warnings
       0 Errors

p2.LST -

Microsoft (R) Macro Assembler Version 6.11          07/08/18 02:41:52
p2.asm                               Page 1 - 1


                .model small
                .stack 100h
 0000               .data
                 extern char:word
                 extern msg:byte
 0000               .code
                public CONT
 0000               CONT:
 0000  A1 0000 E         mov ax,char
 0003  26: A3 0340       mov es:[340h], ax

 0007  BB 0000 E         mov bx, offset msg
 000A  8A 16 0005 E      mov dl, msg[5]
 000E  8A 36 0006 E      mov dh,ds:[msg+6]

 0012  B4 4C             mov ah,4ch
 0014  CD 21             int 21h
                end
Microsoft (R) Macro Assembler Version 6.11          07/08/18 02:41:52
p2.asm                               Symbols 2 - 1




Segments and Groups:

                N a m e                 Size     Length   Align   Combine Class

DGROUP . . . . . . . . . . . . .    GROUP
_DATA  . . . . . . . . . . . . .    16 Bit   0000     Word    Public  'DATA'    
STACK  . . . . . . . . . . . . .    16 Bit   0100     Para    Stack   'STACK'    
_TEXT  . . . . . . . . . . . . .    16 Bit   0016     Word    Public  'CODE'    


Symbols:

                N a m e                 Type     Value    Attr

@CodeSize  . . . . . . . . . . .    Number   0000h   
@DataSize  . . . . . . . . . . .    Number   0000h   
@Interface . . . . . . . . . . .    Number   0000h   
@Model . . . . . . . . . . . . .    Number   0002h   
@code  . . . . . . . . . . . . .    Text     _TEXT
@data  . . . . . . . . . . . . .    Text     DGROUP
@fardata?  . . . . . . . . . . .    Text     FAR_BSS
@fardata . . . . . . . . . . . .    Text     FAR_DATA
@stack . . . . . . . . . . . . .    Text     DGROUP
CONT . . . . . . . . . . . . . .    L Near   0000     _TEXT Public
char . . . . . . . . . . . . . .    Word     0000     _DATA External
msg  . . . . . . . . . . . . . .    Byte     0000     _DATA External

       0 Warnings
       0 Errors

最后 - p1p2.MAP :

 Start  Stop   Length Name                   Class
 00000H 0002DH 0002EH _TEXT                  CODE
 0002EH 00039H 0000CH _DATA                  DATA
 00040H 0013FH 00100H STACK                  STACK

 Origin   Group
 0002:0   DGROUP

Program entry point at 0000:0006

一般来说,这些信息不够,因为单独的 lst 文件没有显示它们将如何链接在一起。幸运的是,您的一个文件没有数据,我们可以看到代码是如何链接的(p2 在内存中跟随 p1)。另请注意,加载地址 05E6 是在运行时确定的,因此您事先不知道。也就是说,这是获取值的方法:

  1. L2 在符号 table 中作为 0015 所以这很简单。
  2. 从映射文件中我们可以看到 DGROUP0002:0 开始,这是相对于 05E6 的负载段因此 05E8.
  3. B800 是 asm 中的一个常量,这甚至是一个问题。
  4. jmp far ptr L1 参见上面的第 1 点和第 2 点。
  5. jmp contp2.lst 我们看到 CONT 有地址 0000 并且我们计算出来自 p2 的代码跟随 p1 并且代码大小因为 p10018 因此 0018+0000=0018.
  6. mov ax,charp1.lst 我们看到 char 有地址 0000。从映射文件中我们看到 _DATA002E 开始,但 DGROUP0002:0 开始,因此 _DATA 中的所有偏移量都需要增加 002E-0020=000E .
  7. 见上文第 3 点。
  8. msg0002+000E=0010(见上文第 6 点)。我相信您可以添加 56.