рефераты конспекты курсовые дипломные лекции шпоры

Реферат Курсовая Конспект

МЕТОДИЧЕСКИЕ УКАЗАНИЯ

МЕТОДИЧЕСКИЕ УКАЗАНИЯ - раздел Компьютеры, Практическая работа №1-3 Представление информации в ЭВМ. Кодирование и подсчет количества информации. Приобретение навыков представления двоичной информации в ЭВМ Fasm (Flat Assembler). Этот Компилятор Достаточно Прост В Установке И Использ...

FASM (Flat Assembler). Этот компилятор достаточно прост в установке и использовании, отличается компактностью и быстротой работы, имеет богатый и емкий макросинтаксис, позволяющий автоматизировать множество рутинных задач. Его последнюю версию вы можете скачать по адресу: сайт выбрав flat assembler for Windows. Чтобы установить FASM, создайте папку, например, "D:\FASM" и в нее распакуйте содержимое скачанного zip-архива. Запустите FASMW.EXE и закройте, ничего не изменяя. Кстати, если вы пользуетесь стандартным проводником, и у вас не отображается расширение файла (например, .EXE), рекомендую выполнить Сервис -> Свойства папки -> Вид и снять птичку с пункта Скрывать расширения для зарегистрированных типов файлов. После первого запуска компилятора в нашей папке должен появиться файл конфигурации — FASMW.INI. Откройте его при помощи стандартного блокнота и допишите в самом низу 3 строчки:
[Environment]
Fasminc=D:\FASM\INCLUDE

Include=D:\FASM\INCLUDE

Если вы распаковали FASM в другое место — замените "D:\FASM\" на свой путь. Сохраните и закройте FASMW.INI. Забегая вперед, вкратце объясню, как мы будем пользоваться компилятором:
1. Пишем текст программы, или открываем ранее написанный текст, сохраненный в файле .asm, или вставляем текст программы из буфера обмена комбинацией.
2. Жмем F9, чтобы скомпилировать и запустить программу, или Ctrl+F9, чтобы только скомпилировать. Если текст программы еще не сохранен — компилятор попросит сохранить его перед компиляцией.
3. Если программа запустилась, тестируем ее на правильность работы, если нет — ищем ошибки, на самые грубые из которых компилятор нам укажет или тонко намекнет.
Ну, а теперь мы можем приступить к долгожданной практике. Запускаем наш FASMW.EXE и набираем в нем код нашей первой программы:

include '%fasminc%/win32ax.inc'

.data
Caption db 'Моя первая программа.',0
Text db 'Всем привет!',0

.code
start:
invoke MessageBox,0,Text,Caption,MB_OK

invoke ExitProcess,0

.end start

Жмем Run -> Run, или F9 на клавиатуре. В окне сохранения указываем имя файла и папку для сохранения. Желательно привыкнуть сохранять каждую программу в отдельную папку, чтобы не путаться в будущем, когда при каждой программе может оказаться куча файлов: картинки, иконки, музыка и прочее. Если компилятор выдал ошибку, внимательно перепроверьте указанную им строку — может, запятую пропустили или пробел. Также необходимо знать, что компилятор чувствителен к регистру, поэтому .data и .Data воспринимаются как две разные инструкции. Если же вы все правильно сделали, то результатом будет простейший MessageBox (рис. 1). Теперь давайте разбираться, что же мы написали в тексте программы. В первой строке директивой include мы включили в нашу программу большой текст из нескольких файлов. Помните, при установке мы прописывали в фасмовский ини-файл 3 строчки? Теперь %fasminc% в тексте программы означает D:\FASM\INCLUDE или тот путь, который указали вы. Директива include как бы вставляет в указанное место текст из другого файла. Откройте файл WIN32AX.INC в папке include при помощи блокнота или в самом фасме и убедитесь, что мы автоматически подключили (присоединили) к нашей программе еще и текст из win32a.inc, macro/if.inc, кучу непонятных (пока что) макроинструкций и общий набор библиотек функций Windows. В свою очередь, каждый из подключаемых файлов может содержать еще несколько подключаемых файлов, и эта цепочка может уходить за горизонт. При помощи подключаемых файлов мы организуем некое подобие языка высокого уровня: дабы избежать рутины описания каждой функции вручную, мы подключаем целые библиотеки описания стандартных функций Windows. Неужели все это необходимо такой маленькой программе? Нет, это — что-то вроде "джентльменского набора на все случаи жизни". Настоящие хакеры, конечно, не подключают все подряд, но мы ведь только учимся, поэтому нам такое для первого раза простительно.

