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

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

  1. Nirn

    Nirn New Member

    Публикаций:
    0
    Регистрация:
    9 окт 2010
    Сообщения:
    1
    Народ, помогите пожалуйста. Требуется написать программу для определения скорости работы команды. Собственно программу я написал, но не могу объяснить преподу почему получаются такие результаты. Например при тестировании команды mov esi,edi время выполнения получается равным 1 такту. В программе организован цикл, в котором записано несколько таких команд. Команда, по отношению к себе независима, значит за один такт должно выполняться несколько таких команд. А получается почему то не так.
     
  2. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    Nirn
    Заряди в поиске по форуму запрос постов leo - узнаешь много интересного про измерение быстродейсвия кода, нюансы параллельного выполнения команд и про то почему нельзя измерить время выполнения одной комады :)
     
  3. Kirow

    Kirow New Member

    Публикаций:
    0
    Регистрация:
    16 окт 2010
    Сообщения:
    24
    В общем товарищи такая ситуация.
    Необходимо написать оконное приложение которое по нажатию левой\правой мыши выдавало MessageBox с названием кнопки(левая\правая), а по отжиманию выдавала координаты в поле Edit внутри окна.
    В принципе все работает у меня если поменять порядок. Т.е. сначала зажимаю - получаю координаты,отжимаю - получаю месседж бокс. Но надо с точностью да наоборот.
    В общем надо как-то сделать чтобы по отжиманию кнопки закрывался сначала меседж бокс,а потом брались координаты.
    Вот собсно в закрытии меседж бокса и лежит проблема.Ктонить что-то подсказать может?
    Сделал для 1ой кнопки сначала координаты, а потом меседж бокс,а для второй наоборот.
    Скрин прилагается.
    P.S. Старался изложить проблему как можно яснее.
     
  4. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    Kirow
    Закрыть MessageBox из потока из которого он создавался программно нельзя. А для первой лабораторной вряд ли нужно создавать другие потоки. Скорее всего либо Вы не поняли задание, либо оно некорректно составлено.
     
  5. Kirow

    Kirow New Member

    Публикаций:
    0
    Регистрация:
    16 окт 2010
    Сообщения:
    24
    Лаба не первая, а первая в этом семестре.
    Цитирую само задание:
    Принимаю любые подсказки.Сначала меседж бокс,потом координаты.
    На всякий случай исходники прилагаются.
    includes.inc
    Код (Text):
    1. ; директивы компоновщику для подключения библиотек
    2. ;     include files
    3.       include user32.inc
    4.       include kernel32.inc
    5.       include C:\masm32\macros\macros.asm
    6. ;     libraries
    7.       includelib user32.lib
    8.       includelib kernel32.lib
    9. ; константы
    10. ; сообщение приходит при закрытии окна
    11. WM_DESTROY        equ 2
    12. ; сообщение приходит при создании окна
    13. WM_CREATE         equ 1
    14.  
    15. WM_LBUTTONDOWN    equ 201h
    16. WM_LBUTTONUP      equ 202h
    17. WM_RBUTTONDOWN    equ 204h
    18. WM_RBUTTONUP      equ 205h
    19.  
    20. WS_CHILD          equ 40000000h
    21. WS_VISIBLE        equ 10000000h
    22. WS_BORDER         equ 00800000h
    23.  
    24. WM_SETTEXT        equ 000Ch
    25.  
    26. ; свойства окна
    27. CS_VREDRAW        equ 1h
    28. CS_HREDRAW        equ 2h
    29. CS_GLOBALCLASS    equ 4000h
    30. style equ CS_HREDRAW+CS_VREDRAW+CS_GLOBALCLASS
    31. ;-------------------------------------------
    32. WS_OVERLAPPEDWINDOW    equ 000CF0000H
    33. ; идентификатор стандартной иконки
    34. IDI_APPLICATION   equ 32512
    35. ; идентификатор курсора
    36. IDC_CROSS         equ 32515
    37. ; режим показа окна - нормальный
    38. SW_SHOWNORMAL     equ 1
    Main.asm
    Код (Text):
    1. .686
    2. .MODEL FLAT, stdcall
    3. include include.inc
    4.  
    5. ;--------------------------------------------------
    6. ; структуры
    7. ; структура сообщения
    8. MSGSTRUCT STRUC
    9.      MSHWND        DD   ? ; идентификатор окна,
    10.                           ; получающего сообщение
    11.      MSMESSAGE     DD   ? ; идентификатор сообщения
    12.      MSWPARAM      DD   ? ; доп. информация о сообщении
    13.      MSLPARAM      DD   ? ; доп. информация о сообщении
    14.      MSTIME        DD   ? ; время посылки сообщения
    15.      MSPT          DD   ? ; положение курсора, во время посылки
    16.                           ; сообщения
    17. MSGSTRUCT ENDS
    18. ;---------
    19. WNDCLASS STRUC
    20.      CLSSTYLE      DD   ? ; стиль окна
    21.      CLWNDPROC     DD   ? ; указатель на процедуру окна
    22.      CLSCSEXTRA    DD   ? ; информация о доп. байтах для
    23.                           ; данной структуры
    24.      CLWNDEXTRA    DD   ? ; информация о доп. байтах для окна
    25.      CLSHINSTANCE  DD   ? ; дескриптор приложения
    26.      CLSHICON      DD   ? ; идентификатор иконы окна
    27.      CLSHCURSOR    DD   ? ; идентификатор курсора окна
    28.      CLBKGROUND    DD   ? ; идентификатор кисти окна
    29.      CLMENUNAME    DD   ? ; имя-идентификатор меню
    30.      CLNAME        DD   ? ; специфицирует имя класса окон
    31. WNDCLASS ENDS
    32.  
    33. ; сегмент данных
    34. .data
    35.      NEWHWND   DD 0
    36.      MSG       MSGSTRUCT <?>
    37.      WC        WNDCLASS  <?>
    38.      HINST     DD 0 ; здесь хранится дескриптор приложения
    39.      TITLENAME DB 'Лабораторная работа #1',0
    40.      CLASSNAME DB 'MainWindow',0
    41.      CLASSNME2 DB 'Edit',0
    42.      CAP       DB 'Сообщение',0
    43.      MES1      DB 'Вы нажали левую кнопку мыши',0
    44.      MES3      DB 'Вы нажали правую кнопку мыши',0
    45.      MES2      DB 'Выход из программы. Пока!',0
    46.      x         DD ?
    47.      y         DD ?
    48.      Coords    DB 'X:%u Y:%u',0
    49.      STRCOPY   DB 20 DUP(0)
    50.      hEdit     DD ?
    51. ; сегмент кода
    52. .code
    53. START:
    54. ; получить дескриптор приложения
    55.      invoke GetModuleHandle,0
    56.      MOV      [HINST], EAX
    57. REG_CLASS:
    58. ; заполнить структуру окна стиль
    59.      MOV [WC.CLSSTYLE], style
    60. ; процедура обработки сообщений
    61.      MOV [WC.CLWNDPROC], OFFSET WNDPROC
    62.      MOV [WC.CLSCSEXTRA], 0
    63.      MOV [WC.CLWNDEXTRA], 0
    64.      MOV EAX, [HINST]
    65.      MOV [WC.CLSHINSTANCE], EAX
    66. ;--------- иконка окна
    67.      invoke LoadIcon,0,IDI_APPLICATION
    68.      MOV  [WC.CLSHICON], EAX
    69. ;---------- курсор окна
    70.      invoke LoadCursor,0,IDC_CROSS
    71.      MOV  [WC.CLSHCURSOR], EAX
    72. ;---------
    73.      MOV  [WC.CLBKGROUND], 17 ; цвет окна
    74.      MOV DWORD PTR [WC.CLMENUNAME], 0
    75.      MOV DWORD PTR [WC.CLNAME], OFFSET CLASSNAME
    76.      invoke RegisterClass,OFFSET WC
    77. ; создать окно зарегистрированного класса
    78.      invoke CreateWindowEx,0,OFFSET CLASSNAME,OFFSET TITLENAME,WS_OVERLAPPEDWINDOW,100,100,400,400,0,0,[HINST],0
    79. ; проверка на ошибку
    80.      CMP EAX, 0
    81.      JZ  _ERR
    82.      MOV [NEWHWND], EAX ; дескриптор окна
    83. ;создать текстовое поле
    84.    
    85.  
    86. ; --------------------------------------------------
    87.      invoke ShowWindow,[NEWHWND],SW_SHOWNORMAL
    88. ; --------------------------------------------------
    89.      PUSH [NEWHWND]
    90.      invoke UpdateWindow,[NEWHWND]
    91. MSG_LOOP:
    92.      invoke GetMessage,OFFSET MSG,0,0,0
    93.      CMP EAX, 0
    94.      JE  END_LOOP
    95.      invoke TranslateMessage,OFFSET MSG
    96.      invoke DispatchMessage,OFFSET MSG
    97.      JMP MSG_LOOP
    98. END_LOOP:
    99. ; выход из программы (закрыть процесс)
    100.      invoke ExitProcess,OFFSET MSG.MSWPARAM
    101. _ERR:
    102.      JMP END_LOOP
    103. ; --------------------------------------------------
    104. ; процедура окна
    105. ; расположение параметров в стеке
    106. ; [EBP+20] LPARAM
    107. ; [EBP+16] WAPARAM
    108. ; [EBP+12] MES
    109. ; [EBP+8] HWND
    110. WNDPROC  PROC
    111.      PUSH EBP
    112.      MOV EBP, ESP
    113.      PUSH EBX
    114.      PUSH ESI
    115.      PUSH EDI
    116.      CMP DWORD PTR [EBP+12], WM_DESTROY
    117.      JE  WMDESTROY
    118.      CMP DWORD PTR [EBP+12], WM_CREATE
    119.      JE  WMCREATE
    120.      CMP DWORD PTR [EBP+12] ,WM_LBUTTONDOWN   ;левая кнопка зажата
    121.      JE  LBUTTONDOWN
    122.      CMP DWORD PTR [EBP+12] ,WM_RBUTTONDOWN   ;правая кнопка зажата
    123.      JE  RBUTTONDOWN
    124.      CMP DWORD PTR [EBP+12] ,WM_LBUTTONUP   ;левая кнопка отжата
    125.      JE  LBUTTONUP
    126.      CMP DWORD PTR [EBP+12] ,WM_RBUTTONUP   ;правая кнопка отжата
    127.      JE  RBUTTONUP
    128.      JMP DEFWNDPROC
    129. RBUTTONDOWN:
    130.      invoke MessageBox,DWORD PTR [EBP+8],OFFSET MES3,OFFSET CAP,0
    131.      MOV EAX, 0
    132.      JMP FINISH
    133. LBUTTONUP:
    134.      invoke MessageBox,DWORD PTR [EBP+8],OFFSET MES1,OFFSET CAP,0
    135.      MOV EAX, 0
    136.      JMP FINISH
    137. RBUTTONUP:
    138.      JMP LBUTTONDOWN
    139. LBUTTONDOWN:
    140.      MOV EAX,DWORD PTR [EBP+20]
    141.      AND EAX,00FFh
    142.      MOV x,EAX
    143.      MOV EAX,DWORD PTR [EBP+20]
    144.      SHR EAX,16
    145.      MOV y,EAX
    146.      invoke wsprintf,OFFSET STRCOPY,OFFSET Coords,x,y
    147.      invoke SendMessage,hEdit,WM_SETTEXT,20,OFFSET STRCOPY
    148.      mov STRCOPY,0
    149.      MOV EAX, 0
    150.      JMP FINISH
    151. WMCREATE:
    152.      invoke CreateWindowEx,0,SADD('EDIT'),0,WS_CHILD or WS_VISIBLE or WS_BORDER,100,70,100,20,[EBP+8],105,[HINST],0
    153.      MOV hEdit,EAX
    154.      MOV EAX, 0
    155.      JMP FINISH
    156. DEFWNDPROC:
    157.      invoke DefWindowProc,DWORD PTR[EBP+8],DWORD PTR [EBP+12],DWORD PTR [EBP+16],DWORD PTR [EBP+20]
    158.      JMP FINISH
    159. WMDESTROY:
    160.      invoke MessageBox,DWORD PTR [EBP+8],OFFSET MES2,OFFSET CAP,0
    161.      invoke PostQuitMessage,0
    162.      MOV EAX, 0
    163. FINISH:
    164.      POP EDI
    165.      POP ESI
    166.      POP EBX
    167.      POP EBP
    168.      RET 16
    169. WNDPROC ENDP
    170. END START
    P.S. Нашел в принципе обходной вариант.Зажал кнопку - вылез меседж бокс,нажал энтер - меседжбокс закрылся,отпустил кнопку мыши - получил координаты.Но это как-то неадекватно мне кажется. Так что жду подсказок.
     
  6. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    Kirow
    Есть вариант создавать MessageBox без окна-владельца, т.е. первый параметр передавать как NULL.
     
  7. Kirow

    Kirow New Member

    Публикаций:
    0
    Регистрация:
    16 окт 2010
    Сообщения:
    24
    KeSqueer
    Спасибо,ваш совет работает.Очень доволен.Печально что сам не додумался, к сожалению опыта нет.
    Также хочу попробовать другой вариант.Создавать не MessageBox, а окно в котором на бекраунде будет писаться текст сообщения,если не ошибаюсь элемент зовется label.
    Вот к примеру создаю поле Edit,но его можно редактировать.
    Код (Text):
    1. invoke CreateWindowEx,0,SADD('EDIT'),0,WS_CHILD or
    2. WS_VISIBLE or WS_BORDER,100,70,100,20,[EBP+8],105,[HINST],0
    Хочу тоже самое, но без возможности изменения текста, и если я правильно понял то нужен label
    Подскажите пожалуйста как его создать.Как вариант можно линку на создание вообще всех оконных элементов, с удовольствием почитаю.
     
  8. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    Класс такого элемента носит название "static"
    На счёт ссылок, их можно привести очень много, однако все они сводятся к MSDN Library. Там же можно найти кучу примеров на языке C. Если не знаете его, придётся учить, на ассемблере далеко не уедешь.
     
  9. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    Вот, к примеру, что даёт поиск по static controls.
     
  10. M0rg0t

    M0rg0t Well-Known Member

    Публикаций:
    0
    Регистрация:
    18 окт 2010
    Сообщения:
    1.576
    Подскажите пожалуйста, в чем может быть проблема - не работает этот пример http://wasm.ru/src/5/http_flooder.asm

    Компилировал FASM'ом, менял include '%fasminc%\APIA\ на свой путь к этой директории (т.к фасм выдавал ошибку пути), в рез-те все равно не работает. Выдает такую ошибку:
    [​IMG]
     
  11. FatMoon

    FatMoon New Member

    Публикаций:
    0
    Регистрация:
    28 ноя 2002
    Сообщения:
    954
    Адрес:
    Russia
    Боюсь, в фасме нет настроенных инклудов для shlwapi.dll.
    Либо используйте advapi32.dll и RegXXX функции. Либо... импорт необходимой функции необходимо настроить самому. То есть создать секцию импорта, указать библиотеку и имя импортируемой функции. Как это оформить - читаем (конечно же) справку к фасму.
     
  12. M0rg0t

    M0rg0t Well-Known Member

    Публикаций:
    0
    Регистрация:
    18 окт 2010
    Сообщения:
    1.576
    Спасибо за ответ, попробую так.
    А вообще - для чего изначально был этот пример? Все таки для FASM или для другого компилятора? Просто интересно.
     
  13. Kirow

    Kirow New Member

    Публикаций:
    0
    Регистрация:
    16 окт 2010
    Сообщения:
    24
    Нужна подсказка.Использую masm.
    Что нужно подключить, чтобы не надо было прописывать константы для WinAPI
    типа
    Код (Text):
    1. WM_DESTROY        equ 2
    2. WM_CREATE         equ 1
    3. WM_LBUTTONDOWN    equ 201h
    4. WM_LBUTTONUP      equ 202h
    5. WM_RBUTTONDOWN    equ 204h
    6. WM_RBUTTONUP      equ 205h
    7. WS_CHILD          equ 40000000h
    8. WS_VISIBLE        equ 10000000h
    9. WS_BORDER         equ 00800000h
    10. WM_SETTEXT        equ 000Ch
    а то не всегда удается найти значение на MSDN'e
     
  14. GL

    GL New Member

    Публикаций:
    0
    Регистрация:
    6 июл 2010
    Сообщения:
    5
    include\windows.inc
     
  15. Kirow

    Kirow New Member

    Публикаций:
    0
    Регистрация:
    16 окт 2010
    Сообщения:
    24
    какже это было очевидно если подумать...
    Спасибо за оперативность
     
  16. xolinks

    xolinks New Member

    Публикаций:
    0
    Регистрация:
    23 окт 2010
    Сообщения:
    9
    Помогите пожалуйста решить задачку на masm32

    3. Задать одномерный массив, состоящий из 10 элементов. Заполнить массив константами. Переместить в другую область памяти элементы с четными номерами
    а) элементы массива – однобайтовые;
    б) элементы массива – двухбайтовые;

    для прямой адресации я сам смог сделать а косвенную никак не могу понять...Как сказал преподователь надо просто написать MOV BX, OFFSET SOURCE и MOV DI, OFFSET DEST,
     
  17. t00x

    t00x New Member

    Публикаций:
    0
    Регистрация:
    15 фев 2007
    Сообщения:
    1.921
    xolinks
    прямая адресация -
    Код (Text):
    1. mov offset massiv, ax
    косвенная регистровая адресация -
    Код (Text):
    1. mov bx, offset massiv
    2. mov [bx], ax
     
  18. xolinks

    xolinks New Member

    Публикаций:
    0
    Регистрация:
    23 окт 2010
    Сообщения:
    9
    для прямой у меня вот так

    .586
    .model flat, stdcall
    _data segment
    SOURCE Db 0,1,2,3,4,5,6,7,8,9
    DEST Db 5 DUP(?)
    _code segment
    _start:

    MOV DEST,0
    MOV DEST+1,0
    MOV DEST+2,0
    MOV DEST+3,0
    MOV DEST+4,0

    MOV AL, SOURCE
    MOV DEST,AL
    MOV AL, SOURCE+2
    MOV DEST+1,AL
    MOV AL, SOURCE+4
    MOV DEST+2,AL
    MOV AL, SOURCE+6
    MOV DEST+3,AL
    MOV AL, SOURCE+8
    MOV DEST+4,AL

    ret
    _code ends
    end _start

    а для косвеной мне выдает ошибку в строчке mov bx, offset SOURCE пишет instruction operands must be the same size
     
  19. t00x

    t00x New Member

    Публикаций:
    0
    Регистрация:
    15 фев 2007
    Сообщения:
    1.921
    mov bx, massiv?
     
  20. xolinks

    xolinks New Member

    Публикаций:
    0
    Регистрация:
    23 окт 2010
    Сообщения:
    9
    если так писать то это прямая адрессация просто с использованием регистра у которого есть возможность базовой косвеной адресации)