Страница 1 из 3
Теория и практика masm32 под windows 7.
Добавлено: Пт июн 07, 2013 08:02:17
АндрейАвербах
Всем доброго времени суток, пытаюсь познать программирование на ассемблере в masm32 программировать под DOS пробовал тоже, обучался по "Дневникам чайника", но они закончились и встал вопрос выбора дальнейшей литературы для изучения сего вопроса. Долгосрочная перспектива есть: мы с другом хотим создать игрушку типа Танчиков. Только не надо мне говорить, что так не бывает, захотел и создал, сам знаю, не бывает. Но учиться готов. Самое большое, что могу написать на масме32 после изучения "Дневников чайника", программку, которая выводит на экран сообщение в окне типа MB_OK. Посоветуйте, что читать дальше, желательно, чтоб было актуально для windows7.
Самый большой геммор с API функциями.
ЗЫ. На другой язык переходить крайне не охота, хочется написать именно на асме.
ЗЫ2. Если попал не в тот раздел/сайт, то в описании раздела есть строчка "языки программирования".
Re: Теория и практика masm32 под windows 7.
Добавлено: Пт июн 07, 2013 10:07:33
ChipKiller
Re: Теория и практика masm32 под windows 7.
Добавлено: Пт июн 07, 2013 11:27:37
Cheba
А лучше всё же перейти на другой язык и не мучаться. Если речь идёт исключительно о Windows, то С# - на мой вкус прекрасный выбор.
Re: Теория и практика masm32 под windows 7.
Добавлено: Пт июн 07, 2013 11:52:57
Мурик
Многие языки высокого уровня поддерживают ассемблерные вставки, а некоторые (например, PureBasic) позволяют кодить на ассемблере (FASM) вперемешку в кодом ЯВУ.
Только непонятно желание разрабатывать на асме. Это ведь требует больше сил и времени чем разработка на ЯВУ, а преимущества практически нет.
Re: Теория и практика masm32 под windows 7.
Добавлено: Пт июн 07, 2013 13:47:52
АндрейАвербах
Я тоже подумываю стоит ли, так как программа не хочет компилиться, короче, набираю в масм32 едитор такой код
Код: Выделить всё
.386
.model flat,stdcall
option casemap:none
include \masm32\include\windows.inc
include \masm32\include\user32.inc
includelib \masm32\lib\user32.lib ; calls to functions in user32.lib and kernel32.lib
include \masm32\include\kernel32.inc
includelib \masm32\lib\kernel32.lib
WinMain proto :DWORD,:DWORD,:DWORD,:DWORD
.DATA ; initialized data
ClassName db "SimpleWinClass",0 ; Имя нашего класса окна
AppName db "Our First Window",0 ; Имя нашего окна
.DATA? ; Hеиницилизиpуемые данные
hInstance HINSTANCE ? ; Хэндл нашей пpогpаммы
CommandLine LPSTR ?
.CODE ; Здесь начинается наш код
start:
invoke GetModuleHandle, NULL ; Взять хэндл пpогpаммы
; Под Win32, hmodule==hinstance mov hInstance,eax
mov hInstance,eax
invoke GetCommandLine ; Взять командную стpоку. Вы не обязаны
вызывать эту функцию ЕСЛИ ваша пpогpамма не обpабатывает командную стpоку.
mov CommandLine,eax
invoke WinMain, hInstance,NULL,CommandLine, SW_SHOWDEFAULT ; вызвать основную функцию
invoke ExitProcess, eax ; Выйти из пpогpаммы.
; Возвpащаемое значение, помещаемое в eax, беpется из WinMain'а.
WinMain proc
hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD
LOCAL wc:WNDCLASSEX ; создание локальных пеpеменных в стеке
LOCAL msg:MSG
LOCAL hwnd:HWND
mov wc.cbSize,SIZEOF WNDCLASSEX ; заполнение стpуктуpы wc
mov wc.style, CS_HREDRAW or CS_VREDRAW
mov wc.lpfnWndProc, OFFSET WndProc
mov wc.cbClsExtra,NULL
mov wc.cbWndExtra,NULL
push hInstance
pop wc.hInstance
mov wc.hbrBackground,COLOR_WINDOW+1
mov wc.lpszMenuName,NULL
mov wc.lpszClassName,OFFSET ClassName
invoke LoadIcon,NULL,IDI_APPLICATION
mov wc.hIcon,eax
mov wc.hIconSm,eax
invoke LoadCursor,NULL,IDC_ARROW
mov wc.hCursor,eax
invoke RegisterClassEx, addr wc ; pегистpация нашего класса окна
invoke CreateWindowEx,NULL,\
ADDR ClassName,\
ADDR AppName,\
WS_OVERLAPPEDWINDOW,\
CW_USEDEFAULT,\
CW_USEDEFAULT,\
CW_USEDEFAULT,\
CW_USEDEFAULT,\
NULL,\
NULL,\
hInst,\
NULL
mov hwnd,eax
invoke ShowWindow, hwnd,CmdShow ; отобpазить наше окно на десктопе
invoke UpdateWindow, hwnd ; обновить клиентскую область
.WHILE TRUE ; Enter message loop
invoke GetMessage, ADDR msg,NULL,0,0
.BREAK .IF (!eax)
invoke TranslateMessage, ADDR msg
invoke DispatchMessage, ADDR msg
.ENDW
mov eax,msg.wParam ; сохpанение возвpащаемого значения в eax
ret
WinMain endp
WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
.IF uMsg==WM_DESTROY ; если пользователь закpывает окно
invoke PostQuitMessage,NULL ; выходим из пpогpаммы
.ELSE
invoke DefWindowProc,hWnd,uMsg,wParam,lParam ; Дефаултная функция обpаботки окна
ret
.ENDIF
xor eax,eax
ret
WndProc endp
end start
Я пытаюсь все это скомпилить, но мне вылазит в черном окошечке куча ошибок (может потому, что я не установил хатчевский windows.inc?) и ничего не компилится. Больше всего ругается на wc. Может и правда нет смысла писать на асме, но мне не рекомендуется его забывать, так как МК я программирую на асме(программатор еще не пришел), решил попробовать компушный асм, но увы... И я боюсь, что если стану программровать на другом языке, то забуду МК-асм.
Cheba, а C++ пойдет, они как я понимаю, родственники. И где найти учебник по этому языку?
Re: Теория и практика masm32 под windows 7.
Добавлено: Пт июн 07, 2013 14:03:17
black_lizard
Так и не понял смысла в АСМЕ. С++ и 2д двигло HGE - позволяют творить чудеса. Я когда-то пытался на асме хотя бы виндовское окно открыть, с кучей параметров и структур. Тот ещё гемор.
Если цель - просто написать игру, то смысла в ассемблере нет.
Если вы думаете, что ассемблер способен дать вам больше скорости, чем ЯВУ, то вынужден вас огорчить - оптимизаторы под X86 платформу оптимизируют код значительно лучше, чем большинство программистов, которые пишут на асме, так как используют команды процессора, которых не было на том же 286, на котором пахал ДОС, их нужно отдельно изучать и литература по этому поводу мне не встречалась. Даже шейдеры пишут в основном на Си.
Re: Теория и практика masm32 под windows 7.
Добавлено: Пт июн 07, 2013 14:13:03
АндрейАвербах
Re: Теория и практика masm32 под windows 7.
Добавлено: Пт июн 07, 2013 14:32:56
black_lizard
АндрейАвербах писал(а):2д двигло HGE
Это что?
Библиотека. Подключается к программе. Там есть набор функций, загрузить изображение, нарисовать изображение, вывести на экран. И программируется куда проще, чем winapi. К тому же быстрее, потому что использует видеоускоритель. Теоретически, его можно и к ассемблеру подцепить, но нужно писать врапер.
Re: Теория и практика masm32 под windows 7.
Добавлено: Пт июн 07, 2013 14:46:10
Engineer_Keen
АндрейАвербах писал(а):я боюсь, что если стану программровать на другом языке, то забуду МК-асм.
Зря боитесь. Одно другому не мешает, тем более что сам ассемблер у AVR и x86 прилично различается. Писать на ассемблере под windows имеет наверно смысл только в общеобразовательных целях, да и то если делать нечего, ну или если действительно нужно сделать что-то мегаоптимизированное. Я раньше немного баловался ассемблерными вставками в delphi, когда например надо было работать с ком-портом, но чем новее винда, тем меньше она разрешает делать и приходится использовать ее стандартные библиотеки (а с семеркой я даже и не пробовал). Вы же не забываете ассемблер, когда разговариваете по русски?

