проблема с метками(масм)

Тема в разделе "WASM.BEGINNERS", создана пользователем NuMeR, 24 фев 2010.

  1. Rockphorr

    Rockphorr Well-Known Member

    Публикаций:
    0
    Регистрация:
    9 июн 2004
    Сообщения:
    2.622
    Адрес:
    Russia
    выход может быть такой - не писать висячего кода в сегменте, другими словами упаковывать начальный код в процедуру
    Код (Text):
    1. p1 proc
    2.   jmp m1; тут проблема
    3.     m2:
    4.     jmp m2
    5.   m1:
    6.   ret
    7. p1 endp
    8.  
    9. main proc
    10.   call p1
    11.   m1:
    12.   invoke MessageBoxA, 0, 0, 0, 0
    13.   ret
    14. main endp
    15.  
    16. end main
     
  2. Rockphorr

    Rockphorr Well-Known Member

    Публикаций:
    0
    Регистрация:
    9 июн 2004
    Сообщения:
    2.622
    Адрес:
    Russia
    в довесок кусок справки и предложение все-таки явно поставить

    Код (Text):
    1. OPTION  SCOPED
     
  3. EFiR

    EFiR New Member

    Публикаций:
    0
    Регистрация:
    1 фев 2010
    Сообщения:
    28
    это само собой понятно, но вопрос в другом и похоже из ряда вон выходящих. Похоже, чтоб на него ответить надо только сорсы компилера смотреть
     
  4. EFiR

    EFiR New Member

    Публикаций:
    0
    Регистрация:
    1 фев 2010
    Сообщения:
    28
    пробовал, тоже самое что и без него, я же писал выше
     
  5. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.792
    Бред какой-то --> получается аналог спагетти-кода и игнорирование локальной метки m1
    Код (Text):
    1. .code
    2. p1: jmp m1; тут проблема
    3. start:  push offset m1
    4.     jmp p1
    5. m1: push 0
    6.     push 0
    7.     push 0
    8.     push 0
    9.     call _imp__MessageBoxA@16
    10.     retn
    11. end start
     
  6. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.792
    И вот такой код дает двойной вывод MessageBox
    Код (Text):
    1. start:  push offset m1
    2. m1: push 0
    3.     push 0
    4.     push 0
    5.     push 0
    6.     call _imp__MessageBoxA@16
    7.     retn
    8. end start
    отсюда мораль -- во избежание "скрытых радостей" явно использовать invoke ExitProcess, 0 вместо RETN
     
  7. Rockphorr

    Rockphorr Well-Known Member

    Публикаций:
    0
    Регистрация:
    9 июн 2004
    Сообщения:
    2.622
    Адрес:
    Russia
    ну вообще получается конфликт имен - сами посудите есть глобальное имя m1 так как висит непосредственно в сегменте и локальное m1 - скорее всего после того как выясняется что есть глобальное имя существование локальных просто не проверяется, а подставляется сразу глобальное фишка аля переопределение equ
     
  8. EFiR

    EFiR New Member

    Публикаций:
    0
    Регистрация:
    1 фев 2010
    Сообщения:
    28
    опять же не в этом дело

    процитирую себя
    тоесть ТС спрашивает, и мне тоже интересно, каким образом двойное двоеточие в метке m2, которое делает ее глобальной влияет на строку jmp m1. И кстати метки не внутри директив proc endp являются глобальными, собственно это было уже сказано, это видно из symbol table, так как туда локальные не попадают.
     
  9. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105
    Задаем :
    И получаем:
     
  10. Rockphorr

    Rockphorr Well-Known Member

    Публикаций:
    0
    Регистрация:
    9 июн 2004
    Сообщения:
    2.622
    Адрес:
    Russia
    EFiR
    может эффекты оптимизации - всякие там клише и прочее
    а вообще в масме много фокусов закопано - почитайте эдмонда про макросы тут на сайте