1

我在 MASM 中编写了一个简单的程序,例如:

.386
.model flat, stdcall
option casemap:none

.data
szName db "MASM", 0

.code
start:
mov eax, DWORD PTR [szName]
ret
end start

我检查了 OllyDbg 调试器中的代码,我得到:

CPU Disasm
Address   Hex dump          Command                                  Comments
00401004      CC            INT3
00401005  /.  E9 06000000   JMP 00401010
0040100A  |   CC            INT3
0040100B  |   CC            INT3
0040100C  |   CC            INT3
0040100D  |   CC            INT3
0040100E  |   CC            INT3
0040100F  |   CC            INT3
00401010  |>  A1 00404000   MOV EAX,DWORD PTR DS:[404000]            ; ASCII "MASM"
00401015  \.  C3            RETN
00401016      A1            DB A1

我的问题是哪个组件在实际代码 (00401010) 之前修补了这 11 个字节 (00401005-0040100F) ?为什么?

我使用 Windows XP SP3、MASM 和 OllyDbg。

好的,这里是解释(对谁在乎):这段代码是在调试模式下构建的,所以汇编器/链接器(不知道到底是哪个)添加了这些额外的字节。JMP 的存在是为了让程序能够运行,因为它必须绕过一系列 INT 3 指令。如果程序是在 RELEASE 模式下构建的,则不会附加这样的额外代码。

4

1 回答 1

0

我认为它们只是对齐字节,因此代码在 16 字节边界上对齐并且运行速度稍快。

于 2011-04-07T12:26:03.303 回答