Страница 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
АндрейАвербах
2д двигло HGE
Это что?

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'
Вы забыли добавить в кода строку.

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

using namespace std;
АндрейАвербах писал(а):Все работает, а про С++ можете мне рассказать?
С ним не проще чем с асмом. Уж поверьте.

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

Добавлено: Пт июн 07, 2013 15:54:37
Engineer_Keen
Satyr писал(а):Разве ктото говорил про AVR ? -))
Ну блин, Satyr, не знаешь контекста, а сразу на AVR наезжаешь :facepalm: :)))

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

Добавлено: Пт июн 07, 2013 15:55:26
АндрейАвербах
А кудысь именно ее добавлять? Эту строку.

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

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