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

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

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

Сделал так, ничего не изменилось.

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

using namespace std;
int main()
Как сделать так, чтоб работало?
Реклама
Друг Кота
Аватара пользователя
Сообщения: 3385
Зарегистрирован: Пн окт 11, 2010 19:00:08

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

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

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

#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'
Исправил ошибки.

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

#include <stdio.h>
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
    int nAny;
    cout << "Input anything: ";
    cin >> nAny;
    cout << "You type: ";
    cout << nAny << "\n";
    system("PAUSE");
    return 0;
}
Реклама
Потрогал лапой паяльник
Сообщения: 345
Зарегистрирован: Пт авг 24, 2012 09:45:40
Откуда: Абакан, Хакасия

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

using namespace std;
int main(int argc, char *argv[])
Эти строки можно использовать как типовые? Или они от чего-то зависят?
Друг Кота
Аватара пользователя
Сообщения: 3385
Зарегистрирован: Пн окт 11, 2010 19:00:08

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

АндрейАвербах писал(а):
using namespace std;
int main(int argc, char *argv[])
Эти строки можно использовать как типовые? Или они от чего-то зависят?
Нет. Зависит от типа проекта и кода.
Скажем, в окошках, строка using namespace std; не нужна, а int main(int argc, char *argv[]) будет иметь вид.

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

int WINAPI WinMain (HINSTANCE hThisInstance,
                    HINSTANCE hPrevInstance,
                    LPSTR lpszArgument,
                    int nFunsterStil)
Но это еще зависит от компилятора.
Скачайте толстенную книжку по C++ и изучайте ее, но это надолго (пару лет точно), т. к. C++ один из сложнейших, не эзотерических ЯП.
Реклама
Эиком - электронные компоненты и радиодетали
Электрический кот
Аватара пользователя
Сообщения: 1077
Зарегистрирован: Пн ноя 21, 2011 16:45:00

Сообщение kotpalych »

У меня ваш пример на MASM скомпилировался после небольшой правки.

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

.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
Вложения
2qqwq.zip
(927 байт) 142 скачивания
Невозможно починить то, что не сломалось.
Реклама
Друг Кота
Аватара пользователя
Сообщения: 3385
Зарегистрирован: Пн окт 11, 2010 19:00:08

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

Асм конечно рулит, только на ЯВУ удалось не используя оптимизацию и другие уловки, создать меньший по размеру исполняемый файл. :))) :)))
Вот так-то!
Вложения
WinAPI.zip
(859 байт) 145 скачиваний
Реклама
Потрогал лапой паяльник
Сообщения: 345
Зарегистрирован: Пт авг 24, 2012 09:45:40
Откуда: Абакан, Хакасия

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

но это надолго (пару лет точно), т. к. C++ один из сложнейших
Пару лет?.. Но это еще смотря сколько в день заниматься программированием, я например занимаюсь около 8-ми часов. Ну, он же не такой сложный как асм?
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1163
Зарегистрирован: Ср янв 05, 2011 16:25:15

Сообщение ChipKiller »

Мурик писал(а):...только на ЯВУ удалось не используя оптимизацию и другие уловки, создать меньший по размеру исполняемый файл.
... целых 2 кило - это жирно :)
Вложения
console.rar
(444 байт) 144 скачивания
winapi.rar
(719 байт) 137 скачиваний
Друг Кота
Аватара пользователя
Сообщения: 3385
Зарегистрирован: Пн окт 11, 2010 19:00:08

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

Согласен, жирно.
Поэтому приложение "сбросило лишние килограммы" и его "вес" стал таким же как и у вашего. :)) :beer:
АндрейАвербах писал(а):Пару лет?.. Но это еще смотря сколько в день заниматься программированием, я например занимаюсь около 8-ми часов. Ну, он же не такой сложный как асм?
Ну вот, занимаясь по 8 часов в день, семь дней в неделю, 365 дней в году, за пару лет и освоите C++.
Плюсы во много раз сложнее асма. А асм по сути не сложный. Просто на нем, сложно программировать - многа букаф и легче чем в ЯВУ допустить ошибку.
Вложения
WinAPI_2.zip
(837 байт) 160 скачиваний
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1163
Зарегистрирован: Ср янв 05, 2011 16:25:15

Сообщение ChipKiller »