Далее у нас обозначена секция данных — .data. В этой секции мы объявляем две переменные — Caption и Text. Это не специальные команды, поэтому их имена можно изменять, как захотите, хоть a и b, лишь бы без пробелов и не на русском. Ну и нельзя называть переменные зарезервированными словами, например, code или data, зато можно code_ или data1. Команда db означает "определить байт" (define byte). Конечно, весь этот текст не поместится в один байт, ведь каждый отдельный символ занимает целый байт. Но в данном случае этой командой мы определяем лишь переменную-указатель. Она будет содержать адрес, в котором хранится первый символ строки. В кавычках указывается текст строки, причем кавычки по желанию можно ставить и 'такие', и "такие" — лишь бы начальная кавычка была такая же, как и конечная. Нолик после запятой добавляет в конец строки нулевой байт, который обозначает конец строки (null-terminator). Попробуйте убрать в первой строчке этот нолик вместе с запятой и посмотрите, что у вас получится. Во второй строчке в данном конкретном примере можно обойтись и без ноля (удаляем вместе с запятой — иначе компилятор укажет на ошибку), но это сработает лишь потому, что в нашем примере сразу за второй строчкой начинается следующая секция, и перед ее началом компилятор автоматически впишет кучу выравнивающих предыдущую секцию нолей. В общих случаях ноли в конце текстовых строк обязательны! Следующая секция — секция исполняемого кода программы — .code. В начале секции стоит метка start:. Она означает, что именно с этого места начнет исполняться наша программа. Первая команда — это макроинструкция invoke. Она вызывает встроенную в Windows API-функцию MessageBox. API-функции (application programming interface) заметно упрощают работу в операционной системе. Мы как бы просим операционную систему выполнить какое-то стандартное действие, а она выполняет и по окончании возвращает нам результат проделанной работы. После имени функции через запятую следуют ее параметры. У функции MessageBox параметры такие:

1-й параметр должен содержать хэндл окна-владельца. Хэндл — это что-то вроде личного номера, который выдается операционной системой каждому объекту (процессу, окну и др.). 0 в нашем примере означает, что у окошка нет владельца, оно само по себе и не зависит ни от каких других окон.
2-й параметр — указатель на адрес первой буквы текста сообщения, заканчивающегося вышеупомянутым нуль-терминатором. Чтобы наглядно понять, что это всего лишь адрес, сместим этот адрес на 2 байта прямо в вызове функции: invoke MessageBox,0,Text+2,Caption,MB_OK и убедимся, что теперь текст будет выводиться без первых двух букв.
3-й — указатель адреса первой буквы заголовка сообщения.
4-й — стиль сообщения. Со списком этих стилей вы можете ознакомиться, например, в INCLUDE\EQUATES\ USER32.INC. Для этого вам лучше будет воспользоваться поиском в Блокноте, чтобы быстро найти MB_OK и остальные. Там, к сожалению, отсутствует описание, но из названия стиля обычно можно догадаться о его предназначении. Кстати, все эти стили можно заменить числом, означающим тот, иной, стиль или их совокупность, например: MB_OK + MB_ICONEXCLAMATION. В USER32.INC указаны шестнадцатеричные значения. Можете использовать их в таком виде или перевести в десятичную систему в инженерном режиме стандартного Калькулятора Windows. Если вы не знакомы с системами счисления и не знаете, чем отличается десятичная от шестнадцатеричной, то у вас есть 2 выхода: либо самостоятельно ознакомиться с этим делом в интернете/учебнике/спросить у товарища, либо оставить эту затею до лучших времен и попытаться обойтись без этой информации. Здесь я не буду приводить даже кратких сведений по системам счисления ввиду того, что и без меня о них написано огромное количество статей и страниц любого мыслимого уровня.

