Связь с администрацией сайта:       

demo

Среди толпы я одинок

Глава 10 - команды операций сдвигов

Воскресенье, 05 Ноябрь 2017 00:01
Команды сдвига перемещает все биты в поле данных либо вправо, либо влево, работая либо с байтами, либо со словами. Каждая команда содержит два операнда: первый операнд – поле данных – может быть либо регистром, либо ячейкой памяти; второй операнд – счетчик сдвигов. Его значение может быть равным 1, или быть произвольным. В последнем случае это значение необходимо занести в регистр CL, который указывается в команде сдвига. Число в CL может быть в пределах 0-255, но его практически имеющие смысл значения лежат в пределах 0-16 (0-31).
 
Все арифметические команды устанавливают флаги CF, AF, SF, ZF, OF и PF в зависимости от результат операции. Применяются команды как к 16-ти так и к 32-х разрядным регистрам. Это относится практическик любым командам.
 
Команды арифметического сложения ADD и ADC
Команда ADD выполнят целочисленное сложение двух операндов, представленных в двоичном коде. Результат помещается на место первого операнда, второй операнд не изменяется. Команда корректирует регистр флагов в соответствии с результатом сложения. Существуют две формы сложения: 8-битовое и 16-битовое. В различных формах сложения принимают участие различные регистры. Компилятор следит за тем, чтобы операнды соответствовали друг другу. На следующих рисунках иллюстрируются различные варианты команды ADD. 
 

 

Информация данного и последующих разделов относится к синтаксису и правилам применения команд процессора, её важно знать! Хотя если что то не понятно то ничего страшного - суть будет ясна на практических примерах.
 
Команда MOV
Команда MOV – основная команда пересылки данных, которая пересылает один байт или слово данных из памяти в регистр, из регистра в память или из регистра в регистр. Команда MOV может также занести число (непосредственный операнд) в регистр или память. В действительности команда MOV это целое семейство машинных команд микропроцессора. На приведенном ниже рисунке представлены различные способы, которыми в микропроцессоре можно пересылать данные из одного места в другое. Каждый прямоугольник означает здесь регистр или ячейку памяти. Стрелки показывают пути пересылки данных, которые допускает микропроцессор. Необходимо также помнить, что все команды микропроцессора могут указывать только один операнд памяти.
 
Загрузка и выполнение программ
При загрузке программ в оперативную память DOS (дисковая операционная система) инициализирует как минимум три сегментных регистра: CS, DS и SS. При этом совокупности байтов, представляющих команды процессора (код программы), и данные помещаются из файла на диске в оперативную память, а адреса этих сегментов записываются в CS и DS соответственно. Сегмент стека либо выделяется в области, указанной в программе, либо совпадает (если он явно в программе не описан) с самым первым сегментом программы. Адрес сегмента стека помещается в регистр SS.
Программа может иметь несколько кодовых с егментов и сегментов данных и в процессе выполнения специальными командами выполнять переключения между ними. Для того чтобы адресовать одновременно два сегмента данных, например, при выполнении операции пересылки из одной области памяти в другую, можно использовать регистр дополнительного сегмента ES. Кодовый сегмент и сегмент стека всегда определяются содержимым своих регистров (CS и SS), и поэтому в каждый момент выполнения программы всегда используется какой-то один кодовый сегмент и один сегмент стека.
Причем если переключение кодового сегмента – довольно простая операция, то переключать сегмент стека можно только при условии четкого представления логики работы программы со стеком, иначе это может привести к зависанию системы.
 
Выражения
В языке ассемблера выражения могут быть использованы в инструкциях или директивах и состоят из операндов и операторов. Операнды представляют значения, регистры или адреса ячеек памяти, используемых определенным образом по контексту программы. Операторы выполняют арифметические, логические, побитовые и другие операции над операндами выражений. Ниже даны описания наиболее часто используемых в выражениях операторов.
 

Замечание: по ходу этой главы мне придётся ссылаться на некоторые команды процессора, которые мы разберём в следующих главах.

 

Структура программы

Программа на ассемблере состоит из строк вида:
метка[:] команда/директива операнды ;коментарий
Все данные поля необязательны т.е. строка может быть и пустой! Метка может быть любой комбинацией символов но не должна начинаться с цифры, кроме того не стоит использовать знаки $ и ?. Коментарием может быть всё что угодно. В том случае когда метка располагается перед командой процессора то после неё обязательно надо поставить двоеточие, что указывает ассемблеру создать переменную с именем метки и значением равным адресу команды. Вот например забегая вперёд
loop: lodsw ;читаем слово в еаx
cmp eax,78;если 78 то прекратим
loopne loop

 

Сегментация
Числа, устанавливаемые процессором на адресной шине, являются адресами, то есть номерами ячеек оперативной памяти (ОП). Размер ячейки ОП составляет 8 разрядов, т.е. 1 байт. Поскольку для адресации памяти процессор использует 16-разрядные адресные регистры, то это обеспечивает ему доступ к 65536 (FFFFh) байт или 64К (1К = 1024 байт = 210 байт) основной памяти. Такой блок непосредственно адресуемой памяти называется сегментом. Любой адрес формируется из адреса сегмента (всегда кратен 16, т.е. начинается с границы параграфа) и адреса ячейки внутри сегмента (этот адрес называется смещением). Для адресации большего объема памяти в процессоре 8086 используется специальная процедура пересчета адресов, называемая вычислением абсолютного (эффективного) адреса.
 
Архитектура процессора
Системный блок персонального компьютера содержит: блок питания; системную (материнскую) плату; адаптеры внешних устройств; накопители на жестких магнитных (НЖМД) и гибких (НГМД) дисках, а также ряд других устройств. Для нас наибольший интерес представляет системная плата, на которой размещаются постоянное запоминающее устройство ПЗУ (ROM - read only memory), оперативное запоминающее устройство ОЗУ (RAM - random access memory), процессор и логика управления, связанные между собой шинами.
Физически и ОЗУ и ПЗУ выполнены в виде микросхем. Характерным для персонального компьютера является тот факт, что при выключении электропитания содержимое ОЗУ утрачивается (энергозависимая память), а ПЗУ – нет (энергонезависимая память).
 

Глава 2 - Предварительные сведения

Вторник, 25 Апрель 2017 00:00

Представление данных в ПК

То о чем пойдёт речь в данной главе может показаться довольно скучным однако чтобы программировать на ассемблере следует познакомиться с двоичными и шестнадцатиричными числами. Без понимания того, как на самом деле хранятся данные в памяти ПК невозможно пользоваться битовыми и логическими операциями и многим другим.

 

Введение
Для человека который заинтересовался программированием на ассемблере актуален вопрос - зачем он вообще нужен? Ведь сейчас существует достаточно большое количество эффективных сред программирования - Borland C++ Builder, Delphi, MS Visual Studio....к тому же все пишут на C/C++ Java, C#. Может сложиться впечатление что знание C++ и концепций ООП это признак профессионализма....те кто хоть как то знает технологию MS .NET могут подумать что она ставит крест на ассемблере...однако всё это не совсем так. По моему опыту программирования и общения с другими "программистами" могу сказать что любой человек который относит себя к профессии программиста должен понимать основные концепции работы операционных систем, архитектуру ПК, вобщем то - как вообще выполняются его программы на ПК! В противном случае он будет являтся лишь пользователем (возможно и опытным) тех средств (Delphi, Builder, ....) которые он использует, а не настоящим программистом! В идеале программист это хакер в первоначальном смысле данного слова - оно означает профессионала ДЕТАЛЬНО разбирающегося в своей области. Ну и конечно знание ассемблера приблизит вас к такому профессионализму.