Здравствуйте, возникло пару вопросов, а собственно: 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 кодом клавишы, если совпадают, то переходить к вычислению соответсвующей операции.Или есть другие способы вычисления ? Заранее спасибо)
нельзя, как и нельзя выделить память неизвестной длины... нет... строка представляет собой статический массив символов... для этого нужно написать функцию конкатенации строк.. символ существует - значит существует код... гуглите ASCII таблицу...
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 Не ленись читать учебник, а лучше несколько учебников
Serjuk 1) Может это поможет Code (Text): #include <windows.h> #include <stdio.h> #include <wchar.h> int main(int argc, char* argv[]) { char szBuf[1024]; CharToOem(argv[1], szBuf); printf("%s\n",szBuf); return 0; } C:\_temp\ss>ss.exe "Привет мир" Привет мир 2) Не понятно ввод в какой программе? 3) Конечно можно, если писать эту строку в открытый файл. 4) Можно дописать вторую строку "в хвост" первой строке. Code (Text): invoke lstrcat,ADDR str1,ADDR srt2 5) Конечно существуют http://asciitable.com/ Ой опоздал ))))
Здравствуйте)Ребят объясните пожалуйста как компилировать графические приложения..Прочитал Ирвина, но там как то мало и не очень понятно... Code (Text): TITLE Графическое приложение для Windows ;Эта программа отображает на экране основное окно, размеры которого ;можно изменить, и несколько окон сообщений .386 .model flat,STDCALL INCLUDE GraphWin.inc ;====================Данные====================== .data AppLoadMsgTitle BYTE "Prilojenie zagryjeno",0 AppLoadMsgtext BYTE "Eto okno otobrajeno posle polycheniya" BYTE "coobweniya WM_CREATE",0 PopupTitle BYTE "Okno coobweniya",0 PopupText BYTE "Eto okno bilo aktivirovano posle " BYTE "polycheniya coobweniya WM_LBUTTONDOWN",0 GreetTitle BYTE "Ocnovnoe okno programmi aktivirovano ",0 GreetText BYTE "Eto okno otobrajeno cray posle vizova " BYTE "fynckcii CreateWindow i UpdateWindow",0 CloseMsg BYTE "Polycheno coobwenie WM_CLOSE",0 ErrorTitle BYTE "Owubka",0 WindowName BYTE "Grafucheckaya assemblernya programma",0 className BYTE "ASMWin",0 ;Определим структурную переменную, описывающую класс окна MainWin WNDCLASS <NULL,WinProc,NULL,NULL,NULL,NULL,NULL,\ COLOR_WINDOW,NULL,className> msg MSGStruct <> winRect RECT <> hMainWnd DWORD ? hInstance DWORD ? ;===================КОД========================= .code WinMain PROC ; Определим дескриптор текущего процесса INVOKE GetModuleHandle,NULL mov hInstance,eax mov MainWin.hInstance,eax ;Загрузим образы пиктограммы и курсора программы. INVOKE LoadIcon,NULL,IDI_APPLICATION mov MainWin.hIcon , eax INVOKE LoadCursor , NULL,IDC_ARROW mov MainWin.hCursor ,eax ;Зарегистрируем класс окна INVOKE RegisterClass,ADDR MainWin .IF eax ==0 call ErrorHandler jmp Exit_Program .ENDIF ;Создадим основное окно программы INVOKE CreateWindowEx, 0,ADDR className, ADDR WindowName,MAIN_WINDOW_STYLE CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT CW_USEDEFAULT,NULL,NULL,hInstance,NULL ;Если функция CreateWindowEx завершилась аварийно, отобразим ; сообщение и выйдем из программы. .IF eax ==0 call ErrorHandler jmp Exit_Program .ENDIF ;Запомним дескриптор окна, отобразим окно на экране и ;обновим его содержимое mov hMainWnd , eax INVOKE ShowWindow , hMainWnd , SW_SHOW INVOKE UpdateWindow , hMainWnd ;Выведем приветственное сообщение INVOKE MessageBox,hMainWnd,ADDR GreetText, ADDR GreetTitle, MB_OK ;Создадим цикл обработки сообщений Message_Loop: ;Получим новое сообщение из очереди INVOKE GetMessage,ADDR msg,NULL,NULL,NULL ;Если в очереди больше нет сообщений, завершим ;работу программы .IF eax == 0 jmp Exit_Program .ENDIF ;Отправим сообщение на обработку процедуре WinProc нашей программы INVOKE DispatchMessage , ADDR msg jmp Message_Loop Exit_Program: INVOKE ExitProcess,0 WinMain ENDP ;------------------------------------------- WinProc PROC, hWnd:DWORD,localMsg:DWORD,wParam:DWORD,lParam:DWORD ;Эта процедура обрабатывает некоторые сообщения,посылаемые ;системой Windows нашему приложению ;Обработка остальных сообщений выполняется стандартной ;процедурой системы Windows ;------------------------------------------- mov eax,localMsg .IF eax ==WM_LBUTTONDOWN ;Щелчок левой кнопкой мыши ? INVOKE MessageBox,hWnd,ADDR PopupText, ADDR PoputTitle,MB_OK jmp WinProcExit .ELSEIF eax == WM_CREATE ;Окно создано ? INVOKE MessageBox,hWnd,ADDR AppLoadMsgText, ADDR AppLoadMsgTitle, MB_OK jmp WinProcExit .ELSEIF eax == WM_CLOSE ; Окно закрыто? INVOKE MessageBox,hWnd,ADDR CloseMsg, ADDR WindowName,MB_OK INVOKE PostQuitMessage,0 jmp WinProcExit .ELSE ;другие сообщения INVOKE DefWindowProc , hWnd,localMsg,wParam,lParam jmp WinProcExit .ENDIF WinProcExit: ret WinProc ENDP ;------------------------------------------- ErrorHandler PROC ;Выведем системное сообщение об ошибке ;------------------------------------------- .data pErrorMsg DWORD ? ; Адрес сообщения об ошибке messageID DWORD ? .code INVOKE GetLastError ;в EAX возвращается код ошибки mov messageID,eax ;Определим адрес текстового сообщения об ошибке INVOKE FormatMessage , FORMAT_MESSAGE_ALLOCATE_BUFFER + \ FORMAT_MESSAGE_FROM_SYSTEM,NULL,messageID,NULL, ADDR pErrorMsg,NULL,NULL ;Отобразим сообщение об ошибке INVOKE MessageBox,NULL,pErrorMsg,ADDR ErrorTitle, MB_ICONERROR+MB_OK ;Освободим память, занимаемую текстовой строкой ;сообщения об ошибке INVOKE LocalFree, pErrorMsg ret ErrorHandler ENDP END WinMain
Great ээээ...это вставить в программу???консольные приложения я компилировал make32 название программы. А как компилировать графическое приложение, например такую программу?
Serjuk У меня папка masm - а стоит на С:\ Тут лежит пример простого оконного приложения: Code (Text): C:\masm32\examples\exampl01\oldstyle\oldstyle Скомпоновать (получить .obj) его можно с помощью батника: Code (Text): c:\MASM32\BIN\Lnk.bat oldstyle Ассемблировать и скомпоновать (получить .exe) Code (Text): c:\MASM32\BIN\Build.bat oldstyle Потренируйся на примерах из папки: Code (Text): C:\masm32\examples\exampl01
Сделай батник Code (Text): C:\masm32\bin\ml /c /coff /Cp Proj.asm C:\masm32\bin\link Proj.obj /subsystem:windows pause Где Proj имя программы, брось его в папку с .asm, после запускаешь и все.
попробовал..Вообщем, что делал: Есть папка winapi в ней находиться winapi.asm и есть папка программы masm32 в ней папки examples,INCLUDE,LIB , ну и много файлов..таких как ML.exe , LINK32.exe. На всякий случай поместил winapi.asm в masm32. Далее открываю cmd ,ввожу там: Code (Text): C:\masm32\ML /c /coff /Cp winapi.asm Выдает следующее: Выдает ошибку,что не может найти файл..Соответственно, никаких файлов не появляется..Далее набираю команду : Code (Text): C:\masm32\LINK32 winapi.obj /subsystem:windows и получаю : Что я делаю не так ?
Это надо в bat файл совать или указывать полный путь до asm файла add: странное расположение ml.exe он обычно лежит в \masm32\bin\ наверное версия старая add2: или же надо, если через cmd сменить через "cd" на делать нужно всё через батники. так быстрее add3: BYTE лучше заменить на db. так на два символа короче печатать, а разницы никакой.
6.15..вроде новая.. При варианте : C:\masm32\ML /c /coff /Cp C:/winapi/winapi.asm Получается : Выдает ошибки - вроде проверил, написано все нормально или это из-за того, что надо еще какую то библиотеку приписать ?
Думаю, у тебя определённо старый MASM. скачай MASM32 версия 10. GraphWin.inc он же вроде доисторический add: надо юзать kernel32.lib, kernel32.inc, user32.lib, user32.inc, windows.inc
Раньше я пользовался целой системой BAT-файлов для компиляции программ/библиотек. Но потом написал универсальный скрипт на Питоне, который позволяет одной короткой строкой скомпилировать проекты практически любой сложности, с любым количеством отдельно компилируемых модулей под MASM32, C/C++ (т.е. возможно смешанное программирование!) и RC-скриптов, расфасованных по разным директориям. Python гораздо продвинутее, чем бат. Не, ненормально! Со мной много раз подобное было, вроде ну всё правильно, а не работает. Первая мысль - масм глючит. Но в итоге всегда оказывалось, что таки не прав я, просто носом надо порыть.
Rel Перепробовал когда-то кучу разных IDE, всё оказалось полное г%. Питонский скрипт + Переменные среды + FAR*клавиатурные макросы = Самая продвинутая IDE в мире! В прочем, это кому как удобно.