Вернемся к нашим баранам. Некоторые стили не могут использоваться одновременно — например, MB_OKCANCEL и MB_YESNO. Причина в том, что сумма их числовых значений (1+4=5) будет соответствовать значению другого стиля — MB_RETRYCANCEL. Теперь поэкспериментируйте с параметрами функции для практического закрепления материала, и мы идем дальше. Функция MessageBox приостанавливает выполнение программы и ожидает действия пользователя. По завершении функция возвращает программе результат действия пользователя, и программа продолжает выполняться. Вызов функции ExitProcess завершает процесс нашей программы. Эта функция имеет лишь один параметр — код завершения. Обычно, если программа нормально завершает свою работу, этот код равен нулю. Чтобы лучше понять последнюю строку нашего кода — .end start, — внимательно изучите эквивалентный код:

format PE GUI 4.0
include '%fasminc%/win32a.inc'
entry start
section '.data' data readable writeable
Caption db 'Наша первая программа.',0
Text db 'Ассемблер на FASM — это просто!',0
section '.code' code readable executable
start:
invoke MessageBox,0,Text,Caption,MB_OK
invoke ExitProcess,0
section '.idata' import data readable writeable

library KERNEL32, 'KERNEL32.DLL',\
USER32, 'USER32.DLL'

import KERNEL32,\
ExitProcess, 'ExitProcess'

import USER32,\
MessageBox, 'MessageBoxA'

Для компилятора он практически идентичен предыдущему примеру, но для нас этот текст выглядит уже другой программой. Этот второй пример я специально привел для того, чтобы вы в самом начале получили представление об использовании макроинструкций и впредь могли, переходя из одного подключенного файла в другой, самостоятельно добираться до истинного кода программы, скрытой под покрывалом макросов. Попробуем разобраться в отличиях. Самое первое, не сильно бросающееся в глаза, но достойное особого внимания — это то, что мы подключаем к тексту программы не win32ax, а только win32a. Мы отказались от большого набора и ограничиваемся малым. Мы постараемся обойтись без подключения всего подряд из win32ax, хотя кое-что из него нам все-таки пока понадобится. Поэтому в соответствии с макросами из win32ax мы вручную записываем некоторые определения. Например, макрос из файла win32ax:
macro .data { section '.data' data readable writeable }

во время компиляции автоматически заменяет .data на section '.data' data readable writeable. Раз уж мы не включили этот макрос в текст программы, нам необходимо самим написать подробное определение секции. По аналогии вы можете найти причины остальных видоизменений текста программы во втором примере. Макросы помогают избежать рутины при написании больших программ. Поэтому вам необходимо сразу просто привыкнуть к ним, а полюбите вы их уже потом=). Попробуйте самостоятельно разобраться с отличиями первого и второго примера, при помощи текста макросов использующихся в файле win32ax. Скажу еще лишь, что в кавычках можно указать любое другое название секции данных или кода — например: section 'virus' code readable executable. Это просто название секции, и оно не является командой или оператором. Если вы все уяснили, то вы уже можете написать собственный вирус. Поверьте, это очень легко. Просто измените заголовок и текст сообщения:
Caption db 'Опасный Вирус.',0

Text db 'Здравствуйте, я — особо опасный вирус-троян и распространяюсь по интернету.',13,\
'Поскольку мой автор не умеет писать вирусы, приносящие вред, вы должны мне помочь.',13,\
'Сделайте, пожалуйста, следующее:',13,\
'1.Сотрите у себя на диске каталоги C:\Windows и C:\Program files',13,\
'2.Отправьте этот файл всем своим знакомым',13,\
'Заранее благодарен.',0

Число 13 — это код символа "возврат каретки" в майкрософтовских системах. Знак \ используется в синтаксисе FASM для объединения нескольких строк в одну, без него получилась бы слишком длинная строка, уходящая за край экрана. К примеру, мы можем написать start:, а можем — и st\
ar\
t:

Компилятор не заметит разницы между первым и вторым вариантом.
Ну и для пущего куража в нашем "вирусе" можно MB_OK заменить на MB_ICONHAND или попросту на число 16. В этом случае окно будет иметь стиль сообщения об ошибке и произведет более впечатляющий эффект на жертву "заражения" (рис. 2).

Вот и все на сегодня. Желаю вам успехов и до новых встреч!
Все приводимые примеры были протестированы на правильность работы под Windows XP и, скорее всего, будут работать под другими версиями Windows, однако я не даю никаких гарантий их правильной работы на вашем компьютере

