Теория и практика masm32 под windows 7.

Подключаем наши девайсы к компьютеру. Обсуждаются: порты, протоколы, драйвера, языки программирования и т.д.
Ответить
Потрогал лапой паяльник
Сообщения: 345
Зарегистрирован: Пт авг 24, 2012 09:45:40
Откуда: Абакан, Хакасия

Сообщение АндрейАвербах »

Всем доброго времени суток, пытаюсь познать программирование на ассемблере в masm32 программировать под DOS пробовал тоже, обучался по "Дневникам чайника", но они закончились и встал вопрос выбора дальнейшей литературы для изучения сего вопроса. Долгосрочная перспектива есть: мы с другом хотим создать игрушку типа Танчиков. Только не надо мне говорить, что так не бывает, захотел и создал, сам знаю, не бывает. Но учиться готов. Самое большое, что могу написать на масме32 после изучения "Дневников чайника", программку, которая выводит на экран сообщение в окне типа MB_OK. Посоветуйте, что читать дальше, желательно, чтоб было актуально для windows7.
Самый большой геммор с API функциями.
ЗЫ. На другой язык переходить крайне не охота, хочется написать именно на асме.
ЗЫ2. Если попал не в тот раздел/сайт, то в описании раздела есть строчка "языки программирования".
Реклама
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1163
Зарегистрирован: Ср янв 05, 2011 16:25:15

Сообщение ChipKiller »

Реклама
Мучитель микросхем
Сообщения: 447
Зарегистрирован: Ср сен 26, 2012 14:12:47
Откуда: Київ

Сообщение Cheba »

А лучше всё же перейти на другой язык и не мучаться. Если речь идёт исключительно о Windows, то С# - на мой вкус прекрасный выбор.
Друг Кота
Аватара пользователя
Сообщения: 3385
Зарегистрирован: Пн окт 11, 2010 19:00:08

Сообщение Мурик »

Многие языки высокого уровня поддерживают ассемблерные вставки, а некоторые (например, PureBasic) позволяют кодить на ассемблере (FASM) вперемешку в кодом ЯВУ.
Только непонятно желание разрабатывать на асме. Это ведь требует больше сил и времени чем разработка на ЯВУ, а преимущества практически нет.
Реклама
Эиком - электронные компоненты и радиодетали
Потрогал лапой паяльник
Сообщения: 345
Зарегистрирован: Пт авг 24, 2012 09:45:40
Откуда: Абакан, Хакасия

Сообщение АндрейАвербах »

Я тоже подумываю стоит ли, так как программа не хочет компилиться, короче, набираю в масм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++ пойдет, они как я понимаю, родственники. И где найти учебник по этому языку?
Реклама
Встал на лапы
Аватара пользователя
Сообщения: 132
Зарегистрирован: Вс сен 23, 2012 05:51:35

Сообщение black_lizard »

Так и не понял смысла в АСМЕ. С++ и 2д двигло HGE - позволяют творить чудеса. Я когда-то пытался на асме хотя бы виндовское окно открыть, с кучей параметров и структур. Тот ещё гемор.
Если цель - просто написать игру, то смысла в ассемблере нет.
Если вы думаете, что ассемблер способен дать вам больше скорости, чем ЯВУ, то вынужден вас огорчить - оптимизаторы под X86 платформу оптимизируют код значительно лучше, чем большинство программистов, которые пишут на асме, так как используют команды процессора, которых не было на том же 286, на котором пахал ДОС, их нужно отдельно изучать и литература по этому поводу мне не встречалась. Даже шейдеры пишут в основном на Си.
Собираю самопальный мини-компьютер
Реклама
Потрогал лапой паяльник
Сообщения: 345
Зарегистрирован: Пт авг 24, 2012 09:45:40
Откуда: Абакан, Хакасия

Сообщение АндрейАвербах »

2д двигло HGE
Это что?
Встал на лапы
Аватара пользователя
Сообщения: 132
Зарегистрирован: Вс сен 23, 2012 05:51:35

Сообщение black_lizard »

АндрейАвербах писал(а):
2д двигло HGE
Это что?
Библиотека. Подключается к программе. Там есть набор функций, загрузить изображение, нарисовать изображение, вывести на экран. И программируется куда проще, чем winapi. К тому же быстрее, потому что использует видеоускоритель. Теоретически, его можно и к ассемблеру подцепить, но нужно писать врапер.
Собираю самопальный мини-компьютер
Друг Кота
Аватара пользователя
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Сообщение Engineer_Keen »

