我正在尝试检查红色圆圈中的命令是否已确定-在编译过程/链接过程/加载过程中,但我不知道该怎么做:((
我稍微了解了一下,发现我需要查看代码(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
答案 0 :(得分:1)
通常这是不够的信息,因为单独的lst文件没有显示如何将它们链接在一起。幸运的是,您的文件之一没有数据,我们看到了如何链接代码(内存中p2
之后是p1
)。另请注意,加载地址05E6
是在运行时确定的,因此您不事先知道。也就是说,这是获取值的方法:
L2
在符号表中的名称为0015
,所以这很简单。DGROUP
始于0002:0
,相对于05E6
的载荷段,因此是05E8
。B800
在asm中是一个常数,即使是一个问题也是如此。jmp far ptr L1
参见上面的第1点和第2点。jmp cont
从p2.lst
中我们看到CONT
的地址为0000
,并且我们发现p2
中的代码遵循p1
,并且{ {1}}是p1
,因此是0018
。0018+0000=0018
从mov ax,char
中我们看到p1.lst
的地址为char
。从映射文件中,我们看到0000
从_DATA
开始,但是002E
从DGROUP
开始,因此0002:0
中的所有偏移量都需要增加_DATA
。002E-0020=000E
是msg
(请参见上面的第6点)。我相信您可以随后添加0002+000E=0010
和5
。