Адрес метки кода в дата сегменте

Тема в разделе "MASM", создана пользователем alex_dz, 12 сен 2022.

  1. alex_dz

    alex_dz Member

    Публикаций:
    0
    Регистрация:
    26 июл 2006
    Сообщения:
    41
    Здравствуйте
    подскажите пож-та, можно ли в масм сделать такой финт ушами


    .data

    var1 DQ offset label1

    .code

    .... ; кодес

    label1: еще кодес
    ...


    пока получаю ошибку
    error A2006:undefined symbol : label1
     
  2. R81...

    R81... Member

    Публикаций:
    0
    Регистрация:
    1 фев 2020
    Сообщения:
    70
    Так ночь-то уже - надо комментарий отметить точкой с запятой!
    label1: ; еще кодес
     
  3. alex_dz

    alex_dz Member

    Публикаций:
    0
    Регистрация:
    26 июл 2006
    Сообщения:
    41
    а если серьезно? :)
    код - метафора
    вопрос стоит так - как в масме (и можно ли) с дата сегмента получить адрес метки в некой процедуре в кодосегменте
     
  4. Mikl___

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

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.358
    alex_dz,
    чтобы "с дата сегмента получить адрес метки в некой процедуре в кодосегменте" нужно метку в процедуре объявить, как глобальную, то есть после имени метки поставить два двоеточия «::»
    Код (ASM):
    1. . . .
    2.    invoke CreateWindowEx
    3. @@:  invoke GetMessage,&msg,0,0,0
    4.    cmp msg.wParam,VK_ESCAPE       ;user press 'Esc'?
    5.    je wmDESTROY; <--
    6.    invoke DispatchMessage,&msg
    7.    jmp @b
    8. WinMain endp
    9. WndProc proc hWnd:QWORD,Msg:QWORD,wParam:QWORD,lParam:QWORD
    10.    cmp edx, WM_DESTROY
    11.    jz wmDESTROY
    12.    cmp edx, WM_PAINT
    13.    jz wmPAINT
    14.    cmp edx, WM_CREATE
    15.    jz wmCREATE
    16.    leave
    17.    jmp DefWindowProc
    18. ; ---------------------------------------------------------------------------
    19. wmDESTROY:: invoke SelectObject,hBackDC,hOldBmp;<---
    20.    mov hGDITmp,rax
    21.    invoke DeleteObject,bufBMP
    22.  . . .
     
    alex_dz нравится это.
  5. R81...

    R81... Member

    Публикаций:
    0
    Регистрация:
    1 фев 2020
    Сообщения:
    70
    то дальше особо некуда.
    ;....
    B_ Equ Byte ptr
    .data
    _UpCode Proc
    Mov [CodeModify],0C3h ; RetN без одного из этих будет ;ошибка
    CodeModify Equ B_[$]
    Mov Cs,Ax
    ; в .data нельзя метки xxxx: в Masm, не утверждаю в Fasm ;~можно
    _UpCode EndP

    .code _TEXT_
    ;....
    Start:
    ;....
    Mov B_[_UpCode],0C3h ; RetN без одного из этих будет ;ошибка
    Call _UpCode ; !!!
    ;....
    end Start ; конец кода
     
    Последнее редактирование: 14 сен 2022
  6. alex_dz

    alex_dz Member

    Публикаций:
    0
    Регистрация:
    26 июл 2006
    Сообщения:
    41
    Позвольте еще один вопрос, пока не могу найти решение
    если кратко - есть потребность создать .exe но с експортом...

    если делаю таким образом -

    \masm64\bin64\polink.exe /SUBSYSTEM:WINDOWS /MACHINE:X64 /ENTRY:START /LARGEADDRESSAWARE %1.obj %1.res /DEF:%1.def
    то получаю длл-ку (не то)

    а если так
    \masm64\bin64\polink.exe /SUBSYSTEM:WINDOWS /MACHINE:X64 /ENTRY:START /LARGEADDRESSAWARE %1.obj %1.res /DEF:%1.def /OUT:%1.exe
    то уже создает .exe но! она не запускается,
    ошибка

    ---------------------------
    Total Commander
    ---------------------------
    Access denied on file
    c:\Dev\test.exe!
    "test.exe is not a valid Win32 application."
    ---------------------------
    OK
    ---------------------------

    Поисследовав собранную екзешку вижу, что линкер одновременно поставил два флага-

    upload_2022-9-17_20-48-39.png

    Если убрать руками 2ой флаг - File is a DLL, тогда файл нормально запускается
    Вот вопрос как указать линкеру чтоб нормально создавал екзе без таких кренделей