Re: Теория и практика masm32 под windows 7.
Добавлено: Пт июн 07, 2013 14:50:34
Satyr
Engineer_Keen писал(а):
Зря боитесь. Одно другому не мешает, тем более что сам ассемблер у AVR и x86 прилично различается.
Разве ктото говорил про AVR ? -))
Да и ассемблер, в смысле мнемонических названий комманд, подо все более менее придерживаются одинаковых.
А система комманд да, другая

Re: Теория и практика masm32 под windows 7.
Добавлено: Пт июн 07, 2013 14:54:20
АндрейАвербах
Нет, не забываю
Начал обучаться программированию в C++, ввожу в компиляторе Dev-C++ следующий код
Код: Выделить всё
// Ïðîãðàììà äëÿ ïðåîáðàçîâàíèÿ
// ãðàäóñîâ Öåëüñèÿ â ãðàäóñû Ôàðåíãåéòà:
// Fahrenheit = NCelsius * (212 - 32)/100 + 32
//
#include <stdio.h>
#include <iostream.h>
int main(int nNumberofArgs, char* pszArgs[])
{
int nNCelsius;
cout << "Input temperature: ";
cin >> nNCelsius;
int nNFactor;
nNFactor = 212 - 32;
int nFahrenheit;
nFahrenheit = nNFactor * nNCelsius/100 + 32;
cout << "Temperature:";
cout << nFahrenheit;
return 0;
}
Компилю, начинаю выполнять вылезает черное окошко с надписью Input temperature, я жму 2, жму enter, в окне на долю секунды появляется результат и оно исчезает. Как сделать так, чтоб оно не исчезало, и я бы смог прочитать результат?
Разве ктото говорил про AVR ?
Подразумевал

