【发布时间】:2021-01-14 13:15:28
【问题描述】:
我一直在尝试理解MASM汇编器生成的目标代码和exe文件,但有些部分对我来说仍然模糊,希望有人能真正帮助我理解。
所以我有一个非常简单的 MASM 程序
Q1.ASM
.model small
.stack 100h
.data
string db 'hello$'
.code
MAIN PROC
mov ax, @data
mov ds, ax
lea dx , string
mov ah, 9
int 21h
mov ah, 4ch
int 21h
MAIN ENDP
END MAIN
我用MASM Q1.ASM在dosbox上运行它,它生成了Q1.OBJ
$ xxd Q1.OBJ
00000000: 8008 0006 5131 2e41 534d e196 2500 0006 ....Q1.ASM..%...
00000010: 4447 524f 5550 0444 4154 4104 434f 4445 DGROUP.DATA.CODE
00000020: 0553 5441 434b 055f 4441 5441 055f 5445 .STACK._DATA._TE
00000030: 5854 8f98 0700 4811 0007 0401 fc98 0700 XT....H.........
00000040: 4806 0006 0301 0998 0700 7400 0105 0501 H.........t.....
00000050: e19a 0600 02ff 02ff 035b 8804 0000 a200 .........[......
00000060: d1a0 0a00 0200 0068 656c 6c6f 241c a015 .......hello$...
00000070: 0001 0000 b800 008e d88d 1600 00b4 09cd ................
00000080: 21b4 4ccd 21f0 9c0b 00c8 0115 0101 c407 !.L.!...........
00000090: 1401 0297 8a07 00c1 0001 0100 00ac ..............
然后我运行$ link Q1.OBJ,然后它生成Q1.EXE。
$ xxd Q1.EXE
00000000: 4d5a 1800 0200 0100 2000 1100 ffff 0200 MZ...... .......
00000010: 0001 c58b 0000 0000 1e00 0000 0100 0100 ................
00000020: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000030: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000040: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000050: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000060: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000070: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000080: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000090: 0000 0000 0000 0000 0000 0000 0000 0000 ................
000000a0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
000000b0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
000000c0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
000000d0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
000000e0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
000000f0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000100: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000110: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000120: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000130: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000140: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000150: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000160: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000170: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000180: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000190: 0000 0000 0000 0000 0000 0000 0000 0000 ................
000001a0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
000001b0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
000001c0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
000001d0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
000001e0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
000001f0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000200: b801 008e d88d 1602 00b4 09cd 21b4 4ccd ............!.L.
00000210: 2100 6865 6c6c 6f24 !.hello$
现在我有两个问题,
-
生成的目标代码中应该有修改记录和重定位位,但都是二进制的,有什么方法可以正确分析.OBJ文件生成的修改记录。
-
生成的
Q1.EXE文件,如你所见,有很多由0000给出的空格,它们的具体用途是什么,00000200:行中'L'的含义是什么。
【问题讨论】:
-
您可以使用
objdump或等效项。L是0x4c它是mov ah, 4ch机器码的一部分 -
@Jester 为什么要写在要打印到标准输出的实际东西之前,在这种情况下是
hello。我的意思是退出程序应该在打印之后吧? -
数据没有被执行,它可以在二进制文件的任何地方。它是由地址引用的。
-
请注意,您的问题中没有 disassembly(回到机器代码的可读文本表示形式),只有二进制文件的 hexdumps。我也会标记portable-executable(.exe 的文件格式),但 SO 只允许 5 个标记。我留下了反汇编标签,以防未来的读者和你有同样的误解,并在查看 hexdumps 时搜索它。
-
我会下载 Openwatcom。有一个 WDUMP 程序,它有一个
-i选项,它将显示所有标题信息并以一种很好的人类可读格式列出 DOS EXE 程序的所有重定位条目。
标签: assembly x86 dos masm coff