Мурик писал(а):... приложение "сбросило лишние килограммы" и его "вес" стал таким же как и у вашего
... "обезжиривание" можно продолжить, т.к. на размер EXE-шника больше влияет не размер кода, а "PE-прибамбасы" :)
Мурик писал(а):асм по сути не сложный
.. ассемблер самый простой язык, но это не означает, что создавать полноценные программы на нем проще всего и выражение "за деревьями леса не видно", очень точно описывает ситуацию.

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

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

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

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

Ну вот, занимаясь по 8 часов в день, семь дней в неделю, 365 дней в году, за пару лет и освоите C++.
Плюсы во много раз сложнее асма
??Я осваивая С++ один вечер и один день уже функции умею делать и вызывать, сейчас с массивами разбираюсь, вот калькулятор сделал. Протестите. Хотя там есть один баг.
Вложения
calc.rar
(121.57 КБ) 157 скачиваний
Друг Кота
Аватара пользователя
Сообщения: 3385
Зарегистрирован: Пн окт 11, 2010 19:00:08

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

АндрейАвербах писал(а):Я осваивая С++ один вечер и один день уже функции умею делать и вызывать, сейчас с массивами разбираюсь
Это все цветочки.
Знаете что такое полиморфизм, множественное наследование, виртуальные члены класса и многое другое?
Умете работать указателями?
И попробуйте сделать калькулятор в виде формы (окна), а не консоли.
Потрогал лапой паяльник
Сообщения: 345
Зарегистрирован: Пт авг 24, 2012 09:45:40
Откуда: Абакан, Хакасия

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

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

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

Начал я изучать указатели в С++, в книге дана следующая функция
// ВЫВОД в шестнадцатеричном виде
cout.setf (ios: :hex) ;
Но книга сканированная и возможно, там есть очепятки, компилятор ругается на эту функцию. Что написать чтоб работало?
И калькулятор усовершенствовал.
Вложения
calc.rar
(121.68 КБ) 135 скачиваний
Друг Кота
Аватара пользователя
Сообщения: 3385
Зарегистрирован: Пн окт 11, 2010 19:00:08

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

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

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

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

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

Учусь собирать программу из нескольких файлов. Вот код главного файла

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

#include <cstdlib>
#include <iostream.h>
#include <stdio.h>
#include <string.h>
using namespace std;

char output(ostream& out, istream& in,char Array[]);
int main(int argc, char *argv[])
{
    char Text[1000];
    cout << "Input your line here: ";
     cin.getline(Text,1000);
    output(cout, cin, Text);
    system("PAUSE");
    return EXIT_SUCCESS;
}
Вот код файла output.cpp

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

#include <stdio.h>
#include <iostream.h>

char output(ostream& out, istream& in,char Array[])
{
     char*Addres =&Array[0];
     int counter = 0;
     char value;
     for ( char a = 'a'; a != '\0'; counter++)
     {
          *(Addres + counter) = Array[counter];
     }
     counter = counter - 1;
     for (int c=0; c < counter; c++)
     {
         value = *(Addres + c);
         cout << value;
     }
     cout << "\n";
}
Проблема в следующем: все компилируется(использую Dev-C++), создается ехе файл. Запускаю этот самый ехе файл Он мне пишет тра-ля-ля, я ввожу слово жму ентер и... все зависает. Потом пишет прекращена работа программы такой-то. Что делаю не так?
Первый раз сказал Мяу!
Сообщения: 30
Зарегистрирован: Пт июл 27, 2012 22:51:52

Сообщение ldir »

for ( char a = 'a'; a != '\0'; counter++)
{
*(Addres + counter) = Array[counter];
}

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

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

Ладно, ту программу я выкинул, новую сделал. Добрался(наконец!) до объектно ориентированного программирования. Сочинил такую программу.

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

#include <stdio.h>
#include <iostream.h>
#include <iostream>
class TANK
    {
          public:
                 char Tanks[64];
                 int number;
    }
    TANK, tank[10]; 
int main(int argc, char*[])
{
    
    cin >> tank[0].Tanks;
    cin >> tank[0].number;
    cout << tank[0].Tanks << "\n";
    cout << tank[0].number << "\n";
    system ("PAUSE");
    return EXIT_SUCCESS;
}

Меня интересует не накосячил ли я в строчке TANK, tank[10]; с запятой, а то в книге был дан пробел. А без запятой программа отказывалась работать, а так работает, все норм.
Ответить

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