|
Раздел 1.Основы работы в ассемблереСтр 1 из 4Следующая ⇒ Введение
Учебная практика по МДК 01.01 “Системное программирование” и МДК 01.03 “WEB-программирование” предназначена для закрепления теоретических знаний, практических навыков и умений в разработке программ на языке Ассемблер и на языке HTML 5.0 соответственно. Программирование - это процесс составления и подготовки деятельности программы, которое при выполнении должно привести к определённым результатам. Машинный код – система команд конкретной вычислительной машины (процессора), которая интерпретируется непосредственно процессором. Команда, как правило, представляет собой целое число, которое записывается в регистр процессора. Процессор читает это число и выполняет операцию, которая соответствует этой команде. Язык программирования низкого уровня (низкоуровневый язык программирования) - это язык программирования, максимально приближенный к программированию в машинных кодах. В отличие от машинных кодов, в языке низкого уровня каждой команде соответствует не число, а сокращенное название команды (мнемоника). Например, команда ADD - это сокращение от слова ADDITION (сложение). Поэтому использование языка низкого уровня существенно упрощает написание и чтение программ (по сравнению с программированием в машинных кодах). Язык ассемблера - это машинно-зависимый язык низкого уровня, в котором короткие мнемонические имена соответствуют отдельным машинным командам. Используется для представления в удобочитаемой форме программ, записанных в машинном коде. Язык ассемблера помогает раскрыть все секреты аппаратного и программного обеспечения. С его помощью можно получить представление о том, как аппаратная часть взаимодействует с операционной системой и как прикладные программы обращаются к операционной системе. Большинство программистов работают с языками высокого уровня, где отдельное утверждение преобразовывается во множество процессорных команд. Ассемблер язык машинного уровня; каждая команда непосредственно интерпретируется в машинный код, что дает основание считать его языком низкого уровня. Наиболее часто язык ассемблера используется для написания дополнений к операционной системе или для написания программ прямого доступа к аппаратуре. Он необходим также при оптимизации критических блоков в прикладных программах с целью повышения их быстродействия. HTML (от англ. HyperTextMarkupLanguage - «язык гипертекстовой разметки») - стандартный язык разметки документов во Всемирной паутине. Большинство веб-страниц содержат описание разметки на языке HTML (или XHTML). Язык HTML интерпретируется браузерами; полученный в результате интерпретации форматированный текст отображается на экране монитора компьютера или мобильного устройства. HTML - теговый язык разметки документов. Любой документ на языке HTML представляет собой набор элементов, причём начало и конец каждого элемента обозначается специальными пометками - тегами. Элементы могут быть пустыми, то есть не содержащими никакого текста и других данных (например, тег перевода строки<br>). В этом случае обычно не указывается закрывающий тег. Кроме того, элементы могут иметь атрибуты, определяющие какие-либо их свойства (например, размер шрифта для элементаfont). Атрибуты указываются в открывающем теге. Web-страницы - это документы в формате HTML, содержащие текст и специальные тэги (дескрипторы) HTML. По большому счету тэги HTML необходимы для форматирования текста (т.е. придания ему нужного вида), который "понимает" браузер. Документы HTML хранятся в виде файлов с расширением.htm или.html.
Раздел 1.Основы работы в ассемблере Теоретическая часть Основные понятия Ассе́мблер — транслятор исходного текста программы, написанной на языке ассемблера, в программу на машинном языке. Как и сам язык, ассемблеры, как правило, специфичны для конкретной архитектуры, операционной системы и варианта синтаксиса языка. Вместе с тем существуют мультиплатформенные или вовсе универсальные (точнее, ограниченно-универсальные, потому что на языке низкого уровня нельзя написать аппаратно-независимые программы) ассемблеры, которые могут работать на разных платформах и операционных системах. Среди последних можно также выделить группу кросс-ассемблеров, способных собирать машинный код и исполняемые модули (файлы) для других архитектур и ОС. Ассемблирование может быть не первым и не последним этапом на пути получения исполнимого модуля программы. Так, многие компиляторы с языков программирования высокого уровня выдают результат в виде программы на языке ассемблера, которую в дальнейшем обрабатывает ассемблер. Также результатом ассемблирования может быть не исполнимый, а объектный модуль, содержащий разрозненные блоки машинного кода и данных программы, из которого (или из нескольких объектных модулей) в дальнейшем с помощью редактора связей может быть получен исполнительный файл. Переносимые ассемблеры Также существует открытый проект ассемблера, версии которого доступны под различные операционные системы, и который позволяет получать объектные файлы для этих систем. Называется этот ассемблер NASM(Netwide Assembler). YASM— это переписанная с нуля версия NASM под лицензией BSD (с некоторыми исключениями). Flat asembler (fasm) — молодой ассемблер под модифицированной для запрета перелицензирования (в том числе под GNU GPL BSD-лицензией. Есть версии для KolibriOS,Linux,DOS и Windows; использует Intel-синтаксиз и поддерживает инструкции x86-64. Регистры ЦП Для выполнения арифметических действий, пересылки данных и адресации, компьютер имеет ряд регистров. Регистр - это область памяти для временного хранения данных. По назначению различают: Аккумуляторы – хранение промежуточных результатов арифметических и логических операций, инструкций ввода-вывода. Флаговые – хранение признаков результатов арифметических и логических операций. Общего назначения – хранение операндов арифметических и логических выражений, индексы, адреса. Индексные – индексы исходящих и целевых элементов массива. Указательные – указатели на специальные области памяти, указатели текущей операции, указатели базы, указатели стека. Сегментные – адреса и селекторы сегментов памяти. Управляющие – информация управляющая состоянием процессора, адреса системных таблиц. Регистры общего назначения ЕАХ (Accumulator) – хранение промежуточных данных EBX (Base) – хранение базового адреса ECX (Counter) – регистр-счетчик применяется в командах, производящих некоторые повторяющееся действия, его использование за частую не явно – скрыто в алгоритме работы команды. EDX (Data)–хранение промежуточных данных. Данные Регистры являются 32-разрядными и делятся на две части по 16 бит, старшая часть – не доступна, а младшая тоже делится на две части по 8 бит. Регистры указатели ESI и EDI –индексы источника и приемника, используются при обработке длинных полей. EBP и ESP –указатели базы и вершины, используются при работе со стеком. Сегментные регистры Структура программы разделена на блоки – сегменты, выделяют следующие типы сегментов: Сегмент кода содержит команды программы, адрес сегмента кода с которым в настоящий момент работает программа располагается в сегментном регистре сs. Сегмент данных содержит данные, которыми оперирует программа. Программа одновременно может работать с несколькими сегментами данных. Адрес основного сегмента данных располагается в регистре ds, а дополнительных — в es, gs, fs. Сегмент стека – специальная область памяти, ее адрес располагаться в регистре ss. Сегментные регистры являются 16-разрядными. EIP-32 IP -16 Содержит смещение следующей подлежащей выполнению команды относительно начала сегмента кода. После выполнения команды меняется автоматически. Полный адрес команды формирует пара регистров CS:IP. Регистр флагов EFLAGS-32 FLAGS -16 Биты этих регистров называются флагами. Различают флаги состояния, управляющие, системные и зарезервированные флаги. Флаг переноса CF (Carry Flag) идентифицирует перенос или заем при выполнении арифметических операций, а также служит индикатором ошибки при обращении к системным функциям. Флаг паритета PF (Parity Flag) устанавливается в 1, если младшие 8 бит результата операции содержат четное число двоичных единиц. Флаг нуля ZF (ZeroFlag) устанавливается в 1, если результат операции равен нулю. Флаг знака SF (SignFlag) показывает знак результата операции, устанавливаясь в 1 при отрицательном результате. Флаг переполнения OF (OverflowFlag) фиксирует переполнение,т.е. выход результата операции за пределы допустимого для данного процессора диапазона значений. Команды Команды пересылки данных. Команды пересылки данных осуществляют обмен данными и адресами между ячейками памяти и регистрами или портами ввода-вывода. Эти команды разделены на четыре группы: ü команды общего назначения, ü команды ввода-вывода, ü команды пересылки адресов ü и команды пересылки флагов. Основная команда общего назначения MOV (MOVe – переслать) может переслать байт или слово между регистром и ячейкой памяти или между двумя регистрами. Она может также переслать непосредственно адресуемое значение в регистр или ячейку памяти. Команда MOV имеет следующий формат: MOV приемник, источник. Команды работы со стеком. Для временного сохранения данных (содержимого регистра или ячейки памяти) удобно использовать стек. Для работы со стеком есть две команды PUSH (поместить слово в стек) и POP (извлечь слово из стека). Команда PUSH помещает содержимое регистра или ячейки памяти размером в слово на вершину стека. Команда POP, наоборот, снимает слово с вершины стека и помещает его в регистр или ячейку памяти. Команды PUSH и POP имеют следующие форматы: PUSH источник POP приемник. Будучи взаимно обратными командами, PUSH и POP обычно используются парами, т.е. каждой команде PUSH в программе должна соответствовать команда POP. Вершина стека – это ячейка в сегменте стека, адрес которой содержится в указателе стека SP. Регистр SP всегда указывает на слово, помещенное в стек последним. Следовательно, команда PUSH вычитает 2 из значения указателя стека, а затем пересылает операнд-источник в стек. Команды ввода-вывода. Команды ввода-вывода используются для взаимодействия с периферийными устройствами системы. Они имеют формат: IN аккумулятор,порт OUT порт, аккумулятор Где аккумулятор – регистр AL при обмене байтами или регистр AX при обмене словами. Операндом порт может быть десятичное число от 0 до 255, что позволяет адресоваться к 256 устройствам. Команды пересылки адреса. Команды пересылки адреса передает не содержимое переменных, а их адреса. Команда LEA (load effective address – загрузить эффективный адрес) пересылает смещение ячейки памяти в любой 16-битовый регистр общего назначения, регистр указателя или индексный регистр. Она имеет формат: LEA регистр16,память16 Где операнд память16 должен иметь атрибут WORD. Сложение и вычитание. Для сложения и вычитания используются инструкции ADD и SUB. ADD прибавляет содержимое операнда- источника (правый) к содержимому операнда приемнике и сохраняет результат в операнде приемнике. SUB работает так же, за исключением того, что он вычитает операнд источника из операнда приемника. Команды приращения и уменьшения приемника на единицу. Когда ассемблерной программе требуется производить сложение, хорошо, если добавляемое значение это 1. Это называется инкремент. Аналогично, когда значение 1 вычитается из регистра или переменной это называется декремент. Для таких операций, как изменение счетчика цикла или изменение регистра указателя при просмотре памяти, Вы используете инкремент и декремент. В соответствии с частым использованием инкремента и декремента ассемблер предоставляет инструкции INC и DEC. Как можно, ожидать INC прибавляет к регистру или переменной 1 и DEC вычитает 1 из регистра или переменной. Умножение и деление. Инструкция MUL умножает два 8 или 16-битных беззнаковых сомножителя, генерируя 16 или 32- битное число. Один из сомножителей при умножении 8-битовых чисел должен быть запомнен в AL; другой может быть в любом 8-битном регистре общего назначения или быть операндом памяти. MUL всегда сохраняет 16 битный результат в AX. Например, MOVAL,25 MOV DH,40 MUL DH... умножает AL на DH, сохраняя результат 1000 в AХ. Заметим, что MUL требует только один операнд; другой сомножитель всегда в AL (или в AX в случае умножения слов). При умножении слов один сомножитель должен быть сохранен в AX, в то время как другой может быть любым 16-битным регистром общего назначения или операндом памяти. MUL помещает 32-битный результат в DX:AX с младшими 16 битами результата в AX и старшими 16 битами результата в DX. Команда DIV (divide – разделить) выполняет деление чисел без знака, а команда IDIV выполняет деление чисел со знаком. Команды имеют формат DIV источник IDIV источник Где источник делитель размеров в байт или слово, находящееся в регистре общего назначения или в ячейке памяти. Делимое должно иметь двойной размер; оно извлекается из регистра AX (при делении на 8-битовое число) или из регистров DX и AX при делении на 16-битовое число). Результат возвращается следующим образом: Если операнд-источник представляет собой байт, то частное возвращается в регистр AL, а остаток в AH. Если операнд-источник слово, то частное возвращается в AX, а остаток – в регистр DX. Изменение знака. Инструкции NEG может изменить знак содержимого регистра общего назначения или переменной. Логические операции. Ассемблер поддерживает полный набор инструкций, которые производят логические операции, включая END, OR, XOR и NOT. AND устанавливая каждый бит в назначении в 1 только тогда, когда соответствующие биты источников – 1 Инструкция OR устанавливая каждый бит в назначении в 1 если хотя бы 1 соответствующий исходный бит установлен в 1. OR позволяет Вам устанавливать исходный бит(ы) в 1. Инструкция устанавливая каждый бит назначения в 1, только если 1 из соответствующих битов источника был 0, а другой 1 Сдвиги и циклические сдвиги. Микропроцессор Intel обеспечивает ряд способов для передвижения битов в регистре или переменной памяти вправо или влево. Простейший из них - логический сдвиг. SHL (сдвиг влево, так же известный как SAL) передвигает каждый бит в назначении на 1 разряд влево или в направлении к старшему значащему биту. Умножение при помощи сдвига много быстрее, чем использование инструкции MUL. SHR (сдвиг вправо) во многом подобен SHL: он сдвигает биты операнда вправо, либо на 1, либо на CL бит, при этом младший значащий бит сдвигается во флаг переноса, а старший значащий бит устанавливается в 0. SHR - это быстрый способ беззнакового деления на 2. SAR - арифметический сдвиг вправо, такой же как SHR, за исключением того, что в SAR старший значащий бит операнда сдвигается вправо на следующий бит и затем возвращается в самого себя. Работа со строками. В ассемблере под строкой понимается последовательность соседних байтов или слов. В связи с этим все строковые команды имеют две разновидности - для работы со строками из байтов (в мнемонику операций входит буква B) и для работы со строками из слов (в мнемонику входит W). Имеются следующие операции над строками: ü пересылка элементов строк (в память, из памяти, память-память); ü сравнение двух строк; ü просмотр строки с целью поиска элемента, равного заданному. Каждая из этих операций выполняется только над одним элементом строки, однако, одновременно происходит автоматическая настройка на следующий или предыдущий элемент строки. Имеются специальные команды повторения (REP и др.), которые заставляют следующую за ними строковую команду многократно повторяться (до 216 раз), в связи с чем, такая пара команд позволяет обработать всю строку, причем намного быстрее, чем запрограммированный цикл. Команда Lea. LEA SI,<начальный/конечный адрес строки> Если же надо загрузить сразу оба регистра DS и SI, тогда можно воспользоваться командой LDS SI,m32 которая в регистр SI заносит первое слово, а в регистр DS - второе слово из двойного слова, имеющего адреc m32 (таким образом, по адресу m32+2 должен храниться сегмент, а по адресу m32 - смещение начального или конечного элемента строки). Начальную загрузку регистров ES и DI обычно осуществляют одной командой LES DI,m32 которая действует аналогично команде LDS. Перечислим вкратце строковые команды ассемблера. Команда загрузки элемента строки в аккумулятор (LODSB или LODSW) пересылает в регистр AL или AX очередной элемент строки, на который указывает пара DS:SI, после чего увеличивает (при DF=0) или уменьшает (при DF=1) регистр SI на 1 или 2. Команда записи аккумулятора в строку (STOSB или STOSW) заносит содержимое регистра AL или AX в тот элемент строки, на который указывает пара ES:DI, после чего изменяет регистр DI на 1 или 2. Команда пересылки строк (MOVSB или MOVSW) считывает элемент первой строки, определяемый парой DS:SI, в элемент второй строки, определяемый парой ES:DI, после чего одновременно меняет регистры SI и DI. Команда сравнения строк (CMPSB или CMPSW) сравнивает очередные элементы строк, указываемые парами DS:SI и ES:DI, и результат сравнения (равно, меньше и т.п.) фиксирует в флагах, после чего меняет регистры SI и DI. Команда сканирования строки (SCASB или SCASW) сравнивает элемент строки, адрес которого задается парой ES:DI, со значением регистра AL или AX и результат сравнения фиксирует в флагах, после чего меняет содержимое регистра DI. Перед любой строковой командой можно поставить одну из двух команд, называемых "префиксами повторения", которая заставит многократно повториться эту строковую команду. Команды переходов. В систему команд ассемблера входит обычный набор команд перехода: безусловные и условные переходы, переходы с возвратами и др. По способу изменения счетчика команд переходы делятся на абсолютные и относительные. Если в команде перехода указан адрес (смещение) той команды, которой надо передать управление, то это абсолютный переход. Однако в команде может быть указана величина (сдвиг), которую надо добавить к текущему значению регистра IP, чтобы получился адрес перехода, и тогда это будет относительный переход при этом сдвиг может быть положительным и отрицательным, так что возможен переход вперед и назад. По величине сдвига относительные переходы делятся на короткие (сдвиг задается байтом) и длинные (сдвиг - слово). Абсолютные же переходы делятся на прямые и косвенные: при прямом переходе адрес перехода задается в самой команде, а при косвенном - в команде указывается регистр или ячейка памяти, в котором (которой) находится адрес перехода JMP но в зависимости от типа операнда, ассемблер формирует разные машинные команды. 1) Внутрисегментный относительный короткий переход. Циклы. Цикл это ничего более, чем блок кода, который заканчивается условным переходом так, что этот код может выполняться постоянно, до тех пор, пока не выполнится условие окончания. Циклы используются для обработки массивов, проверки статуса портов ввода-вывода, пока не будет достигнуто определенное состояние, очистки блоков памяти, чтения строк с клавиатуры, вывода строк на экран и т.п. Поэтому они часто используются, и Ассемблер предоставляет несколько специальных инструкций для циклов: LOOP, LOOPE, LOOPNE и JCXZ. Когда Вам нужен цикл, который повторяется до тех пор, пока счетчик не достигнет нуля, загрузите счетчик в CX и используйте инструкцию LOOP. Процедуры в языке ассемблера. команде CALL, когда надо вызвать процедуру. Это же имя должно быть повторено в директиве ENDP, заканчивающей описание процедуры. Предложения между этими двумя директивами образуют тело процедуры (подпрограмму). Имя процедуры является фактически меткой первой из команд тела, поэтому данную команду не надо специально метить Прерывания INT. Команда INT прерывает обработку программы, передает управление в DOS или BIOS для определенного действия и затем возвращает управление в прерванную программу для продолжения обработки. Наиболее часто прерывание используется для выполнения операций ввода или вывода. Формат команды INT тип_прерывания Для выхода из программы на обработку прерывания и для последующего возврата команда INT выполняет следующие действия: - уменьшает указатель стека на 2 и заносит в вершину стека содержимое флагового регистра; - очищает флаги TF и IF; - уменьшает указатель стека на 2 и заносит содержимое регистра CS в стек; - уменьшает указатель стека на 2 и заносит в стек значение командного указателя; - вычисляет адрес вектора прерывания, умножая тип_прерывания на 4; загружает второе слово вектора прерываний в регистр CS; загружает в IP первое слово вектора прерывания; -обеспечивает выполнение необходимых действий; - восстанавливает из стека значение регистра и возвращает управление в прерванную программу на команду, следующую после INT.
Практическая часть Лабораторная работа № 1 Тема: Регистры,памяти и логическая адресация Задание: Написать программу “Получение данных из командной строки” на языке Ассемблер 1)Запустил программу MASM32 Editor 2)Написал текст исходного кода .486 .model flat, stdcall optioncasemap: none include/masm32/include/windows.inc include/masm32/include/user32.inc include/masm32/include/kernel32.inc includelib/masm32/lib/user32.lib includelib/masm32/lib/kernel32.lib include/masm32/macros/macros.asm uselib masm32, comctl32, ws2_32 .data .code start: callGetCommandLine push 0 pushchr$("Command Line") pusheax push 0 callMessageBox push 0 callExitProcess endstart
3)Выполнил отладку программы командой project-run program 4)Создал exe-файл
5)Запустил программу OllyDbg.Просмотрел код
Лабораторная работа №2 Тема: Передача параметров через стек
Задание 1: Передача параметров через стек, возврат результата через регистр EAX. 1)Запустил программу MASM32 Editor 2)Написал текст исходного кода .686 .model flat, c optioncasemap: none include\masm32\include\windows.inc include\masm32\include\kernel32.inc includelib\masm32\lib\kernel32.lib .data add 76 b dd-8 ddd? .code program: push b push a call Procedure add esp,8 movd,eax push 0 Procedure proc moveax,[esp+4] movedx,[esp+8] subeax,edx ret Procedureendp endprogram
3)Выполнил отладку программы командой project-run program 4)Создал exe-файл 5)Запустил программу OllyDbg.Просмотрел код
Задание 2: Передача параметров через стек, возврат результат по адресу. 1)Запустил программу MASM32 Editor 2)Написал текст исходного кода .486 .model flat, stdcall optioncasemap:none include/masm32/include/windows.inc include/masm32/include/kernel32.inc includelib/masm32/lib/kernel32.lib .data add 76 b dd-8 ddd? .code program: push offset d push b push a call Procedure addesp, 8 movd,eax push 0 Procedure proc moveax,[esp+4] movedx,[esp+8] subeax,edx movedx,[esp+12] mov [edx],eax ret Procedure endp endprogram
3) Выполнил отладку программы командой project-run program 4)Создал exe-файл
5)Запустил программу OllyDbg.Просмотрел код
Лабораторная работа №3 Тема: Команды обработки данных на языке Ассемблер. Задание: Сложение двух чисел 1)Запустил программу MASM32 Editor 2)Написал текст исходного кода .486 .model flat, stdcall optioncasemap:none include/masm32/include/windows.inc include/masm32/include/user32.inc include/masm32/include/kernel32.inc includelib/masm32/lib/user32.lib includelib/masm32/lib/kernel32.lib include/masm32/macros/macros.asm uselib masm32,comctl32,ws2_32 .data .code start: moveax, 123 movebx, -90 addeax, ebx testeax, eax jz zero invoke MessageBox,0, chr$("Вeaxне 0!"), chr$("info"), 0 jmplexit zero: invokeMessageBox, 0, chr$("Вeax 0!"), chr$("info"), 0 lexit: invokeExitProcess, 0 endstart
3) Выполнил отладку программы командой project-run program 4)Создал exe-файл
5)Запустил программу OllyDbg.Просмотрел код
Лабораторная работа №4 Тема: Применение команд цикла на языке Ассемблер
Задание 1: Организация цикла.Repeat 1)Запустил программу MASM32 Editor 2)Написал текст исходного кода .486 .model flat, stdcall optioncasemap:none include/masm32/include/windows.inc include/masm32/include/user32.inc include/masm32/include/kernel32.inc includelib/masm32/lib/user32.lib includelib/masm32/lib/kernel32.lib include/masm32/macros/macros.asm uselib masm32,comctl32,ws2_32 .data msg_titledb "Title",0 A DB 1h bufferdb 128 dup(?) formatdb "%d",0 .code start: mov AL, A .REPEAT inc AL .UNTIL AL==7 invokewsprintf, addr buffer, addr format, AL invokeMessageBox, 0, addr buffer, addrmsg_title, MB_OK invokeExitProcess, 0 endstart
3) Выполнил отладку программы командой project-run program 4)Создал exe-файл
5)Запустил программу OllyDbg.Просмотрел код
Задание 2: Организация цикла While 1)Запустил программу MASM32 Editor 2)Написал текст исходного кода .486 .model flat, stdcall optioncasemap:none include/masm32/include/windows.inc include/masm32/include/user32.inc include/masm32/include/kernel32.inc includelib/masm32/lib/user32.lib includelib/masm32/lib/kernel32.lib include/masm32/macros/macros.asm uselib masm32,comctl32,ws2_32 .data msg_titledb "Title",0 A DB 1h bufferdb 128 dup(?) formatdb "%d",0 .code start: moveax, 1 movedx, 1 .WHILE edx==1 inceax .IF eax==7 .BREAK .ENDIF .ENDW invokewsprintf, addr buffer, addr format, AL invokeMessageBox, 0, addr buffer, addrmsg_title, MB_OK invokeExitProcess, 0 endstart
3)Выполнил отладку программы командой project-run program 4)Создал exe-файл
5)Запустил программу OllyDbg.Просмотрел код
Лабораторная работа 5 Тема: Программирование действий с массивами данных на языке Ассемблер
Задание: Сумма всех элементов массива 1)Запустил программу MASM32 Editor 2)Написал текст исходного кода .486 .model flat, stdcall option casemap:none include/masm32/include/windows.inc include/masm32/include/user32.inc include/masm32/include/kernel32.inc includelib/masm32/lib/user32.lib includelib/masm32/lib/kernel32.lib include/masm32/macros/macros.asm uselib masm32,comctl32,ws2_32 .data msg_title db "Title",0 A DB 1h x dd 0,1,2,3,4,5,6,7,8,9,10,11 n dd 12 buffer db 128 dup(?) format db "%d", 0 .code start: mov eax, 0 mov ecx, n mov edx, 0 L:add eax, x[ebx] add ebx, type x dec ecx cmp ecx, 0 jne L invoke wsprintf, addr buffer, addr format, AL invoke MessageBox, 0, addr buffer, addr msg_title, MB_OK invoke ExitProcess, 0 end start
3)Выполнил отладку программы командой project-run program 4)Создал exe-файл
5)Запустил программу OllyDbg.Просмотрел код
Лабораторная работа 6 Тема: Особенности работы с процедурами на языке Ассемблер
Задание 1: Передача параметров и возврат из процедуры с использованием соглашения о вызовах stdcall 1)Запустил программу MASM32 Editor 2)Написал текст исходного кода .686 .model flat, stdcall option casemap:none include/masm32/include/windows.inc include/masm32/include/kernel32.inc includelib/masm32/lib/kernel32.lib .data x dd 0 y dd 4 .code program: push y push x call Procedure push 0 call ExitProcess Procedure proc ret 8 Procedure endp end program
3)Выполнил отладку программы командой project-run program 4)Создал exe-файл
5)Запустил программу OllyDbg.Просмотрел код
Задание 2: Передача параметров и возврат из процедуры с использованием соглашения о вызовах cdecl 1)Запустил программу MASM32 Editor 2)Написал текст исходного кода .686 .model flat, с option casemap:none include/masm32/include/windows.inc include/masm32/include/kernel32.inc includelib/masm32/lib/kernel32.lib .data x dd 0 y dd 0 .code program: push y push x call Procedure add esp, 8 push 0 Procedure proc ret Procedure endp end program
3) Выполнил отладку программы командой project-run program 4)Создал exe-файл
5)Запустил программу OllyDbg.Просмотрел код
Задание 3: Рекурсивная процедура вычисления факториала целого беззнакового числа. Процедура получает параметр через стек и возвращает результат через регистр EAX 1)Запустил программу MASM32 Editor 2)Написал текст исходного кода .686 .model flat, c option casemap:none include/masm32/include/windows.inc include/masm32/include/kernel32.inc includelib/masm32/lib/kernel32.lib .data a dd 76 b dd -8 d dd? .code program: push offset d push b push a call factorial add esp, 8 mov d, eax push 0 factorial proc mov eax,[esp+4] test eax,eax jz L1 dec eax push eax call factorial add esp,4 mul dword ptr[esp+4] jmp L2 L1:inc eax L2:ret factorial endp end program 3)Выполнил отладку программы командой project-run program 4)Создал exe-файл
5)Запустил программу OllyDbg.Просмотрел код Лабораторная работа 7 Тема: Работа со строками в языке Ассемблер.
Задание: Расчет формулы на Ассемблере 1)Запустил программу MASM32 Editor 2)Написал текст исходного кода .486 .model flat, stdcall option casemap:none include/masm32/include/windows.inc include/masm32/include/user32.inc include/masm32/include/kernel32.inc includelib/masm32/lib/user32.lib includelib/masm32/lib/kernel32.lib include/masm32/macros/macros.asm uselib masm32,comctl32,ws2_32 .data msg_title db "Title", 0 A DB 1h x dd 0,1,2,3,4,5,6,7,8,9,10,11 n dd 12 buffer db 128 dup(?) format db "%d", 0 .code start: mov eax, 0 mov ecx, n add edx, 0 L:add eax, x[ebx] add ebx, type x dec ecx cmp ec[, 0 jne L invoke wsprintf, addr buffer, addr format, AL invoke MessageBox, 0, addr buffer, addr msg_title, MB_OK invoke ExitProcess, 0 end start
3) Выполнил отладку программы командой project-run program 4)Создал exe-файл
5)Запустил программу OllyDbg.Просмотрел код
Раздел 2.Основы HTML Теоретическая часть Параметр BORDER Параметр BORDER управляет изображением рамки вокруг каждой ячейки, которые, по сути, дают линии сетки таблицы, и вокруг всей таблицы. По умолчанию рамки не рисуются, и на экране пользователь увидит лишь ровно расположенный текст ячеек таблицы. Существует немало ситуаций, когда использование таблиц без рамок вполне оправданно, например, для многоколонных списков, реализованных при помощи таблиц, или задания точного взаимного расположения рисунков и текста. Однако в большинстве случаев для традиционного использования таблиц ее ячейки полезно отделить друг от друга линиями сетки, что облегчает восприятие и понимание информации, содержащейся в таблице. Для добавления в таблицу рамок необходимо включить в код <TABLE> параметр BORDER, который может иметь численное значение. Например, <TABLE BORDER> или <TABLE BORDER=10>. Численное значение параметра определяет толщину рамки в пикселах, рисуемую вокруг всей таблицы, однако на толщину рамок вокруг каждой ячейки это значение не влияет. При отсутствии численного значения обычно оно принимается равным минимальному значению (1), хотя для различных браузеров стиль показа рамок может отличаться. Возможность независимого управления отображением рамки вокруг всей таблицы и рамками вокруг ячеек отсутствует. В спецификации HTML 3.0 не было включено значение для параметра BORDER. Это сделано лишь в HTML 3.2. Так, в частности, ранние версии Microsoft Internet Explorer не разрешали задания численного значения. Отметим, что при отсутствии параметра BORDER рамки не прорисовываются, но место под них оставляется (это относится только к Netscape). Общий размер таблицы при отсутствии параметра BORDER или его наличии не изменяется (исключением является случай задания BORDER=0). Таким образом, минимальное расстояние между двумя соседними ячейками в этих случаях будет равно удвоенной толщине рамки, т. е. двум пикселам. Расположить ячейки как можно ближе друг к другу возможно заданием BORDER=0, что означает отсутствие рамок. Некоторые браузеры могут не поддерживать задание численного значения параметра BORDER, тогда значение, равное нулю, будет проигнорировано, и таблица будет прорисована с рамками. Параметр CELLSPACING Форма записи параметра: CELLSPACING=num, где num — численное значение параметра в пикселах, которое не может быть опущено. Величина num определяет расстояние между смежными ячейками (точнее между рамками ячеек) как по горизонтали, так и по вертикали. По умолчанию значение принимается равным двум. Заметим, что традиционно в издательских системах смежные ячейки таблицы имеют общую границу. В HTML-таблицах по умолчанию между ними оставляется место, что хорошо видно на приведенном выше рисунке. При задании CELLSPACING=0 рамки смежных ячеек сольются и создадут впечатление единой сетки таблицы (рис. 4.7). Параметр CELLPADDING Форма записи параметра аналогична CELLSPACING. Величина num определяет размер свободного пространства (отступа) между рамкой ячейки и данными внутри ячейки. По умолчанию значение принимается равным единице. Установка параметра CELLPADDING равным нулю может привести к тому, что некоторые части текста ячейки могут касаться ее рамки, что выглядит не очень эстетично. Действие параметров CELLPADDING и CELLSPACING очень похоже друг на друга. Для таблицы без рамок изменение того или другого параметра приводит к одному и тому же результату. Оба параметра влияют на соответствующие отступы одновременно по горизонтали и по вертикали. К сожалению, раздельного управления горизонтальными и вертикальными отступами так, как это сделано, например, для отступов от изображений (параметры HSPACE и VSPACE тега <IMG>), не предусмотрено. Все три параметра — BORDER, CELLPADDING и CELLSPACING действуют независимо друг от друга, если какой-нибудь из них опущен, то берется его значение, принятое по умолчанию. В частности, если опущены все перечисленные параметры, то минимальное расстояние между данными из смежных ячеек будет равно 6 пикселам (для Netscape). Это значение складывается из двух пикселов для CELLSPACING, одного пиксела для CELLPADDING и одного пиксела для рамки каждой из ячеек. Наиболее компактная таблица будет получена заданием следующего описания: <TABLE BORDER=0 CELLPADDING=0 CELLSPACING=0> Только в таком варианте ячейки будут расположены вплотную друг к другу. Примером использования может служить таблица, все ячейки которой содержат рисунки одинакового размера, которые необходимо расположить рядом друг с другом. Система охраняемых территорий в США Изучение особо охраняемых природных территорий(ООПТ) США представляет особый интерес по многим причинам... Что делает отдел по эксплуатации и сопровождению ИС? Отвечает за сохранность данных (расписания копирования, копирование и пр.)... ЧТО ТАКОЕ УВЕРЕННОЕ ПОВЕДЕНИЕ В МЕЖЛИЧНОСТНЫХ ОТНОШЕНИЯХ? Исторически существует три основных модели различий, существующих между... Что способствует осуществлению желаний? Стопроцентная, непоколебимая уверенность в своем... Не нашли то, что искали? Воспользуйтесь поиском гугл на сайте:
|