выход может быть такой - не писать висячего кода в сегменте, другими словами упаковывать начальный код в процедуру Код (Text): p1 proc jmp m1; тут проблема m2: jmp m2 m1: ret p1 endp main proc call p1 m1: invoke MessageBoxA, 0, 0, 0, 0 ret main endp end main
это само собой понятно, но вопрос в другом и похоже из ряда вон выходящих. Похоже, чтоб на него ответить надо только сорсы компилера смотреть
Бред какой-то --> получается аналог спагетти-кода и игнорирование локальной метки m1 Код (Text): .code p1: jmp m1; тут проблема start: push offset m1 jmp p1 m1: push 0 push 0 push 0 push 0 call _imp__MessageBoxA@16 retn end start
И вот такой код дает двойной вывод MessageBox Код (Text): start: push offset m1 m1: push 0 push 0 push 0 push 0 call _imp__MessageBoxA@16 retn end start отсюда мораль -- во избежание "скрытых радостей" явно использовать invoke ExitProcess, 0 вместо RETN
ну вообще получается конфликт имен - сами посудите есть глобальное имя m1 так как висит непосредственно в сегменте и локальное m1 - скорее всего после того как выясняется что есть глобальное имя существование локальных просто не проверяется, а подставляется сразу глобальное фишка аля переопределение equ
опять же не в этом дело процитирую себя тоесть ТС спрашивает, и мне тоже интересно, каким образом двойное двоеточие в метке m2, которое делает ее глобальной влияет на строку jmp m1. И кстати метки не внутри директив proc endp являются глобальными, собственно это было уже сказано, это видно из symbol table, так как туда локальные не попадают.
EFiR может эффекты оптимизации - всякие там клише и прочее а вообще в масме много фокусов закопано - почитайте эдмонда про макросы тут на сайте