АндрейАвербах писал(а):я боюсь, что если стану программровать на другом языке, то забуду МК-асм.
Зря боитесь. Одно другому не мешает, тем более что сам ассемблер у AVR и x86 прилично различается. Писать на ассемблере под windows имеет наверно смысл только в общеобразовательных целях, да и то если делать нечего, ну или если действительно нужно сделать что-то мегаоптимизированное. Я раньше немного баловался ассемблерными вставками в delphi, когда например надо было работать с ком-портом, но чем новее винда, тем меньше она разрешает делать и приходится использовать ее стандартные библиотеки (а с семеркой я даже и не пробовал). Вы же не забываете ассемблер, когда разговариваете по русски? :)))
Друг Кота
Аватара пользователя
Сообщения: 7439
Зарегистрирован: Чт ноя 04, 2010 01:56:36
Откуда: г. Москва

Сообщение Satyr »

Engineer_Keen писал(а): Зря боитесь. Одно другому не мешает, тем более что сам ассемблер у AVR и x86 прилично различается.
Разве ктото говорил про AVR ? -))
Да и ассемблер, в смысле мнемонических названий комманд, подо все более менее придерживаются одинаковых.
А система комманд да, другая :)))
Потрогал лапой паяльник
Сообщения: 345
Зарегистрирован: Пт авг 24, 2012 09:45:40
Откуда: Абакан, Хакасия

Сообщение АндрейАвербах »

Нет, не забываю :)
Начал обучаться программированию в 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 ?
Подразумевал :)
Друг Кота
Аватара пользователя
Сообщения: 3385
Зарегистрирован: Пн окт 11, 2010 19:00:08

Сообщение Мурик »

АндрейАвербах писал(а):набираю в масм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.
Вложения
Window.zip
(5.42 КБ) 188 скачиваний
Потрогал лапой паяльник
Сообщения: 345
Зарегистрирован: Пт авг 24, 2012 09:45:40
Откуда: Абакан, Хакасия

Сообщение АндрейАвербах »

Скачал ваш файл, пишет ошибку.
Я хочу написать программу, которая будет получать цифру с клавы и выводить на монитор
вот код

Код: Выделить всё

#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'
Друг Кота
Аватара пользователя
Сообщения: 3385
Зарегистрирован: Пн окт 11, 2010 19:00:08

Сообщение Мурик »

Пишет какую ошибку?

Убрал оптимизацию размера. файл увеличился на пару кило и надеюсь теперь заработает.
Вложения
Window.zip
(5.48 КБ) 222 скачивания
Потрогал лапой паяльник
Сообщения: 345
Зарегистрирован: Пт авг 24, 2012 09:45:40
Откуда: Абакан, Хакасия

Сообщение АндрейАвербах »

Все работает, а про С++ можете мне рассказать?
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1163
Зарегистрирован: Ср янв 05, 2011 16:25:15

Сообщение ChipKiller »

Код: Выделить всё

Я тоже подумываю стоит ли, так как программа не хочет компилиться
.. wc - это структура описанная в windows.inc и ругается, потому что не находит описание...
... если не удается сделать простейшее, то не стоит - учите Delphi :)
Друг Кота
Аватара пользователя
Сообщения: 3385
Зарегистрирован: Пн окт 11, 2010 19:00:08

Сообщение Мурик »

АндрейАвербах писал(а):При попытке компиляции этих строк компилятор ругается такими словами
In function 'int main()' no match for 'operator>>' in 'std::cout>>nAny'
Вы забыли добавить в кода строку.

Код: Выделить всё

using namespace std;
АндрейАвербах писал(а):Все работает, а про С++ можете мне рассказать?
С ним не проще чем с асмом. Уж поверьте.
Последний раз редактировалось Мурик Пт июн 07, 2013 15:55:55, всего редактировалось 4 раза.
Друг Кота
Аватара пользователя
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Сообщение Engineer_Keen »

Satyr писал(а):Разве ктото говорил про AVR ? -))
Ну блин, Satyr, не знаешь контекста, а сразу на AVR наезжаешь :facepalm: :)))
Потрогал лапой паяльник
Сообщения: 345
Зарегистрирован: Пт авг 24, 2012 09:45:40
Откуда: Абакан, Хакасия

Сообщение АндрейАвербах »

А кудысь именно ее добавлять? Эту строку.
Последний раз редактировалось АндрейАвербах Пт июн 07, 2013 15:57:04, всего редактировалось 1 раз.
Друг Кота
Аватара пользователя
Сообщения: 3385
Зарегистрирован: Пн окт 11, 2010 19:00:08

Сообщение Мурик »

АндрейАвербах писал(а):А кудысь именно ее добавлять?
Перед Main.
Ответить

Вернуться в «Интеграция с ПК»