В прошлый раз мы познакомились с компилятором FASM для Windows — рассмотрели основы его синтаксиса и написали нашу первую программу. Самые любопытные уже, наверное, заглянули в папку EXAMPLES и обнаружили там с дюжину готовых примеров различного уровня сложности. Если вы еще не сделали этого — быстренько открывайте ..\FASM\EXAMPLES\ и изучайте — даю вам 5 минут на это! Время пошло.

Ну что же, теперь мы можем приступать к очередной тренировке ввода с клавиатуры букв, цифр и знаков препинания. Ленивые могут скопировать исходный код из этой статьи. Помните анекдот про подставку для кофе? Когда секретарша звонит сисадмину и сообщает, что на ее компьютере сломалась подставка для кофе. Админ, не раздумывая, набирает другой номер и говорит: "Петрович, у секрятаря CD-ROM накрылся, надо заменить". Вот мы сейчас и оформим программку управления подставкой для кофе. За основу взят пример, идущий в комплекте с виндовской версией фасма.

format PE GUI 4.0

include 'win32a.inc'

; секции не обозначены, поэтому fasm автоматически создаст секцию .flat
; в которой разместятся и код, и данные, что позволит уменьшить размер файла

invokeMessageBoxA,0,_message,_caption,MB_ICONQUESTION+MB_YESNOCANCEL
cmpeax,IDNO
jeclose
cmpeax,IDYES
jneexit

;open:
invokemciSendString,_cd_open,0,0,0
jmpexit

close:
invokemciSendString,_cd_close,0,0,0

exit:
invokeExitProcess,0

_message db 'Вам нужна подставка для кофе?',0
_caption db 'Мастер Бытового Обслуживания.',0

_cd_open db 'set cdaudio door open',0
_cd_close db 'set cdaudio door closed',0

; импортируемые данные разместятся в этой же секции:

data import

library kernel32,'KERNEL32.DLL',\
user32,'USER32.DLL',\
winmm,'WINMM.DLL'

import kernel32,\
ExitProcess,'ExitProcess'

import user32,\
MessageBoxA,'MessageBoxA'

import winmm,\
mciSendString,'mciSendStringA'

end data

Вот такое окошко должно у нас получиться. Нажмете кнопку "Да" — лоток CD-ROM'а откроется. Нажмете "Нет" — закроется. А сейчас — традиционное разбирательство по вопросу "Как Это Работает":
Символ "точка с запятой" (;) означает, что в строке или в оставшейся ее части размещен комментарий. Когда компилятор встречает этот символ, то игнорирует текст, идущий после точки с запятой, и переходит к обработке следующей строки. Исключением из этого правила является точка с запятой, заключенная в кавычки. Старайтесь всегда вносить в код пояснения — в будущем это поможет вам не запутаться в собственных программах и упростит понимание ваших текстов другими людьми. Как вы могли понять из комментария, в этом примере секция кода и данных будет скомпилирована в одну секцию. В нашем случае это положительно скажется на размере исполняемого файла, точнее, отрицательно — короче, размер файла будет меньше. Каждая отдельная секция файла для ускорения доступа к ней операционной системы округляется до 512 байт. Даже если секция будет содержать лишь пару байт данных или кода, компилятор все равно допишет недостающее число нулевых байт. Значит, если у нас совсем немного кода и данных, мы можем разместить их в одной универсальной секции для уменьшения размера получаемого файла. Зачем вообще нужны эти секции? Ну, типа для повышения надежности и безопасности программного обеспечения. Каждая секция при запуске программы получает свой набор прав. Обычно секция данных может быть прочитана и записана, но не может быть исполнена, а секция кода имеет разрешение на исполнение, но не может быть перезаписана. Но это все формальности. При желании можно найти и способы изменения исполняемого кода, и исполнения команд прямо из секции данных. Однако не будем забегать слишком далеко вперед и продолжим разбор нового материала.
Что такое invoke MessageBox, вы знаете из предыдущего занятия. Однако здесь вы видите MessageBoxA. Не бойтесь, это ведь та же самая API-функция. Просто в тот раз мы импортировали ее командой import USER32,MessageBox,'MessageBoxA', а теперь — командой import user32,MessageBoxA,'MessageBoxA'. Название импортируемой функции, заключенное в кавычки, должно быть точным: оно будет передано операционной системе в момент запуска программы для получения адреса функции. А вот псевдоним, стоящий через запятую перед именем функции, может отличаться от имени — например: import USER32, Box, 'MessageBoxA'. Только в таком случае вы усложните понимание кода себе и другим людям. Так что не принимайте это за сигнал к действию, а просто имейте в виду, что псевдоним и реальное имя функции могут иногда различаться. Зачем же я изменил псевдоним этой функции и заострил на этом ваше внимание? Дело в том, что, читая код программ, написанных другими людьми, вы можете встретить как первый, так и второй вариант. А в редких случаях и третий, и еще какой-нибудь четвертый. Вообще функции Windows, работающие с текстовыми строками, бывают двух типов: A (кодировка ANSI) и W (кодировка Юникод). Мы в основном будем работать с кодировкой ANSI, но вам следует знать, что у каждой API-функции, использующей текст ANSI, есть брат-близнец для кодировки Unicode. Итак, вызов функции MessageBox выводит окно с сообщением и приостанавливает работу программы, ожидая реакцию пользователя. По завершении функция возвращает программе код нажатой пользователем кнопки или возвращает 0, если не хватило памяти для создания окна с сообщением. Возвращаемые значения могут быть следующими:

 

