Материал: Основы программирования

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

Основы программирования

Введение

Учебная практика по МДК 01.01 “Системное программирование” и МДК 01.03 “WEB-программирование” предназначена для закрепления теоретических знаний, практических навыков и умений в разработке программ на языке Ассемблер и на языке HTML 5.0 соответственно.

Программирование - это процесс составления и подготовки деятельности программы, которое при выполнении должно привести к определённым результатам.

Машинный код - система команд конкретной вычислительной машины (процессора), которая интерпретируется непосредственно процессором. Команда, как правило, представляет собой целое число, которое записывается в регистр процессора. Процессор читает это число и выполняет операцию, которая соответствует этой команде. Язык программирования низкого уровня (низкоуровневый язык программирования) - это язык программирования, максимально приближенный к программированию в машинных кодах. В отличие от машинных кодов, в языке низкого уровня каждой команде соответствует не число, а сокращенное название команды (мнемоника). Например, команда ADD - это сокращение от слова ADDITION (сложение). Поэтому использование языка низкого уровня существенно упрощает написание и чтение программ (по сравнению с программированием в машинных кодах).

Язык ассемблера - это машинно-зависимый язык низкого уровня, в котором короткие мнемонические имена соответствуют отдельным машинным командам. Используется для представления в удобочитаемой форме программ, записанных в машинном коде.

Язык ассемблера помогает раскрыть все секреты аппаратного и программного обеспечения. С его помощью можно получить представление о том, как аппаратная часть взаимодействует с операционной системой и как прикладные программы обращаются к операционной системе. Большинство программистов работают с языками высокого уровня, где отдельное утверждение преобразовывается во множество процессорных команд. Ассемблер язык машинного уровня; каждая команда непосредственно интерпретируется в машинный код, что дает основание считать его языком низкого уровня. Наиболее часто язык ассемблера используется для написания дополнений к операционной системе или для написания программ прямого доступа к аппаратуре. Он необходим также при оптимизации критических блоков в прикладных программах с целью повышения их быстродействия.(от англ. Hyper Text Markup Language - «язык гипертекстовой разметки») - стандартный язык разметки документов во Всемирной паутине. Большинство веб-страниц содержат описание разметки на языке HTML (или XHTML). Язык HTML интерпретируется браузерами; полученный в результате интерпретации форматированный текст отображается на экране монитора компьютера или мобильного устройства.- теговый язык разметки документов. Любой документ на языке HTML представляет собой набор элементов, причём начало и конец каждого элемента обозначается специальными пометками - тегами. Элементы могут быть пустыми, то есть не содержащими никакого текста и других данных (например, тег перевода строки<br>). В этом случае обычно не указывается закрывающий тег. Кроме того, элементы могут иметь атрибуты, определяющие какие-либо их свойства (например, размер шрифта для элементаfont). Атрибуты указываются в открывающем теге.страницы - это документы в формате HTML, содержащие текст и специальные тэги (дескрипторы) HTML. По большому счету тэги HTML необходимы для форматирования текста (т.е. придания ему нужного вида), который "понимает" браузер. Документы HTML хранятся в виде файлов с расширением .htm или .html.

1.Основы работы в ассемблере

.1 Теоретическая часть

.1.1 Основные понятия

Ассемблер - транслятор исходного текста программы, написанной на языке ассемблера, в программу на машинном языке.

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

Ассемблирование может быть не первым и не последним этапом на пути получения исполнимого модуля программы. Так, многие компиляторы с языков программирования высокого уровня выдают результат в виде программы на языке ассемблера, которую в дальнейшем обрабатывает ассемблер. Также результатом ассемблирования может быть не исполнимый, а объектный модуль, содержащий разрозненные блоки машинного кода и данных программы, из которого (или из нескольких объектных модулей) в дальнейшем с помощью редактора связей может быть получен исполнительный файл.

Переносимые ассемблеры

Также существует открытый проект ассемблера, версии которого доступны под различные операционные системы, и который позволяет получать объектные файлы для этих систем. Называется этот ассемблер NASM(Netwide Assembler).

YASM- это переписанная с нуля версия NASM под лицензией BSD (с некоторыми исключениями).

