Некоторое время назад я опубликовал этот вопрос о странном поведении Я испытывал, пытаясь пройти через программу MASM.
По сути, учитывая следующий код:
; Tell MASM to use the Intel 80386 instruction set.
.386
; Flat memory model, and Win 32 calling convention
.MODEL FLAT, STDCALL
; Treat labels as case-sensitive (required for windows.inc)
OPTION CaseMap:None
include windows.inc
include masm32.inc
include user32.inc
include kernel32.inc
include macros.asm
includelib masm32.lib
includelib user32.lib
includelib kernel32.lib
.DATA
BadText db "Error...", 0
GoodText db "Excellent!", 0
.CODE
main PROC
int 3
mov eax, 6
xor eax, eax
_label: add eax, ecx
dec ecx
jnz _label
cmp eax, 21
jz _good
_bad: invoke StdOut, addr BadText
jmp _quit
_good: invoke StdOut, addr GoodText
_quit: invoke ExitProcess, 0
main ENDP
END main
Я не смог запустить инструкцию int 3
. Стало понятно, почему нет, изучив разборку:
00400FFD add byte ptr [eax],al
00400FFF add ah,cl
--- [User path]\main.asm
mov eax, 6
00401001 mov eax,6
xor eax, eax
00401006 xor eax,eax
_label: add eax, ecx
Инструкция int 3
была заменена на add al,cl
, но я понятия не имел почему. Мне удалось отследить проблему, была ли включена добавочная связь. Вышеупомянутая дизассемблирование было сгенерировано с отключенным добавочным связыванием (параметр /INCREMENTAL:NO в командной строке). Повторное включение приведет к примерно следующему:
.CODE
main PROC
int 3
00401010 int 3
mov eax, 6
00401011 mov eax,6
xor eax, eax
00401016 xor eax,eax
Я должен отметить, что чередующиеся строки являются ссылками на исходный код (я думаю, это особенность окна дизассемблирования Visual Studio). При включенной инкрементной компоновке дизассемблирование точно соответствует тому, что я написал в программе, и я ожидал, что она будет вести себя все это время.
Итак, почему отключение добавочного связывания может привести к изменению дизассемблирования моей программы? Что может происходить за кулисами, что на самом деле может изменить выполнение программы?