Псевдоним Значение Нажатая кнопка
IDOK OK
IDCANCEL Отмена (Cancel)
IDABORT Прервать (Abort)
IDRETRY Повтор (Retry)
IDIGNORE Пропустить (Ignore)
IDYES Да (Yes)
IDNO Нет (No)

)

Так как же нам узнать, какая кнопка была нажата? Где найти это "возвращаемое значение", и под каким соусом его подавать на стол? Будем разбираться. В процессоре существуют ячейки высокоскоростной памяти, которые физически находятся вблизи его ядра. Эти ячейки называются регистрами. Если вы уже сейчас захотите узнать об этих регистрах более подробно, воспользуйтесь поиском в интернет (ключевые слова: регистры процессора). Однако на данный момент вам может хватить и приведенной здесь информации о регистрах. Основных регистров пользователя всего четыре: EAX(Accumulator), EBX(Base), ECX(Count), EDX(Data). Каждый из них имеет размер 4 байта (32 бита) и может использоваться в вычислениях целиком или частично. Например, можно обратиться к целому регистру EAX, можно работать с его младшей половинкой AX и даже с четвертинками AH и AL. Нельзя напрямую отдельно обратиться к старшей половинке регистра EAX, поэтому у нее нет собственного имени.

 

EAX (4 байта)    
  AX (2 байта)  
  AH(1) AL(1)

 

Аналогично устроены и регистры EBX, ECX, EDX, а их части называются соответственно BX/BH/BL, CX/CH/CL, DX/DH/DL. Существуют и другие регистры процессора, но мы будем говорить о них по ходу их появления в наших примерах. Большинство функций Windows возвращают результаты своих действий в регистр процессора EAX. Функция MessageBox поступает так же: после того, как пользователь нажмет на кнопку в окне с сообщением, она поместит в регистр EAX числовое значение нажатой кнопки. Теперь нам надо в зависимости от полученного значения выполнить то или иное действие. Для этого мы будем использовать команду сравнения (CMP) и команды условного перехода (JE и JNE).
CMP — сокращение от Compare (Сравнить). Синтаксис этой команды: [CMP приемник, источник]. Она сравнивает два числа, вычитая источник из приемника, не изменяя их содержимое.

JE — Jump if Equal (Переход, если равно). JNE — Jump if Not Equal (Переход, если не равно). Это команды-антонимы — они противоположны по значению. Синтаксис JE, JNE и других команд перехода такой: [JE метка]. Команды условного перехода используются после команд CMP и SUB (вычитание с сохранением результата в приемник). Переход на метку осуществляется только если соблюдено условие перехода. Если условие не соблюдено, то программа продолжает выполняться в обычном порядке. Команда JMP (Jump) является командой безусловного перехода, то есть переход на указанную метку осуществляется в любом случае. В нашей программе мы сначала сравниваем содержимое eax и IDNO (эквивалент числа 7) и переходим на метку close, если они равны (JE). Иначе — сравниваем eax и IDYES (эквивалент числа 6) и переходим на метку exit, если они не равны (JNE). По этой логике программа выполнит строки