Re: Теория и практика masm32 под windows 7.
Добавлено: Пт июн 07, 2013 15:16:57
Мурик
АндрейАвербах писал(а):набираю в масм32 едитор такой код
А не много ли строк для создания окна?
На ЯВУ это можно сделать парой строк кода.
Код: Выделить всё
OpenWindow(0,0,0,200,100, "Окно", #PB_Window_MinimizeGadget | #PB_Window_ScreenCentered)
Repeat
Event = WaitWindowEvent()
Until Event = #PB_Event_CloseWindow
И более того, размер исполняемого файла и скорость работы будут почти как на асме. Помните рекламу про стиральный порошок? "Если нет разницы, то зачем платить больше?"
И еще, в коде нет WinAPI, а значит его можно скомпилировать не только под Windows, но и под другие платформы, такие как Linux и MacOS X.
Re: Теория и практика masm32 под windows 7.
Добавлено: Пт июн 07, 2013 15:45:32
АндрейАвербах
Скачал ваш файл, пишет ошибку.
Я хочу написать программу, которая будет получать цифру с клавы и выводить на монитор
вот код
Код: Выделить всё
#include <stdio.h>
#include <iostream.h>
int main()
{
int nAny;
cout << "Input anything: ";
cin >> nAny;
cout << "You type: ";
cout >> nAny;
return 0;
}
При попытке компиляции этих строк компилятор ругается такими словами
In function 'int main()' no match for 'operator>>' in 'std::cout>>nAny'
Re: Теория и практика masm32 под windows 7.
Добавлено: Пт июн 07, 2013 15:50:21
Мурик
Пишет какую ошибку?
Убрал оптимизацию размера. файл увеличился на пару кило и надеюсь теперь заработает.
Re: Теория и практика masm32 под windows 7.
Добавлено: Пт июн 07, 2013 15:52:19
АндрейАвербах
Все работает, а про С++ можете мне рассказать?
Re: Теория и практика masm32 под windows 7.
Добавлено: Пт июн 07, 2013 15:53:36
ChipKiller
Код: Выделить всё
Я тоже подумываю стоит ли, так как программа не хочет компилиться
..
wc - это структура описанная в windows.inc и ругается, потому что не находит описание...
... если не удается сделать простейшее, то не стоит - учите Delphi

Re: Теория и практика masm32 под windows 7.
Добавлено: Пт июн 07, 2013 15:54:00
Мурик
АндрейАвербах писал(а):При попытке компиляции этих строк компилятор ругается такими словами
In function 'int main()' no match for 'operator>>' in 'std::cout>>nAny'
Вы забыли добавить в кода строку.
АндрейАвербах писал(а):Все работает, а про С++ можете мне рассказать?
С ним не проще чем с асмом. Уж поверьте.
Re: Теория и практика masm32 под windows 7.
Добавлено: Пт июн 07, 2013 15:54:37
Engineer_Keen
Satyr писал(а):Разве ктото говорил про AVR ? -))
Ну блин,
Satyr, не знаешь контекста, а сразу на AVR наезжаешь

Re: Теория и практика masm32 под windows 7.
Добавлено: Пт июн 07, 2013 15:55:26
АндрейАвербах
А кудысь именно ее добавлять? Эту строку.
Re: Теория и практика masm32 под windows 7.
Добавлено: Пт июн 07, 2013 15:56:57
Мурик
АндрейАвербах писал(а):А кудысь именно ее добавлять?
Перед Main.