MASM

Тема в разделе "WASM.ASSEMBLER", создана пользователем Serjuk, 2 фев 2011.

  1. Serjuk

    Serjuk New Member

    Публикаций:
    0
    Регистрация:
    28 янв 2011
    Сообщения:
    17
    Здравствуйте, возникло пару вопросов, а собственно:
    1) Можно ли в ассемблере задавать русские буквы в строках , чтобы они потом корректно отображались в программе, например

    Код:

    str1 BYTE "привет"
    чтобы после компиляции в программе получилось "привет", а не абракадабра. В си это решалось оператором setlocale(LC_ALL,"Russian");

    2)Как сделать, чтобы после каждого ввода/вывода информации в программе она начинала со следующей строки ? Чтобы не было такого:
    vvedite dannyy ctroky A:sss
    sssvvedite cimvol c kotorogo prouzoudet podcoedinenie ctroki B k ctroke
    Где sss - то, что вводим (ReadString), sss - то, что выводим (WriteString) и оно налезает на вывод следующей строки.

    3) Можно ли задать массив неизвестной длины ? Например я хочу задать строку любой длины. Ведь если я задаю
    Код:

    buffer BYTE 50 DUP(0)
    - я ограничиваюсь только 49 символами ?

    4)можно ли строки складывать оператором add ? Например sdd + ass = sddass

    5)Существуют ли ASCII коды для "+","-","/","*". Для чего нужны : Например есть окно ввода арифметического выражения. Арифметическое выражение, которое вводиться может быть любым и заранее неизвестно, так вот для его вычисления, можно попробовать составить цикл в котором сравнивать каждый символ строки с ASCII кодом клавишы, если совпадают, то переходить к вычислению соответсвующей операции.Или есть другие способы вычисления ?

    Заранее спасибо)
     
  2. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.321
    нельзя, как и нельзя выделить память неизвестной длины...

    нет... строка представляет собой статический массив символов... для этого нужно написать функцию конкатенации строк..

    символ существует - значит существует код... гуглите ASCII таблицу...
     
  3. Mikl___

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

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.787
    Serjuk
    1) Если набираешь текст для DOS программ, то и набирать их нужно в DOS-кодировке (СР-866), если под Windows то соответственно в Windows кодировке (1251) если набор идет в редакторе FAR'a то там кодировка переключается клавишей F8 если в другом текстовом редакторе, то нужно смотреть в справке к редактору
    2) напишите так db "введите данную строку", 0Dh,0Ah, "A:sss" если я правильно понял и нужен перевод на другую строку но по моему идет путаница с Паскалем или Си
    3) можно, но для этого нужно использовать функции выделения памяти
    4) нельзя, но содержимое строк sdd и ass можно скопировать в новую строку, в которой будет и содержимое строки sdd и содержимое строки ass
    5) если пишешь под DOS то используй функции 9 и 16h прерываний, там идет работа со скан-кодами клавиш или с ASCII-кодами нажатых клавишь
    PS Не ленись читать учебник, а лучше несколько учебников
     
  4. _sheva740

    _sheva740 New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2005
    Сообщения:
    1.539
    Адрес:
    Poland
    Serjuk
    1) Может это поможет
    Код (Text):
    1. #include <windows.h>
    2. #include <stdio.h>
    3. #include <wchar.h>
    4. int main(int argc, char* argv[])
    5. {
    6.   char szBuf[1024];
    7.   CharToOem(argv[1], szBuf);
    8.   printf("%s\n",szBuf);
    9.   return 0;
    10. }
    11.  
    12.  
    13. C:\_temp\ss>ss.exe "Привет мир"
    14. Привет мир
    2) Не понятно ввод в какой программе?
    3)
    Конечно можно, если писать эту строку в открытый файл.
    4)
    Можно дописать вторую строку "в хвост" первой строке.
    Код (Text):
    1.        invoke lstrcat,ADDR str1,ADDR srt2
    5) Конечно существуют http://asciitable.com/

    Ой опоздал ))))
     
  5. Serjuk

    Serjuk New Member

    Публикаций:
    0
    Регистрация:
    28 янв 2011
    Сообщения:
    17
    Здравствуйте)Ребят объясните пожалуйста как компилировать графические приложения..Прочитал Ирвина, но там как то мало и не очень понятно...
    Код (Text):
    1. TITLE Графическое приложение для Windows
    2.  
    3. ;Эта программа отображает на экране основное окно, размеры которого
    4. ;можно изменить, и несколько окон сообщений
    5.  
    6. .386
    7. .model flat,STDCALL
    8. INCLUDE GraphWin.inc
    9.  
    10. ;====================Данные======================
    11.  
    12. .data
    13.  
    14. AppLoadMsgTitle  BYTE  "Prilojenie zagryjeno",0
    15. AppLoadMsgtext   BYTE  "Eto okno otobrajeno posle polycheniya"
    16.                  BYTE  "coobweniya WM_CREATE",0
    17.  
    18. PopupTitle       BYTE  "Okno coobweniya",0
    19. PopupText        BYTE  "Eto okno bilo aktivirovano posle "
    20.                  BYTE  "polycheniya coobweniya WM_LBUTTONDOWN",0
    21. GreetTitle       BYTE  "Ocnovnoe okno programmi aktivirovano ",0
    22. GreetText        BYTE  "Eto okno otobrajeno cray posle vizova "
    23.                  BYTE  "fynckcii CreateWindow i UpdateWindow",0
    24. CloseMsg         BYTE  "Polycheno coobwenie WM_CLOSE",0
    25. ErrorTitle       BYTE  "Owubka",0
    26. WindowName       BYTE  "Grafucheckaya assemblernya programma",0
    27. className        BYTE  "ASMWin",0
    28.  
    29. ;Определим структурную переменную, описывающую класс окна
    30.  
    31. MainWin   WNDCLASS <NULL,WinProc,NULL,NULL,NULL,NULL,NULL,\
    32.                     COLOR_WINDOW,NULL,className>
    33.  
    34. msg            MSGStruct <>
    35. winRect        RECT      <>
    36. hMainWnd       DWORD     ?
    37. hInstance      DWORD     ?
    38.  
    39.  
    40. ;===================КОД=========================
    41.  
    42. .code
    43. WinMain PROC
    44. ; Определим дескриптор текущего процесса
    45. INVOKE GetModuleHandle,NULL
    46. mov hInstance,eax
    47. mov MainWin.hInstance,eax
    48.  
    49. ;Загрузим образы пиктограммы и курсора программы.
    50. INVOKE LoadIcon,NULL,IDI_APPLICATION
    51. mov MainWin.hIcon , eax
    52.  
    53. INVOKE LoadCursor , NULL,IDC_ARROW
    54. mov MainWin.hCursor ,eax
    55.  
    56. ;Зарегистрируем класс окна
    57. INVOKE RegisterClass,ADDR MainWin
    58. .IF eax ==0
    59. call ErrorHandler
    60. jmp Exit_Program
    61. .ENDIF
    62.  
    63. ;Создадим основное окно программы
    64. INVOKE CreateWindowEx, 0,ADDR className,
    65.        ADDR WindowName,MAIN_WINDOW_STYLE
    66.        CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT
    67.        CW_USEDEFAULT,NULL,NULL,hInstance,NULL
    68.  
    69. ;Если функция CreateWindowEx завершилась аварийно, отобразим
    70. ; сообщение и выйдем из программы.
    71. .IF eax ==0
    72. call ErrorHandler
    73. jmp Exit_Program
    74. .ENDIF
    75.  
    76. ;Запомним дескриптор окна, отобразим окно на экране и
    77. ;обновим его содержимое
    78. mov hMainWnd , eax
    79. INVOKE ShowWindow , hMainWnd , SW_SHOW
    80. INVOKE UpdateWindow , hMainWnd
    81.  
    82. ;Выведем приветственное сообщение
    83. INVOKE MessageBox,hMainWnd,ADDR GreetText,
    84.        ADDR GreetTitle, MB_OK
    85.  
    86. ;Создадим цикл обработки сообщений
    87. Message_Loop:
    88.  
    89. ;Получим новое сообщение из очереди
    90. INVOKE GetMessage,ADDR msg,NULL,NULL,NULL
    91.  
    92. ;Если в очереди больше нет сообщений, завершим
    93. ;работу программы
    94. .IF eax == 0
    95. jmp Exit_Program
    96. .ENDIF
    97.  
    98. ;Отправим сообщение на обработку процедуре WinProc нашей программы
    99. INVOKE DispatchMessage , ADDR msg
    100. jmp Message_Loop
    101.  
    102. Exit_Program:
    103. INVOKE ExitProcess,0
    104. WinMain ENDP
    105.  
    106.  
    107. ;-------------------------------------------
    108. WinProc PROC,
    109.             hWnd:DWORD,localMsg:DWORD,wParam:DWORD,lParam:DWORD
    110. ;Эта процедура обрабатывает некоторые сообщения,посылаемые
    111. ;системой Windows нашему приложению
    112. ;Обработка остальных сообщений выполняется стандартной
    113. ;процедурой системы Windows
    114. ;-------------------------------------------
    115.  
    116. mov eax,localMsg
    117. .IF eax ==WM_LBUTTONDOWN ;Щелчок левой кнопкой мыши ?
    118. INVOKE MessageBox,hWnd,ADDR PopupText,
    119.        ADDR PoputTitle,MB_OK
    120. jmp WinProcExit
    121.  
    122. .ELSEIF eax == WM_CREATE ;Окно создано ?
    123. INVOKE MessageBox,hWnd,ADDR AppLoadMsgText,
    124.        ADDR AppLoadMsgTitle, MB_OK
    125. jmp WinProcExit
    126.  
    127. .ELSEIF eax == WM_CLOSE ; Окно закрыто?
    128. INVOKE MessageBox,hWnd,ADDR CloseMsg,
    129.        ADDR WindowName,MB_OK
    130. INVOKE PostQuitMessage,0
    131. jmp WinProcExit
    132. .ELSE ;другие сообщения
    133. INVOKE DefWindowProc , hWnd,localMsg,wParam,lParam
    134. jmp WinProcExit
    135. .ENDIF
    136.  
    137. WinProcExit:
    138. ret
    139. WinProc ENDP
    140.  
    141. ;-------------------------------------------
    142.  
    143. ErrorHandler PROC
    144. ;Выведем системное сообщение об ошибке
    145. ;-------------------------------------------
    146.  
    147. .data
    148. pErrorMsg    DWORD  ?       ; Адрес сообщения об ошибке
    149. messageID    DWORD  ?
    150.  
    151. .code
    152. INVOKE GetLastError     ;в EAX возвращается код ошибки
    153. mov messageID,eax  
    154.  
    155. ;Определим адрес текстового сообщения об ошибке
    156. INVOKE FormatMessage , FORMAT_MESSAGE_ALLOCATE_BUFFER + \
    157.  
    158. FORMAT_MESSAGE_FROM_SYSTEM,NULL,messageID,NULL,
    159.                           ADDR pErrorMsg,NULL,NULL
    160.  
    161. ;Отобразим сообщение об ошибке
    162. INVOKE MessageBox,NULL,pErrorMsg,ADDR ErrorTitle,
    163. MB_ICONERROR+MB_OK
    164. ;Освободим память, занимаемую текстовой строкой
    165. ;сообщения об ошибке
    166. INVOKE LocalFree, pErrorMsg
    167. ret
    168. ErrorHandler ENDP
    169. END WinMain
     
  6. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    SetConsoleOutputCP (GetACP());
     
  7. Serjuk

    Serjuk New Member

    Публикаций:
    0
    Регистрация:
    28 янв 2011
    Сообщения:
    17
    Great
    ээээ...это вставить в программу???консольные приложения я компилировал make32 название программы. А как компилировать графическое приложение, например такую программу?
     
  8. _sheva740

    _sheva740 New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2005
    Сообщения:
    1.539
    Адрес:
    Poland
    Serjuk
    У меня папка masm - а стоит на С:\
    Тут лежит пример простого оконного приложения:
    Код (Text):
    1.  C:\masm32\examples\exampl01\oldstyle\oldstyle
    Скомпоновать (получить .obj) его можно с помощью батника:
    Код (Text):
    1. c:\MASM32\BIN\Lnk.bat oldstyle
    Ассемблировать и скомпоновать (получить .exe)
    Код (Text):
    1. c:\MASM32\BIN\Build.bat oldstyle
    Потренируйся на примерах из папки:
    Код (Text):
    1. C:\masm32\examples\exampl01
     
  9. Karych

    Karych New Member

    Публикаций:
    0
    Регистрация:
    25 янв 2011
    Сообщения:
    4
    Сделай батник


    Код (Text):
    1. C:\masm32\bin\ml /c /coff /Cp Proj.asm
    2.  
    3.  
    4. C:\masm32\bin\link Proj.obj  /subsystem:windows
    5.  
    6. pause
    Где Proj имя программы, брось его в папку с .asm, после запускаешь и все.
     
  10. Serjuk

    Serjuk New Member

    Публикаций:
    0
    Регистрация:
    28 янв 2011
    Сообщения:
    17
    Спасибо вам, попробую!)
     
  11. Serjuk

    Serjuk New Member

    Публикаций:
    0
    Регистрация:
    28 янв 2011
    Сообщения:
    17
    попробовал..Вообщем, что делал:
    Есть папка winapi в ней находиться winapi.asm и есть папка программы masm32 в ней папки examples,INCLUDE,LIB , ну и много файлов..таких как ML.exe , LINK32.exe. На всякий случай поместил winapi.asm в masm32.
    Далее открываю cmd ,ввожу там:
    Код (Text):
    1. C:\masm32\ML /c /coff /Cp winapi.asm
    Выдает следующее:
    Выдает ошибку,что не может найти файл..Соответственно, никаких файлов не появляется..Далее набираю команду :
    Код (Text):
    1. C:\masm32\LINK32 winapi.obj /subsystem:windows
    и получаю :
    Что я делаю не так ?
     
  12. kernel16

    kernel16 Human Vl

    Публикаций:
    0
    Регистрация:
    29 окт 2010
    Сообщения:
    316
    Это надо в bat файл совать или указывать полный путь до asm файла

    add:
    странное расположение ml.exe он обычно лежит в \masm32\bin\ наверное версия старая

    add2: или же надо, если через cmd
    сменить через "cd" на
    делать нужно всё через батники. так быстрее

    add3:
    BYTE лучше заменить на db. так на два символа короче печатать, а разницы никакой.
     
  13. Serjuk

    Serjuk New Member

    Публикаций:
    0
    Регистрация:
    28 янв 2011
    Сообщения:
    17
    6.15..вроде новая..

    При варианте :
    C:\masm32\ML /c /coff /Cp C:/winapi/winapi.asm

    Получается :
    Выдает ошибки - вроде проверил, написано все нормально или это из-за того, что надо еще какую то библиотеку приписать ?
     
  14. kernel16

    kernel16 Human Vl

    Публикаций:
    0
    Регистрация:
    29 окт 2010
    Сообщения:
    316
    Думаю, у тебя определённо старый MASM. скачай MASM32 версия 10. GraphWin.inc он же вроде доисторический
    add: надо юзать kernel32.lib, kernel32.inc, user32.lib, user32.inc, windows.inc
     
  15. Karych

    Karych New Member

    Публикаций:
    0
    Регистрация:
    25 янв 2011
    Сообщения:
    4
    Пишет что синтаксическая ошибка, проверь лучше и в INVOKE аргументы.
     
  16. LShadow77

    LShadow77 New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2010
    Сообщения:
    36
    Раньше я пользовался целой системой BAT-файлов для компиляции программ/библиотек.
    Но потом написал универсальный скрипт на Питоне, который позволяет одной короткой строкой скомпилировать проекты практически любой сложности, с любым количеством отдельно компилируемых модулей под MASM32, C/C++ (т.е. возможно смешанное программирование!) и RC-скриптов, расфасованных по разным директориям. Python гораздо продвинутее, чем бат.

    Не, ненормально! Со мной много раз подобное было, вроде ну всё правильно, а не работает. Первая мысль - масм глючит. Но в итоге всегда оказывалось, что таки не прав я, просто носом надо порыть.
     
  17. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.321
    а нормальная IDE гораздо продвинутее, чем Питон... например тот же кодблокс..
     
  18. LShadow77

    LShadow77 New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2010
    Сообщения:
    36
    Rel
    Перепробовал когда-то кучу разных IDE, всё оказалось полное г%.
    Питонский скрипт + Переменные среды + FAR*клавиатурные макросы = Самая продвинутая IDE в мире!
    В прочем, это кому как удобно.
     
  19. Mikl___

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

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.787
  20. LShadow77

    LShadow77 New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2010
    Сообщения:
    36
    Как-нибудь может выложу универсальный py-файл (если жаба отпустит :) )