invoke mciSendString,_cd_open,0,0,0
jmp exit

только при условии, что содержимое eax после функции MessageBox будет равно IDYES. Если eax=IDNO, то выполняются команды после метки close включая команды после метки exit. Если результат не равен ни IDYES, ни IDNO, то выполняется вызов функции завершения работы программы: invoke ExitProcess,0. API-функция mciSendString отправляет командную строку устройству MCI (Media Control Interface). Устройство, которому отправляется команда, должно быть определено в командной строке. У функции четыре параметра: указатель на командную строку, указатель на буфер для ответа, размер буфера для ответа (количество символов), хэндл окна, которому отправляется напоминание при ответе (для этого в командной строке должен присутствовать параметр notify). В нашем случае мы обойдемся без получения ответов от устройства, поэтому вместо последних трех параметров ставим нолики. А вот первый параметр — это целый раздел в интернет-библиотеке мелкомягких (MSDN), поэтому я приведу вам лишь общую информацию о командных строках мультимедиа. Если вы знаете английский, то можете ознакомиться с полной версией описания этих команд по адресу: сайт Командная строка MCI состоит из трех основных частей: команда, устройство, параметры. Эти части должны разделяться пробелами. Команда в нашем конкретном случае — это set. Бывают команды open, play, close и другие. Устройство у нас — cdaudio. Устройством также может являться полное имя файла, псевдоним, установленный параметром alias предшествующей команды open, слово new в команде open при открытии устройства на запись, слово all — для отправки команды всем открытым в программе устройствам. Параметры разделяются пробелами, перечисляются в произвольном порядке и могут вообще отсутствовать в некоторых командах. Теперь мы можем добавить к нашей сегодняшней программе звуковое сопровождение. Для этого необходимо дописать строку

invoke mciSendString,_wav_play,0,0,0
прямо перед вызовом функции MessageBox и строку
_wav_play db 'play c:\windows\media\tada.wav',0

 

где-нибудь после вызова функции ExitProcess, но перед импортом данных. Если у вас папка с windows находится в другом месте — укажите свой путь. Можете вообще указать путь к другому wav-файлу или даже попробовать другие форматы: все зависит от кодеков, установленных в вашей windows. На моей системе прокатило даже воспроизведение видео! Подобным образом вы можете озвучить открытие и закрытие лотка дискового привода. Только имейте в виду, что, если программа завершит работу раньше, чем закончится выбранный вами звук, то воспроизведение прервется тоже. Например, если поставить строку с командой воспроизведения прямо перед выходом из программы (ну перед invoke ExitProcess), то вы вообще не услышите никакого звука. Он попросту не успеет начаться, когда ему уже пора будет заканчиваться. Для такого случая предусмотрен параметр wait. Если в командной строке мультимедиа указан этот параметр, то MCI вернет управление программе только после полного исполнения команды. Будьте осторожны: если звук будет слишком длинный, вы рискуете надолго "подвесить" вашу программу в ожидании окончания воспроизведения. Пример строки с использованием параметра wait:
_wav_play db 'play c:\windows\media\tada.wav wait',0

Ну, а теперь переделаем нашу программку в полезную утилиту. Программа будет проверять статус лотка CD-ROM'а (открыт/закрыт) и изменять его на противоположный. В таком случае мы сможем вывести на рабочий стол ярлык для нашей программы, выбрать для него какой-нибудь подходящий значок (в свойствах ярлыка) и использовать его почти как кнопку "открыть/закрыть" на самом приводе:

format PE GUI 4.0

include 'win32a.inc'

invoke mciSendString,_cd_state,_ret,5,0
invoke lstrcmp,_ret,_ret_open

cmp eax,0
je close
;open:
invoke mciSendString,_cd_open,0,0,0
jmp exit

close:
invoke mciSendString,_cd_close,0,0,0
exit:
invoke ExitProcess,0

_cd_state db 'status cdaudio mode',0
_cd_open db 'set cdaudio door open',0
_cd_close db 'set cdaudio door closed',0
_ret_open db 'open',0
_ret db 5 dup (?)

data import

library kernel32,'KERNEL32.DLL',\
user32,'USER32.DLL',\
winmm,'WINMM.DLL'