Flat asembler (fasm) - молодой ассемблер под модифицированной для запрета перелицензирования (в том числе под GNU GPL BSD-лицензией. Есть версии для KolibriOS,Linux,DOS и Windows; использует Intel-синтаксиз и поддерживает инструкции x86-64.

1.1.2 Регистры ЦП

Для выполнения арифметических действий, пересылки данных и адресации, компьютер имеет ряд регистров. Регистр - это область памяти для временного хранения данных. По назначению различают:

Аккумуляторы - хранение промежуточных результатов арифметических и логических операций, инструкций ввода-вывода.

Флаговые - хранение признаков результатов арифметических и логических операций.

Общего назначения - хранение операндов арифметических и логических выражений, индексы, адреса.

Индексные - индексы исходящих и целевых элементов массива.

Указательные - указатели на специальные области памяти, указатели текущей операции, указатели базы, указатели стека.

Сегментные - адреса и селекторы сегментов памяти.

Управляющие - информация управляющая состоянием процессора, адреса системных таблиц.

Регистры общего назначения

ЕАХ (Accumulator) - хранение промежуточных данных(Base) - хранение базового адреса(Counter) - регистр-счетчик применяется в командах, производящих некоторые повторяющееся действия, его использование за частую не явно - скрыто в алгоритме работы команды.(Data)-хранение промежуточных данных. Данные Регистры являются 32-разрядными и делятся на две части по 16 бит, старшая часть - не доступна, а младшая тоже делится на две части по 8 бит.

Регистры указателии EDI-индексы источника и приемника, используются при обработке длинных полей.и ESP-указатели базы и вершины, используются при работе со стеком. Эти регистры также 32-разрядные и имеют младшие 16-ти разрядные части SI, DI, BP, SP соответственно.

Сегментные регистры

Структура программы разделена на блоки - сегменты, выделяют следующие типы сегментов:

Сегмент кода содержит команды программы, адрес сегмента кода с которым в настоящий момент работает программа располагается в сегментном регистре сs.

Сегмент данных содержит данные, которыми оперирует программа. Программа одновременно может работать с несколькими сегментами данных. Адрес основного сегмента данных располагается в регистре ds, а дополнительных - в es, gs, fs.

Сегмент стека - специальная область памяти, ее адрес располагаться в регистре ss.

Сегментные регистры являются 16-разрядными.

Регистр указателя инструкций

EIP-32

IP -16

Содержит смещение следующей подлежащей выполнению команды относительно начала сегмента кода. После выполнения команды меняется автоматически.

Полный адрес команды формирует пара регистров CS:IP.

Регистр флагов

EFLAGS-32

FLAGS -16

Биты этих регистров называются флагами.

Различают флаги состояния, управляющие, системные и зарезервированные флаги.

Рис. 1

Флаг переноса CF

(Carry Flag) идентифицирует перенос или заем при выполнении арифметических операций, а также служит индикатором ошибки при обращении к системным функциям.

Флаг паритета PF

(Parity Flag) устанавливается в 1, если младшие 8 бит результата операции содержат четное число двоичных единиц.

Флаг вспомогательного переноса AF

(Auxiliary Flag) используется в операциях над упакованными двоично-десятичными числами.

Он идентифицирует перенос или заем из старшей тетрады (бита 4).

Флаг нуля ZF

(ZeroFlag) устанавливается в 1, если результат операции равен нулю.

Флаг знака SF

(SignFlag) показывает знак результата операции, устанавливаясь в 1 при отрицательном результате.

Флаг переполнения OF

(OverflowFlag) фиксирует переполнение, т.е. выход результата операции за пределы допустимого для данного процессора диапазона значений. Флаги состояния автоматически устанавливаются процессором после выполнения каждой команды.

Управляющий флаг трассировки TF

(TraceFlag) используется в отладчиках для осуществления пошагового выполнения программы. Если TF = 1, то после выполнения каждой команды процессор реализует процедуру прерывания 1 (через вектор прерывания с номером 1).

Управляющий флаг разрешения прерываний IF

(InterruptFlag) разрешает (если равен 1) или запрещает (если равен 0) процессору реагировать на прерывания от внешних устройств.

Управляющий флаг направления DF

(DirectionFlag) используется особой группой команд, предназначенных для обработки строк. Если DF = 0, строка обрабатывается в прямом направлении, от меньших адресов к большим; если DF = 1, обработка строки идет в обратном направлении.

1.1.3 Команды

Команды пересылки данных. Команды пересылки данных осуществляют обмен данными и адресами между ячейками памяти и регистрами или портами ввода-вывода.

Эти команды разделены на четыре группы:

ü  команды общего назначения,

ü  команды ввода-вывода,

ü  и команды пересылки флагов.

Основная команда общего назначения MOV (MOVe - переслать) может переслать байт или слово между регистром и ячейкой памяти или между двумя регистрами. Она может также переслать непосредственно адресуемое значение в регистр или ячейку памяти.

Команда MOV имеет следующий формат: MOV приемник, источник.

Команды работы со стеком. Для временного сохранения данных (содержимого регистра или ячейки памяти) удобно использовать стек.

Для работы со стеком есть две команды(поместить слово в стек) и POP (извлечь слово из стека). Команда PUSH помещает содержимое регистра или ячейки памяти размером в слово на вершину стека. Команда POP, наоборот, снимает слово с вершины стека и помещает его в регистр или ячейку памяти.

Команды PUSH и POP имеют следующие форматы:источникприемник.

Будучи взаимно обратными командами, PUSH и POP обычно используются парами, т.е. каждой команде PUSH в программе должна соответствовать команда POP.

Вершина стека - это ячейка в сегменте стека, адрес которой содержится в указателе стека SP.

Регистр SP всегда указывает на слово, помещенное в стек последним.

Следовательно, команда PUSH вычитает 2 из значения указателя стека, а затем пересылает операнд-источник в стек.

Команды ввода-вывода. Команды ввода-вывода используются для взаимодействия с периферийными устройствами системы.

Они имеют формат:аккумулятор, порт OUT порт, аккумулятор

Где аккумулятор - регистр AL при обмене байтами или регистр AX при обмене словами. Операндом порт может быть десятичное число от 0 до 255, что позволяет адресоваться к 256 устройствам.

Команды пересылки адреса. Команды пересылки адреса передает не содержимое переменных, а их адреса.

Команда LEA (load effective address - загрузить эффективный адрес) пересылает смещение ячейки памяти в любой 16-битовый регистр общего назначения, регистр указателя или индексный регистр.

Она имеет формат: LEA регистр16,память16

Где операнд память16 должен иметь атрибут WORD.

Сложение и вычитание. Для сложения и вычитания используются инструкции ADD и SUB. ADD прибавляет содержимое операнда- источника (правый) к содержимому операнда приемнике и сохраняет результат в операнде приемнике.работает так же, за исключением того, что он вычитает операнд источника из операнда приемника.

Команды приращения и уменьшения приемника на единицу. Когда ассемблерной программе требуется производить сложение, хорошо, если добавляемое значение это 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.устанавливая каждый бит в назначении в 1 только тогда, когда соответствующие биты источников - 1

Инструкция OR устанавливая каждый бит в назначении в 1 если хотя бы 1 соответствующий исходный бит установлен в 1. OR позволяет Вам устанавливать исходный бит(ы) в 1.

Инструкция устанавливая каждый бит назначения в 1, только если 1 из соответствующих битов источника был 0, а другой 1

Сдвиги и циклические сдвиги. Микропроцессор Intel обеспечивает ряд способов для передвижения битов в регистре или переменной памяти вправо или влево.

Простейший из них - логический сдвиг. SHL (сдвиг влево, так же известный как SAL) передвигает каждый бит в назначении на 1 разряд влево или в направлении к старшему значащему биту.

Умножение при помощи сдвига много быстрее, чем использование инструкции MUL.(сдвиг вправо) во многом подобен SHL: он сдвигает биты операнда вправо, либо на 1, либо на CL бит, при этом младший значащий бит сдвигается во флаг переноса, а старший значащий бит устанавливается в 0.- это быстрый способ беззнакового деления на 2.- арифметический сдвиг вправо, такой же как SHR, за исключением того, что в SAR старший значащий бит операнда сдвигается вправо на следующий бит и затем возвращается в самого себя.