如何知道在哪里确定命令-在编译/链接/加载-MAP&LST文件组装x86 masm

时间:2018-07-08 10:09:22

标签: assembly linker x86 dos masm

我正在尝试检查红色圆圈中的命令是否已确定-在编译过程/链接过程/加载过程中,但我不知道该怎么做:((

enter image description here

我稍微了解了一下,发现我需要查看代码(p1.asm,p2.asm)的LST和MAP文件,然后我会得到答案……但不幸的是就像我说的,我找不到那里的衣服。...

非常感谢您的帮助

我在这里添加代码和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

Lst文件-(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

1 个答案:

答案 0 :(得分:1)

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

  1. L2在符号表中的名称为0015,所以这很简单。
  2. 从地图文件中,我们可以看到DGROUP始于0002:0,相对于05E6的载荷段,因此是05E8
  3. B800在asm中是一个常数,即使是一个问题也是如此。
  4. jmp far ptr L1参见上面的第1点和第2点。
  5. jmp contp2.lst中我们看到CONT的地址为0000,并且我们发现p2中的代码遵循p1,并且{ {1}}是p1,因此是0018
  6. 0018+0000=0018mov ax,char中我们看到p1.lst的地址为char。从映射文件中,我们看到0000_DATA开始,但是002EDGROUP开始,因此0002:0中的所有偏移量都需要增加_DATA
  7. 请参阅上面的第3点。
  8. 002E-0020=000Emsg(请参见上面的第6点)。我相信您可以随后添加0002+000E=00105