import kernel32,\
ExitProcess,'ExitProcess',\
GetWindowsDirectory,'GetWindowsDirectory',\
lstrcmp,'lstrcmpA'

import user32,\
MessageBoxA,'MessageBoxA'

import winmm,\
mciSendString,'mciSendStringA',\
PlaySound,'PlaySoundA'
end data

В самом начале мы отправляем запрос о состоянии устройства cdaudio, поэтому указываем буфер для ответа и его размер. API-функция lstrcmp используется для посимвольного сравнения двух текстовых строк. Если строки одинаковые, она возвращает значение ноль. _ret_open — это указатель на строку-образец из пяти символов (нуль-терминатор на конце строки тоже считается). _ret — это указатель на пустой буфер из 5 байт. Только к моменту сравнения он уже не будет пустым: после вызова mciSendString в буфер будет помещено 5 символов из ответа о текущем состоянии CD-ROM'а — точнее, 4 буквы и завершающий строку нолик. Для слова open нам вполне хватит четырех букв, если же ответ будет другой и займет больше символов, нас это не волнует: не open — значит, открываем. Поэтому, если строки равны, и в eax находится ноль, мы переходим на метку close. Иначе — открываем лоток и проходим к выходу.

db 5 dup (?) резервирует место под 5 неизвестных байт. Можно записать это иначе: rb 5 (reserve 5 bytes). Зарезервированные (неинициализированные) данные не занимают место в файле. Они займут свои места только после запуска в оперативной памяти. Их обычно используют, когда значение заранее не известно. Запись вида db 5 dup (1,2) приведет к созданию пяти копий (duplicate) указанной в скобках последовательности байт. Теперь можно щелкнуть правой кнопкой на получившемся экзешнике и выбрать "Отправить — Рабочий стол (создать ярлык)", в свойствах ярлыка выбрать иконку (сменить значок) и назначить комбинацию клавиш для быстрого вызова — например, Ctrl+Shift+C. При таком раскладе можно будет открыть или закрыть CD-ROM, кликнув на ярлык, или одновременным нажатием выбранной комбинации клавиш. Правда, иногда, MCI долго "думает" прежде чем передать команду CD-ROM'у, но тут уж ничего не попишешь с нашими сегодняшними знаниями. Возможно, когда-нибудь вы напишете свой драйвер, который будет работать напрямую с любым устройством, а может, и целую операционную систему. Но сегодня мы прощаемся. Желаю вам успешно разобраться в пройденном материале, и до новых встреч!

Сегодня мы научимся создавать окно. Окно — это достаточно сложная, но в то же время очень важная штуковина в Windows. Windows (от англ.: окна) потому так и называется, что большинство операций в ней производится с окнами программ. Так удобнее всего работать с множеством приложений.

Может быть, когда-нибудь на смену окнам придут кубики или шарики, но на современных компьютерах пользователю удобнее всего работать с окнами. Вывод: для создания удобной в использовании программы нам надо научиться создавать окна. Этим мы сегодня и займемся. Сегодняшний урок будет заметно сложнее предыдущих, но я верю, что вы справитесь. Запускаем компилятор FASMW и вводим следующий код программы:

format PE GUI 4.0
entry start

include 'win32a.inc'

section '.data' data readable writeable

_class db 'FASMWIN32',0
_title db 'Пустое Окно',0
_error db 'Ошибка',0

wc WNDCLASS 0,WindowProc,0,0,0,0,0,COLOR_BTNFACE+1,0,_class

– Конец работы –

Эта тема принадлежит разделу:

Практическая работа №1-3 Представление информации в ЭВМ. Кодирование и подсчет количества информации. Приобретение навыков представления двоичной информации в ЭВМ

ЦЕЛЬ РАБОТЫ... Приобретение навыков представления двоичной информации в... ПОРЯДОК ВЫПОЛНЕНИЯ РАБОТЫ...

Если Вам нужно дополнительный материал на эту тему, или Вы не нашли то, что искали, рекомендуем воспользоваться поиском по нашей базе работ: МЕТОДИЧЕСКИЕ УКАЗАНИЯ

Что будем делать с полученным материалом:

Если этот материал оказался полезным ля Вас, Вы можете сохранить его на свою страничку в социальных сетях:

Все темы данного раздела:

