Вывод строки на масм в месаджбокс

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by Welemir, 31 Jul 2010.

  1. Welemir

    Welemir Elder - Старейшина

    Joined:
    10 Jan 2008
    Messages:
    229
    Likes Received:
    11
    Reputations:
    -4
    Такой вот код имеется:

    .386
    .model flat, stdcall
    ExitProcess PROTO ,:DWORD
    MessageBoxA PROTO ,:DWORD, :DWORD, :DWORD, :DWORD

    .data

    MsgBoxCaption db 'fuck',0
    MsgBoxText db 'shit',0

    .const

    NULL equ 0
    MB_OK equ 0

    .code
    Main:
    INVOKE MessageBoxA, NULL, ADDR MsgBoxText, ADDR MsgBoxCaption, MB_OK
    INVOKE ExitProcess, NULL
    end Main


    Разъясните новичку,пожалуйста,следующие нюансы:


    1) зачем здесь строка .const ? Чето мне подсказывает.что это константный сегмент,но,имхо,я о таком не слышал.А знать хочется,что это.
    2) Можно ли не писать каждый раз прото,а подключать функции апи как в рнр инклудом ?
    3) Почему типы всех параметров апи функций месаджбокс и экзит процесс дворд ?! почему не куворд или творд?
    4) Почему в конце данной программы не написано end ?!
    5) MsgBoxCaption db 'fuck',0 .Эта запись означает запись двоичного нуля в конец строки.Что будет,если вместо 0 подставить что-нибудь ? Значение допишется к строке 'fuck' ?! Никогда не встречал такого(((.


    Собсно,данный пример не компилится,хотя автор этой статьи на xserver.ru походу утверждает,что она рабочая (на масм написана).Ошибки следующие:


    a.obj : error LNK2001: unresolved external symbol _ExitProcess@4
    a.obj : error LNK2001: unresolved external symbol _MessageBoxA@16
    C:\WinAsm\Projects\a.exe : fatal error LNK1120: 2 unresolved externals

    Какие-то неразрешённые внешние символы,но как всё это понять ? Ошибки,я так понял,происходят на стадии линковки.И что означают символы собаки и цифры рядышком ? Ну,третья строка лога ошибок просто походу подводит итог о количестве констант.
    Также фраза *допишите* юзер32.либ к конце строки транслятора мне непонятна.Как сделать так,чтобы заработал пример?(
     
  2. altblitz

    altblitz Elder - Старейшина

    Joined:
    5 Jun 2009
    Messages:
    3,697
    Likes Received:
    3,139
    Reputations:
    236
    1. поставьте MinGW
    2. потому что MS Win код - корявый.
    3. в мануалах ассемблера GCC/MinGW четко описано, какая область памяти - что делает, и за что отвечает.

    для начала - слить среду разработки с sf.net Ming
    толковые и нужные примеры. masm - кал.
     
  3. BrainDeaD

    BrainDeaD Elder - Старейшина

    Joined:
    9 Jun 2005
    Messages:
    774
    Likes Received:
    292
    Reputations:
    214
    0) в асме не шарю.
    1) да это сегмент константных данных.
    2) хз. -> 0)
    3) потому что так устроен windows и его апи.
    4) там какбы и asm в начале не написано. на сколько я знаю asm и end выделяют ту часть которая написана на чистом ассемблере, типа mov, pop и тд. без всяких invoke и других. на масме для win32 начинается с .386.
    5)думаю оно допишется к строке и ещё куча мусора хранящаяся в памати, так как строка ansi должна заканчиваться двоичым нулём. возможно компайлер просто выдаст ошибку.
    6) ошибки выдаёт т.к ты не подключил нужные библиотеки.
    делается как-то так:

    .386
    .model flat, stdcall
    option casemap:none
    include \masm32\include\windows.inc
    include \masm32\include\kernel32.inc
    includelib \masm32\lib\kernel32.lib
    ...

    7)после @ стоит размер параметра в стеке.

    п.с. если где-то ошибся, смотри пинкт 0).
     
    #3 BrainDeaD, 31 Jul 2010
    Last edited: 31 Jul 2010
  4. Welemir

    Welemir Elder - Старейшина

    Joined:
    10 Jan 2008
    Messages:
    229
    Likes Received:
    11
    Reputations:
    -4
    altblitz, ответ поставьте мин гв вне конкуренции : )))).Таким макаром можно вообще среду менять как перчатки.
    Ответы типо хз ни о чём.За все возможные ответы по теме - большое спасибо.Мне,как новичку,это было необходимо.
     
  5. Welemir

    Welemir Elder - Старейшина

    Joined:
    10 Jan 2008
    Messages:
    229
    Likes Received:
    11
    Reputations:
    -4
    Надеюсь,вы понимаете,что тяжело каждый раз привыкать к новой среде разработки...
     
  6. Welemir

    Welemir Elder - Старейшина

    Joined:
    10 Jan 2008
    Messages:
    229
    Likes Received:
    11
    Reputations:
    -4
    Так,проблема с библами решена благодаря BrainDead.Господи,я перебрал всевозможные варианты и комбинации синтаксиса инклуда и инклудлиб,а оказывается,ошибка была в том,что я указал расширение инк,а не либ ХДД.Ппц,пакеты масм32 одинаковые(один с оффа,другой тоже,но у другого чела),но в одном расширения либ,а в другом - инк))).Всё-таки я добился своего))))))))))).Осталось только узнать,в какой либе лежит какая функция...
     
  7. Ins3t

    Ins3t Харьковчанин

    Joined:
    18 Jul 2009
    Messages:
    939
    Likes Received:
    429
    Reputations:
    139
    Все верно, это константа.
    Я не знаю что такое "рнр", но можно вынести все инклуды в отдельный файл. Например:
    File includes.inc:
    Затем в коде подключать
    (пример на фасме).

    Не обязательно WORD. Могло быть BYTE, DWORD, DQWORD и так далее. В даном случае используется ворд(одно слово).

    А как же "end Main"?

    Обозначает конец строки. В такой программе это не критично, но следует соблюдать это правило.
     
  8. zeppe1in

    zeppe1in Elder - Старейшина

    Joined:
    12 Jul 2006
    Messages:
    343
    Likes Received:
    66
    Reputations:
    18
    ну вот тут же всё написано
    http://wasm.ru/publist.php?list=1
     
  9. swt1

    swt1 Elder - Старейшина

    Joined:
    16 Feb 2008
    Messages:
    306
    Likes Received:
    78
    Reputations:
    21
    да ему в начале говорил,а тут тем столько :(
     
  10. Gar|k

    Gar|k Moderator

    Joined:
    20 Mar 2009
    Messages:
    1,166
    Likes Received:
    266
    Reputations:
    82
    Я тоже хочу по умничать! )))

    3) есть такая штука как msdn идешь туда и вбиваешь нужную тебе функцию (там же можно и посмотреть как с ними работать) и в самом верху тебе будет написано
    Code:
    int WINAPI MessageBox(
      __in_opt  HWND hWnd,
      __in_opt  LPCTSTR lpText,
      __in_opt  LPCTSTR lpCaption,
      __in      UINT uType
    );
    
    Library	User32.lib
    DLL	User32.dll
    
    что означает что функций возвращает int значение - а это 4 байта DWORD и лежит в user32.dll. Полезно в общем заглядывать в msdn, а пока читай "Туториалы Iczelion'а о Win32 API" ссылку на которые тебе уже не раз давали )

    4) потому что это не паскаль
    5) система windows впрочем как и nix системы написана на языке Си, а в си строки заканчиваются нулевым битом.
     
    _________________________
  11. Welemir

    Welemir Elder - Старейшина

    Joined:
    10 Jan 2008
    Messages:
    229
    Likes Received:
    11
    Reputations:
    -4
    Спасибо вам большое,но я уже раньше разобрался,а потом инет пропал аж на трое суток.Да,мсдн для меня открыл новые горизонты))),даже описание на русском иногда попадается.
    Но с недавнего времени перестал корректно работать такой код:


    Code:
    
    ..386
    .model flat,stdcall
    
    includelib C:\winasm\masm32\lib\kernel32.lib
    includelib C:\winasm\masm32\lib\user32.lib
    include C:\winasm\masm32\include\kernel32.inc
    include C:\winasm\masm32\include\user32.inc
    
    .data
    
    res db 'ahah',0
    
    .code
    
    start:
    
    
    INVOKE MessageBox,0,res,res,0
    INVOKE ExitProcess,0
    
    
    end start
    
    end
    
    
    

    Трансляция и компоновка проходят без ошибок,но в висте ЕХЕшнег закрывается с ошибкой,как будто бы процесс упал)).Раньше этот пример работал (.


    В качестве доказательства:



    C:\winasm\masm32\bin\ML /c /coff /Cp /nologo /I"C:\winasm\masm32\include" "C:\WinAsm\Projects\a.asm"

    Assembling: C:\WinAsm\Projects\a.asm

    C:\winasm\masm32\bin\Link @"C:\WinAsm\Projects\link.war"

    Microsoft (R) Incremental Linker Version 5.12.8078
    Copyright (C) Microsoft Corp 1992-1998. All rights reserved.

    /SUBSYSTEM:WINDOWS /RELEASE /VERSION:4.0 "/LIBPATH:C:\winasm\masm32\lib" "C:\WinAsm\Projects\a.obj" "/OUT:C:\WinAsm\Projects\a.exe"

    Make finished. 0 error(s) occured.
     
    #11 Welemir, 2 Aug 2010
    Last edited: 2 Aug 2010
  12. Catbert

    Catbert Banned

    Joined:
    29 Jun 2010
    Messages:
    80
    Likes Received:
    27
    Reputations:
    10
    А он когда-то работал? Пиши
    INVOKE MessageBox,0,offset res,offset res,0
     
  13. Welemir

    Welemir Elder - Старейшина

    Joined:
    10 Jan 2008
    Messages:
    229
    Likes Received:
    11
    Reputations:
    -4
    упс...забыл адреса ))))))))))))))))))))