Студентам с вопросами о лабораторных работах сюда

Тема в разделе "WASM.BEGINNERS", создана пользователем IceStudent, 11 ноя 2006.

  1. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    да оформления типа
    .model flat... тоже не дописывал. смотрите на этом сайте у как это написать (но это не так уж сложно)
     
  2. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    inttostrW и strtointW это совсем элементарно, оставил как тему для размышлений (остальное вроде бы все это API), хотя если не сможете написать эти функции - пишите
     
  3. Max_Cohen

    Max_Cohen New Member

    Публикаций:
    0
    Регистрация:
    10 янв 2009
    Сообщения:
    19
    Адрес:
    Где-то здесь
    max7C4
    Спасибо. Я врядли это пойму ... Но постараюсь !
    А вы знаете, есть ли книги для таких как я (чайников) по Ассемблеру 32бит? Если да, то какие?

    Я искал , и еще не находил.
    Я читал книгу К. И. Финогенов "Использование языка Ассемблера" 2004 г. 16 бит я так ... знаю, вот 32 бит мне еще не поддается! И еще раз спасибо !
     
  4. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    Попробуйте Пирагов В. Программирование для Windows (masm+tasm+сравнительный анализ синтаксиса+WinAPI)
    В.И.Юров Ассемблер (masm+некоторые полезные алгоритмы и особенности работы команд, правда 16 бит(но если прочитаете первую, то поймете, что оно не особо то и отличается)+машинные инструкции+немного алгебры логики)
     
  5. Max_Cohen

    Max_Cohen New Member

    Публикаций:
    0
    Регистрация:
    10 янв 2009
    Сообщения:
    19
    Адрес:
    Где-то здесь
    Я точно чайник! Т_Т ! Не получается! Вроде так:
    Код (Text):
    1. .386
    2. .model  flat,   stdcall
    3.  
    4. extrn   LoadIconW:Proc
    5. extrn   CreateSolidBrush:Proc
    6. extrn   LoadCursorW:Proc
    7. extrn   GetModuleHandleW:Proc
    8. extrn   RegisterClassExW:Proc
    9. extrn   CreateWindowExW:Proc
    10. extrn   CreateWindowExW:Proc
    11. extrn   ShowWindow:Proc
    12. extrn   UpdateWindow:Proc
    13. extrn   TranslateMessage:Proc
    14. extrn   DispatchMessageW:Proc
    15. extrn   GetMessage:Proc
    16. extrn   ExitProcess:Proc
    17. extrn   GlobalAlloc:Proc
    18. extrn   strtointW:Proc
    19. extrn   GetWindowTextW:Proc
    20. extrn   GlobalFree:Proc
    21. extrn   DefWindowProcW:Proc
    22. extrn   inttostrW:Proc
    23. extrn   GlobalFree:Proc
    24. extrn   SetWindowTextW:Proc
    25. extrn   MakeEdit:Proc
    26. extrn   FindWindowExW:Proc
    27. extrn   GetWindowTextLengthW:Proc
    28. extrn   MakeButton:Proc
    29. extrn   FindWindowExW:Proc
    30. extrn   GetWindowTextW:Proc
    31. extrn   GlobalAlloc:Proc
    32. extrn   GetTextLengthW:Proc
    33. extrn   PostQuitMessage:Proc
    34. extrn   GetModuleHandleW:Proc
    35. extrn   FindWindowExW:Proc
    36. extrn   GetModuleHandleW:Proc
    37. extrn   ExitProcess:Proc
    38.  
    39. includelib tasm\import32.lib
    40. .data
    41.     ClassName   dw  'TForm', 0
    42.     Title       dw  'Form1', 0
    43.     EditClass   dw  'EDIT', 0
    44.     ButtonClass dw  'BUTTON', 0
    45.     ButtonTitle dw  'Summa', 0
    46. .code
    47. begin:
    48.  
    49. main proc
    50.     call LoadIconW, 0, 32512
    51.     mov ebx, eax
    52.     call CreateSolidBrush, 000808080h, 0, offset ClassName, eax
    53.     call LoadCursorW, 0, 32512, eax
    54.     call GetModuleHandleW, 0, ebx, eax
    55.     mov ebx, eax
    56.     call RegisterClassExW, esp, 48, 4003h, offset WndProc, 0, 0, eax
    57.     add esp, [esp]
    58.     call CreateWindowExW, 00010100h, offset ClassName, offset Title, 06CF0000h, 8000h, 8000h, 8000h,
    59.  
    60.     8000h, 0, 0, ebx, 0
    61.     mov ebx, eax
    62.     call ShowWindow, ebx, 5
    63.     call UpdateWindow, ebx
    64.     sub esp, 64
    65.     jmp @@begin_loop
    66. @@loop:
    67.     call TranslateMessage, esp
    68.     call DispatchMessageW, esp
    69. @@begin_start:
    70.     mov eax, esp
    71.     call GetMessage, eax, 0, 0, 0
    72.     inc eax
    73.     jz @@error
    74.     dec eax
    75.     jnz @@loop
    76.     mov eax, [esp+8]
    77.     add esp, 64
    78.     call ExitProcess, eax
    79. main endp
    80.  
    81. WndProc proc
    82.     mov eax, [esp+8]
    83.     cmp eax, 1
    84.     jz @@create
    85.     cmp eax, 111h
    86.     jz @@command
    87.     cmp eax, 2
    88.     jmp DefWindowProcW
    89. @@create:
    90.     push ebx
    91.     mov ebx, [esp+8]
    92.     call MakeEdit, 1, 100, 100, 100, 24
    93.     call MakeEdit, 2, 100, 132, 100, 24
    94.     call MakeEdit, 3, 100, 164, 100, 24
    95.     call MakeEdit, 4, 208, 100, 100, 24
    96.     call MakeEdit, 5, 208, 132, 100, 24
    97.     call MakeEdit, 6, 208, 164, 100, 24
    98.     call MakeEdit, 7, 316, 100, 100, 24
    99.     call MakeEdit, 8, 316, 132, 100, 24
    100.     call MakeEdit, 9, 316, 164, 100, 24
    101.     call MakeButton, 10, 8, 8, 92, 18, offset ButtonTitle
    102.     pop ebx
    103.     xor eax, eax
    104.     inc eax
    105.     ret 16
    106. @@command:
    107.     mov eax, [esp+12]
    108.     cmp ax, 10
    109.     jnz @@quit
    110.     shr eax, 16
    111.     test eax, eax
    112.     jnz @@quit
    113. ;Button1OnClick()
    114.     push ebx
    115.     push ebp
    116.     push esi
    117.     push edi
    118.     xor ebx, ebx
    119.     call Summ
    120.     call Summ
    121.     call Summ
    122.     pop edi
    123.     pop esi
    124.     pop ebp
    125.     pop ebx
    126.     jmp @@quit
    127. @@destroy:
    128.     call PostQuitMessage, 0
    129. @@quit:
    130.     xor eax, eax
    131.     ret 16
    132.     WndProc endp
    133.     MakeEdit proc
    134.     call GetModuleHandleW, 0
    135.     lea edx, [esp+8]
    136.     mov ecx, [esp+4]
    137.     call CreateWindowExW, 0, offset EditClass, 0, 40000000h or 10000000h, dword [edx+0], dword
    138.  
    139. [edx+4], dword [edx+8], dword [edx+12], ebx, ecx, eax, 0
    140.     ret 20
    141.     MakeEdit endp
    142.     MakeButton proc
    143.     call GetModuleHandleW, 0
    144.     lea edx, [esp+8]
    145.     mov ecx, [esp+4]
    146.     call CreateWindowExW, 0, offset ButtonClass, [edx+16], 40000000h or 10000000h, dword [edx+0],
    147.  
    148. dword [edx+4], dword [edx+8], dword [edx+12], ebx, ecx,     eax, 0
    149.     ret 24
    150.     MakeButton endp
    151.     Summ proc
    152.     call FindWindowExW, dword [esp+36], ebx, offset EditClass, 0
    153.     mov ebx, eax
    154.     call GetTextLengthW, ebx
    155.     lea [eax*2+2]
    156.     call GlobalAlloc, 0, eax, eax
    157.     mov esi, eax
    158.     call GetWindowTextW, ebx, eax
    159.     call FindWindowExW, dword [esp+36], ebx, offset EditClass, 0
    160.     mov ebx, eax
    161.     call GetWindowTextLengthW, ebx
    162.     lea [eax*2+2]
    163.     call GlobalAlloc, 0, eax, eax
    164.     mov edi, eax
    165.     call GetWindowTextW, ebx, eax
    166.     call strtointW, esi
    167.     mov ebp, eax
    168.     call GlobalFree, esi
    169.     call strtointW, edi
    170.     add eax, ebp
    171.     call GlobalFree, edi
    172.     push 0
    173.     sub esp, 12
    174.     call inttostrW, eax, 15, esp
    175.     call FindWindowExW, dword [esp+48], ebx, offset EditClass, 0
    176.     mov ebx, eax
    177.     call SetWindowTextW, ebx, esp
    178.     add esp, 16
    179.     ret
    180. Summ endp
    181.  
    182.     push    0
    183.     call    ExitProcess
    184. end begin
    После компиляции:
    [​IMG]
     
  6. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    замените Title на WindowTitle (Title - вроде бы зарезервированное слово, точно не помню)
    @@begin_start замение на @@begin_loop
    @@error: поставьте перед add esp, 64
    40000000h or 10000000h замените на 50000000h
    уберите extern MakeButton и extern MakeEdit
    lea eax, [eax*2+2] очепятался, извините
     
  7. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    убирайте также extern inttostrW и extern strtointW, я же сказал, что это домашнее задание, надо дописать самому (или откопать где-нибудь)
    странно также почему он не понял ButtonClass dw 'BUTTON',0 тогда попробуйте так
    ButtonClass dw 'B', 'U', 'T', 'T', 'O', 'N', 0
     
  8. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    вот. сказал же. давно не писал на тасме, всю голову сломал, что ему не нравилось в CreateWindowExW
    замените dword на dword ptr
     
  9. asgard88

    asgard88 New Member

    Публикаций:
    0
    Регистрация:
    21 сен 2009
    Сообщения:
    4
    Доброго всем!
    У меня проблема: Пишу на masm программу для работы с cisco router через com порт.
    Нашел библиотеку на c++ serialgate.dll которая реализует основные функции работы с ком-портом.
    Библиотеку подключаю с помощью LoadLibrary, соответственно сохраняю дескриптор, и пытаю вызвать процедуру GetProcAddress чтобы получить точку входа в процедуру OpenCom dll-ки.
    В итоге вижу кучу ошибок.
    Помогите может что не правильно делаю
    Код (Text):
    1. start:
    2. invoke  LoadLibrary, ADDR LibName  ;загружаю бибилиотеку
    3. mov     hLib,eax                  
    4. invoke  GetProcAddress, hLib, 8d ;знаю что порядковый номер экспорта = 8
    5. mov     ProcAddr,eax
     
  10. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    1) он точно 8 (уточните у DepencyWalker'а)
    2) может сначала надо что-то типа Init вызвать
    3) возможно у вас в системе нет жизненно необходимых dll'ок от сишника
     
  11. asgard88

    asgard88 New Member

    Публикаций:
    0
    Регистрация:
    21 сен 2009
    Сообщения:
    4
    порядок экспорта узнал из инфо о dll (листером тоталкомандера)
    Код (Text):
    1. Entry Pt    Ordn     Name
    2.     00001170h          1     public: __thiscall SerialGate::SerialGate(void)
    3.     00001180h          2     public: __thiscall SerialGate::~SerialGate(void)
    4.     00001000h          3     public: class SerialGate & __thiscall SerialGate::operator=(class SerialGate const &)
    5.     000011A0h          4     public: void __thiscall SerialGate::Clean(void)
    6.     00001190h          5     public: void __thiscall SerialGate::Close(void)
    7.     00001280h          6     public: bool __thiscall SerialGate::GetLine(enum SerialGate::IN_LINES_NAME)
    8.     00001300h          7     public: void __thiscall SerialGate::GetPortsInfo(struct PortInfo *)
    9.     000010B0h          8     public: bool __thiscall SerialGate::Open(int,int)
    10.     00001200h          9     public: int __thiscall SerialGate::Recv(char *,int)
    11.     000011C0h         10     public: int __thiscall SerialGate::Send(char *,int)
    12.     00001240h         11     public: void __thiscall SerialGate::SetLine(enum SerialGate::OUT_LINES_NAME,bool)
    Саму dll-ку я зарегистрировал, и просмотрел отладчиком дескриптор на нее выдается нормально
    Ну на счет сишника, то в сырцах библиотеки используется только стандартные винdll

    Может есть примеры реализации работы с ком портом. Я в интернете смотрел, там раотаю с портом как с файлом, но у меня возникают сложности при установки параметров линии и передачи байтов
     
  12. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    ройте в сторону GetCommState и подобные
     
  13. asgard88

    asgard88 New Member

    Публикаций:
    0
    Регистрация:
    21 сен 2009
    Сообщения:
    4
    Так GetCommState, позволяет только получить параметры порта, а мне нужно еще выставить таймеры.
    Я же говорил, что с настройками лини не выходит.
     
  14. Quatre_R_Winner

    Quatre_R_Winner Member

    Публикаций:
    0
    Регистрация:
    10 ноя 2008
    Сообщения:
    66
    Эх, что за народ пошёл. Как можно писать чтото под винду без справочника АПИ. Там и надо рыть рядом с GetCommState. Еслиб вы покопались, то нашли бы и SetCommState. Что вы собираетесь получить, если вам лень пальцем о палец ударить. Здесь людям помогают, а не делают всё за них. Если хотите чтоб всё делали за вас, то это в коммерс, но там это делают не за так.
     
  15. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    asgard88
    если мне не изменяет память, то ничего, что эта штука на классах и ей в ebp/ecx или еще где надо передавать указатель на экземпляр класса?
    т.е. я же вам говорил про инит. вызовите сначала конструктор (ordinal 1)
    а лучше покопайтесь в API. с классами из непонятного Си только дольше разбитаться
     
  16. Den

    Den New Member

    Публикаций:
    0
    Регистрация:
    22 сен 2009
    Сообщения:
    8
    Как сгенерировать звуковой сигнал спикера через каждые 5 секунд.Плз помогите с кодом))))
     
  17. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    так вам файл нужет или вывод на спикер
     
  18. asgard88

    asgard88 New Member

    Публикаций:
    0
    Регистрация:
    21 сен 2009
    Сообщения:
    4
    Есть примеры работы с com портом на асме, я уже кучу сайтов облазил и не могу найти более менее понятных?
    У меня проблема в том что я не могу узнать когда закончился прием данных из порта.
    Есть events но там только реакция на поступление 1-го байта в буфер.
    А мне нужно по окончанию приема данных, начать свою отправку.
    Нашел кусок кода с использованием процедуры WaitForSingleObject, перечитал мануалы по винапи, но все равно не могу понять как он работает.
    помогите разобрать, у меня уже на днях пересдача с комиссией.
    Вот код
    Код (Text):
    1. ;процедура приема данных
    2. ;вход:
    3. ;lpBuff  -  указатель на буфер
    4. ;dwSize  -  размер буфера
    5. ;выход:
    6. ;eax == число прочитанных байт
    7. proc     recv,lpBuff,dwSize
    8.         cmp [ComOK],1
    9.         jne .Err
    10.      invoke ClearCommError,[hCom],dwErrorFlags,ComStat
    11.         mov ecx,[dwSize]
    12.         mov eax,[ComStat.cbInQue]
    13.         cmp ecx,eax
    14.          jb .next
    15.         mov eax,ecx
    16. .next:     test eax,eax
    17.         jbe .end
    18.         mov [dwLength],eax
    19.      invoke ReadFile,[hCom],[lpBuff],[dwLength],dwLength,os
    20.        test eax,eax
    21.         jne .end
    22.      invoke WaitForSingleObject,[hCom],10000
    23.        test eax,eax
    24.         jne .Err
    25.      invoke GetOverlappedResult,[hCom],os,dwLength,1
    26.        test eax,eax
    27.         jne .end
    28. .Err:    invoke ClearCommError,[hCom],dwErrorFlags,ComStat
    29.         sub eax,eax
    30.      return
    31. .end:       mov eax,[dwLength]
    32.      return
    33. endp
     
  19. Quatre_R_Winner

    Quatre_R_Winner Member

    Публикаций:
    0
    Регистрация:
    10 ноя 2008
    Сообщения:
    66
    Вот тут описание на C++ для работы с ком-портом на WinApi.

    http://www.piclist.ru/S-COM-THREAD-RUS/S-COM-THREAD-RUS.html

    Это без проблем можно спроецировать на асм. В MSDN есть полное описание работы через WinApi на си.
    Вобщем яндекс и гугл попрежнему работают, просто на асме найти это наврятле удастся. Только если переписывать с других языков.
     
  20. Den

    Den New Member

    Публикаций:
    0
    Регистрация:
    22 сен 2009
    Сообщения:
    8
    написать программу на ассемблере при запуске которой спикер пк пикает через каждые 5 секунд