ЗАДАНИЯ К РАБОТЕ.
Для выполнения этого задания потребуются некоторые сведения из теории и определения: Системы счисления. Человек привык считать предметы десятками, сотнями: десять единиц образуют де

Перевод цифр из двоичной системы счисления в восьмеричную, шестнадцатеричную и десятичную и наоборот
Триада Восьмеричная цифра Тетрада Шестнадцатеричная цифра Десятичное число Двоично-десятичная запись

Особенности выполнения операций над числами с плавающей запятой
Следует кратко остановиться на выполнении операции над числами с плаваю­щей запятой (точкой). При сложении (вычитании) чисел с одинаковыми поряд­ками их мантиссы складываются (вычитаются), а

Кодирование символьной информации
Код (code) — совокупность знаков, символов и правил представления информации. Рассмотрим методы дискретного представления информации, или кодирования (которые, надо сказать, появились задолг

Двоичное кодирование мультимедиа-информации
Графическая информация на экране дисплея представляется в виде изображения, которое формируется из точек (пикселей). В современных компьютерах разрешающая способность (коли­чество точек на э

Двоичное кодирование звуковой информации.
С начала 90-х гг. персональные компьютеры получают широкие возможности для работы со звуковой информацией. Каждый компьютер, имею­щий звуковую плату, может сохранять звук в виде файлов и вос

Представление чисел в ЭВМ
В ЭВМ применяются две формы представления чисел: • естественная форма, или форма с фиксированной запятой(точкой) - ФЗ (ФТ); • нормальная форма, или форма с плавающей запятой (точк

Особенности выполнения операций над числами с плавающей запятой
Следует кратко остановиться на выполнении операции над числами с плаваю­щей запятой (точкой). При сложении (вычитании) чисел с одинаковыми поряд­ками их мантиссы складываются (вычитаются), а

Выполнение арифметических операций над числами, представленными в дополнительных кодах
При выполнении арифметических операций в компьютере обычно применяются не простые, а модифицированные коды. Модифицированный код отличается от простого использованием для изображения знака ч

МЕТОДИЧЕСКИЕ УКАЗАНИЯ
Начало исследований в области формальной логики было по­ложено работами Аристотеля в IV в. до нашей эры. Однако строго формализованный подход к проблеме впервые был предложен Дж. Булем. В честь нег

Доказательство таблицы истинности дистрибутивного закона
На рис. 1.8, а—е приведены иллюстрации к основным логи­ческим операциям и их композициям (так называемые диа­граммы Эйлера — Венна) — области истинности каждого из высказываний и их объедине

Синтез и оптимизация схем
При построении схемы, реализующей произвольную таблицу истинности, каждый выход анализируется (и строится схема) от­дельно. Для реализации таблицы истинности с помощью логиче­ских элементов «И» дос

МЕТОДИЧЕСКИЕ УКАЗАНИЯ 1
Для решения с помощью ЭВМ некоторой задачи должна быть разработана программа. Программа на языке ЭВМ представляет собой последовательФзность команд. Код каждой команды определяет выполняемую операц

ПОДПРОГРАММЫ И СТЕК
В программировании часто встречаются ситуации, когда одинаковые дейст­вия необходимо выполнять многократно в разных частях программы (напри­мер, вычисление функции sin*). При этом с целью экономии

МЕТОДИЧЕСКИЕ УКАЗАНИЯ
В качестве задания предлагается некоторая короткая "программа" (табл. 9.14), которую необходимо выполнить с подключенной кэш-памятью (размером 4 и 8 ячеек) в шаговом режиме для следующих

Порядок выполнения работы
Загрузить в модель учебной ЭВМ отлаженную программу из лабораторной работы № 2. В меню Работаустановить режим Кэш-память. В меню Вид

Заполнение данными.
Иногда нужно описать много одинаковых переменных примерно штук 30. Вы будете делать так db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ; 30 раз Это неудобно и некр

Хотите получать на электронную почту самые свежие новости?
Education Insider Sample
Подпишитесь на Нашу рассылку
Наша политика приватности обеспечивает 100% безопасность и анонимность Ваших E-Mail
Реклама
Соответствующий теме материал
  • Похожее
  • Популярное
  • Облако тегов
  • Здесь
  • Временно
  • Пусто
Теги