如何知道命令的确定位置 - 在编译/ 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
是在运行时确定的,因此您事先不知道。也就是说,这是获取值的方法:
L2
在符号 table 中作为 0015
所以这很简单。
- 从映射文件中我们可以看到
DGROUP
从 0002:0
开始,这是相对于 05E6
的负载段因此 05E8
.
B800
是 asm 中的一个常量,这甚至是一个问题。
jmp far ptr L1
参见上面的第 1 点和第 2 点。
jmp cont
从 p2.lst
我们看到 CONT
有地址 0000
并且我们计算出来自 p2
的代码跟随 p1
并且代码大小因为 p1
是 0018
因此 0018+0000=0018
.
mov ax,char
从 p1.lst
我们看到 char
有地址 0000
。从映射文件中我们看到 _DATA
从 002E
开始,但 DGROUP
从 0002:0
开始,因此 _DATA
中的所有偏移量都需要增加 002E-0020=000E
.
- 见上文第 3 点。
msg
是 0002+000E=0010
(见上文第 6 点)。我相信您可以添加 5
和 6
.
我正在尝试检查红圈中的命令何时确定 - 在编译 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
是在运行时确定的,因此您事先不知道。也就是说,这是获取值的方法:
L2
在符号 table 中作为0015
所以这很简单。- 从映射文件中我们可以看到
DGROUP
从0002:0
开始,这是相对于05E6
的负载段因此05E8
. B800
是 asm 中的一个常量,这甚至是一个问题。jmp far ptr L1
参见上面的第 1 点和第 2 点。jmp cont
从p2.lst
我们看到CONT
有地址0000
并且我们计算出来自p2
的代码跟随p1
并且代码大小因为p1
是0018
因此0018+0000=0018
.mov ax,char
从p1.lst
我们看到char
有地址0000
。从映射文件中我们看到_DATA
从002E
开始,但DGROUP
从0002:0
开始,因此_DATA
中的所有偏移量都需要增加002E-0020=000E
.- 见上文第 3 点。
msg
是0002+000E=0010
(见上文第 6 点)。我相信您可以添加5
和6
.