Студопедия.Орг Главная | Случайная страница | Контакты | Мы поможем в написании вашей работы!  
 

Setver. Exe exe2bin. Exe 6. 22



Отметим также, что в последних версиях операционной системы Windows в папке Windows/System32находится программа EXE2BIN.EXE. В этом случае можно воспользоваться ею и не обновлять таблицу версий.

1.4 Регистры модели X86.

Регистры архитектуры x86

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

Пользовательские регистры

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

восемь 32-битных регистров, которые могут использоваться программистами для хранения данных и адресов (их еще называют регистрами общего назначения (РОН)):

1 eax/ax/ah/al;

2 ebx/bx/bh/bl;

3 edx/dx/dh/dl;

4 ecx/cx/ch/cl;

5 ebp/bp;

6 esi/si;

7 edi/di;

8 esp/sp.

9 шесть регистров сегментов: cs, ds, ss, es, fs, gs;

10 регистры состояния и управления:

11 регистр флагов eflags/flags;

12 регистр указателя команды eip/ip.

13 регистры сопроцессора x87 и расширения MMX

14 регистры расширения XMM

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

Все регистры этой группы позволяют обращаться к своим младшим частям. Для самостоятельной адресации можно использовать только младшие 16 и 8-битные части этих регистров. Старшие 16 бит этих регистров как самостоятельные объекты недоступны. Это сделано, для совместимости с младшими 16-разрядными моделями микропроцессоров фирмы Intel.

Перечислим регистры, относящиеся к группе регистров общего назначения.

· eax/ax/ah/al (Accumulator register) - аккумулятор.

Применяется для хранения промежуточных данных. В некоторых командах использование этого регистра обязательно;

· ebx/bx/bh/bl (Base register) - базовый регистр.

Часто применяется для хранения базового адреса некоторого объекта в памяти;

· ecx/cx/ch/cl (Count register) - регистр-счетчик.

Применяется в командах, производящих некоторые повторяющиеся действия. Его использование зачастую неявно и скрыто в алгоритме работы соответствующей команды. К примеру, команда организации цикла loop кроме передачи управления команде, находящейся по некоторому адресу, анализирует и уменьшает на единицу значение регистра ecx/cx;

· edx/dx/dh/dl (Data register) - регистр данных.

Так же, как и регистр eax/ax/ah/al, он хранит промежуточные данные. В некоторых командах его использование обязательно; для некоторых команд это происходит неявно.

Следующие два регистра используются для поддержки так называемых строковых операций, то есть операций, производящих последовательную обработку строк элементов, каждый из которых может иметь длину 32, 16 или 8 бит:

· esi/si (Source Index register) - индекс источника.

Этот регистр в цепочечных операциях содержит текущий адрес элемента в строке-источнике;

· edi/di (Destination Index register) - индекс приемника (получателя).

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

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

· esp/sp (Stack Pointer register) - регистр указателя стека.

· Содержит указатель вершины стека в текущем сегменте стека.

· ebp/bp (Base Pointer register) - регистр указателя базы кадра стека.

Предназначен для организации произвольного доступа к данным внутри стека. Часто регистр bp/ebp хранит адрес начала локальных переменных текущей подпрограммы.

Все регистры общего назначения (кроме esp) могут использоваться при программировании для хранения операндов практически в любых сочетаниях. Но некоторые команды используют фиксированные регистры для выполнения своих действий. Использование жесткого закрепления регистров для некоторых команд позволяет более компактно кодировать их машинное представление.

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

В программной модели микропроцессора имеется шесть сегментных регистров: cs, ss, ds, es, gs, fs. Их существование обусловлено спецификой организации и использования оперативной памяти микропроцессорами Intel. Она заключается в том, что микропроцессор аппаратно поддерживает структурную организацию программы в виде трех частей, называемых сегментами. Соответственно, такая организация памяти называется сегментной.

Для того чтобы указать на сегменты, к которым программа имеет доступ в конкретный момент времени, и предназначены сегментные регистры. Фактически, с небольшой поправкой, в этих регистрах содержатся адреса памяти, с которых начинаются соответствующие сегменты. Логика обработки машинной команды построена так, что при выборке команды, доступе к данным программы или к стеку неявно используются адреса во вполне определенных сегментных регистрах. Микропроцессор поддерживает следующие типы сегментов:

1. Сегмент кода. Содержит команды программы.

Для доступа к этому сегменту служит регистр cs (code segment register) - сегментный регистр кода. Он содержит адрес сегмента с машинными командами, к которому имеет доступ процессор (то есть эти команды загружаются в конвейер микропроцессора).

2. Сегмент данных. Содержит обрабатываемые программой данные.

Для доступа к этому сегменту служит регистр ds (data segment register) - сегментный регистр данных, который хранит адрес сегмента данных текущей программы.

3. Сегмент стека. Этот сегмент представляет собой область памяти, называемую стеком.

Работу со стеком микропроцессор организует по следующему принципу: последний записанный в эту область элемент выбирается первым. Для доступа к этому сегменту служит регистр ss (stack segment register) - сегментный регистр стека, содержащий адрес сегмента стека.

4. Дополнительный сегмент данных.

Большинство машинных команд предполагают, что обрабатываемые ими данные расположены в сегменте данных, адрес которого находится в регистре ds.

Если программе недостаточно одного сегмента данных, то она имеет возможность использовать еще три дополнительных сегмента данных. Но в отличие от основного сегмента данных, адрес которого содержится в сегментном регистре ds, при использовании дополнительных сегментов данных их адреса требуется указывать явно с помощью специальных префиксов переопределения сегментов в команде. Адреса дополнительных сегментов данных должны содержаться в регистрах es, gs, fs (extension data segment registers).

Регистры состояния и управления

В микропроцессор включены несколько регистров, которые постоянно содержат информацию о состоянии как самого микропроцессора, так и программы, команды которой в данный момент загружены на конвейер. К этим регистрам относятся:

· регистр флагов eflags/flags;

· регистр указателя команды eip/ip.

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

eflags/flags (flag register) - регистр флагов. Разрядность eflags/flags - 32/16 бит. Отдельные биты данного регистра имеют определенное функциональное назначение и называются флагами. Младшая часть этого регистра полностью аналогична регистру flags для микропроцессора i8086.

Исходя из особенностей использования, флаги регистра eflags/flags можно разделить на три группы:

· 8 флагов состояния. Эти флаги могут изменяться после выполнения машинных команд.

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

· 1 флаг направления. Обозначается df (Directory Flag).

Он находится в 10-м бите регистра eflags и используется цепочечными командами. Значение флага df определяет направление поэлементной обработки в этих операциях: от начала строки к концу (df = 0) либо наоборот, от конца строки к ее началу (df = 1);

Для работы с флагом df существуют специальные команды: cld (снять флаг df) и std (установить флаг df).

Применение этих команд позволяет привести флаг df в соответствие с алгоритмом и обеспечить автоматическое увеличение или уменьшение счетчиков при выполнении операций со строками;

· 5 системных флагов, управляющих вводом/выводом, маскируемыми прерываниями, отладкой, переключением между задачами и виртуальным режимом 8086.

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

eip/ip (Instraction Pointer register) ≈ регистр-указатель команд.

Регистр eip/ip имеет разрядность 32/16 бит и содержит смещение следующей подлежащей выполнению команды относительно содержимого сегментного регистра cs в текущем сегменте команд. Этот регистр непосредственно недоступен программисту, но загрузка и изменение его значения производятся различными командами управления, к которым относятся команды условных и безусловных переходов, вызова процедур и возврата из процедур. Возникновение прерываний также приводит к модификации регистра eip/ip.

1.5 Организация цикла

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

Для начала давайте разберёмся, как организуются ветвления и что это такое. Ветвление - это такое место в программе, после которого в зависимости от какого либо условия может начать выполняться тот или иной код. То есть, счетчик команд в результате выполнения команды ветвления может быть установлен по двум различным адресам, в зависимости от исхода проверки какого-либо условия.

Рис.1

Для организации ветвлений в pic-контроллерах можно использовать 4 команды: две оперирующие с байтами (decfsz, incfsz) и две оперирующие с битами (btfsc, btfss). Работают эти команды следующим образом:

decfsz f,d - вычесть 1 из регистра f, если результат =0, то пропустить следующую команду (d определяет, куда сохранять результат. Если d=0 - результат сохраняется в аккумуляторе W, если d=1 - результат сохраняется в регистре f)

incfsz f,d - добавить 1 к регистру f, если результат =0, то пропустить следующую команду

btfsc f,b - проверить бит b в регистре f, если он =0, то пропустить следующую команду

btfss f,b - проверить бит b в регистре f, если он =1, то пропустить следующую команду

Эти команды эквивалентны следующим алгоритмам:

Рис.2

Как видите, все перечисленные команды позволяют установить счётчик команд либо на следующий адрес, либо через один.

Как же организовать полноценное ветвление, такое как на рисунке 1? Это делается очень просто. Для этого дополнительно используется команда безусловного перехода goto. В итоге алгоритмы приобретают вот такой вид (эквивалентный алгоритму на рисунке 1):

Рис.3

Если провести аналогию с языками высокого уровня, то эти конструкции можно сравнить с конструкциями вида if then else и им подобными.

Может сложиться впечатление, что число условий для организации ветвлений очень ограничено (проверки на ноль содержимого регистра в результате сложения или вычитания + проверки отдельного бита в регистре). На самом деле нужно понимать, что информация в контроллере представлена битами и байтами и в любом случае все ваши действия отражаются в памяти контроллера изменением каких-либо битов или байтов, равно как и любое условие сводится к проверке каких-либо битов или байтов. Например, большинство логических и арифметических команд в процессе выполнения изменяют флаги регистра специального назначения STATUS, о настройках модулей контроллера и результатах их работы также сигнализируют различные биты в специальных регистрах. Значения всех этих битов могут использоваться в качестве условий для организации ветвлений.

Например, мы хотим проверить, равны ли между собой значения в двух регистрах А и В. Если равны, то пусть программа выполняется дальше, если нет - пусть счётчик команд устанавливается на адрес Y и программа продолжает выполняться с этого адреса.

Для реализации такого алгоритма можно воспользоваться, например, командой xor, которая изменяет флаг Z. Если А=В, то результат побитного исключающего ИЛИ между этими регистрами будет равен нулю и флаг Z в регистре STATUS установится в единицу:

Рис.4

Теперь давайте поговорим о циклах. Собственно, циклы - это повторение одного и того же участка кода заданное количество раз. В ассемблере для организации циклов нет специальных команд, подобных операторам for to, while do и прочим операторам языков высокого уровня. Давайте разберёмся почему.

Как вообще организуются циклы? Есть какое-то условие, при выполнении которого цикл заканчивается. Один из аргументов этого условия (или даже оба аргумента) в процессе выполнения цикла может изменяться. Если условие не выполнено, то цикл повторяется. Как только условие выполнится, счётчик команд устанавливается на адрес первой команды, следующей за командами цикла.

Циклы бывают двух типов: с предпроверкой (или ещё говорят с предусловием), когда проверка условия происходит в начале цикла, и с постпроверкой (или по-другому - с постусловием), когда проверка условия происходит в конце цикла.

рис.5

Ничего не напоминает? Обычное ветвление и ничего особенного, только один из переходов осуществляется назад, к тому коду, который мы уже выполняли. Такой алгоритм легко можно организовать с помощью описанных выше команд. Например, вот так:

рис.6

 

Ну что ж, надеюсь, с тем, как составлять алгоритмы и писать программы на ассемблере, вы разобрались, компилировать программы в среде MPLab тоже уже умеете, осталось только залить полученную после компиляции прошивку в контроллер.

1.6 Условный и безусловный переход

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

jmp metka;Переход на метку jmp bx;Переход по адресу в BX jmp word[bx];Переход по адресу, содержащемуся в памяти по адресу в BX

Условный переход осуществляется, если выполняется определённое условие, заданное флагами процессора (кроме одной команды, которая проверяет CX на равенство нулю). Как вы помните, состояние флагов изменяется после выполнения арифметических, логических и некоторых других команд. Если условие не выполняется, то управление переходит к следующей команде.

Существует много команд для различных условных переходов. Также для некоторых команд есть синонимы (например, JZ и JE — это одно и то же). Для наглядности все команды условных переходов приведены в таблице:

Команда Переход, если Условие перехода
JZ/JE нуль или равно ZF=1
JNZ/JNE не нуль или не равно ZF=0
JC/JNAE/JB есть переполнение/не выше и не равно/ниже CF=1
JNC/JAE/JNB нет переполнения/выше или равно/не ниже CF=0
JP число единичных бит чётное PF=1
JNP число единичных бит нечётное PF=0
JS знак равен 1 SF=1
JNS знак равен 0 SF=0
JO есть переполнение OF=1
JNO нет переполнения OF=0
JA/JNBE выше/не ниже и не равно CF=0 и ZF=0
JNA/JBE не выше/ниже или равно CF=1 или ZF=1
JG/JNLE больше/не меньше и не равно ZF=0 и SF=OF
JGE/JNL больше или равно/не меньше SF=OF
JL/JNGE меньше/не больше и не равно SF≠OF
JLE/JNG меньше или равно/не больше ZF=1 или SF≠OF
JCXZ содержимое CX равно нулю CX=0

У всех этих команд один операнд — имя метки для перехода. Обратите внимание, что некоторые команды применяются для беззнаковых чисел, а другие — для чисел со знаком. Сравнения «выше» и «ниже» относятся к беззнаковым числам, а «больше» и «меньше» — к числам со знаком. Для беззнаковых чисел признаком переполнения будет флаг CF, а соответствующими командами перехода JC и JNC. Для чисел со знаком о переполнении можно судить по состоянию флага OF, поэтому им соответствуют команды перехода JO и JNO. Команды переходов не изменяют значения флагов.

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

  use16;Генерировать 16-битный код org 100h;Программа начинается с адреса 100h   mov al,[x];AL = x add al,[y];AL = x + y jo error;Переход, если переполнение mov ah,09h;\ mov dx,ok_msg; > Вывод строки 'OK' int 21h;/ exit: mov ah,09h;\ mov dx,pak; > Вывод строки 'Press any key...' int 21h;/   mov ah,08h;\ int 21h;/ Ввод символа   mov ax,4C00h;\ int 21h;/ Завершение программы error: mov ah,09h;\ mov dx,err_msg; > Вывод сообщения об ошибке int 21h;/ jmp exit;Переход на метку exit ;---------------------------------------------------------- x db -89 y db -55 err_msg db 'Error: overflow detected.',13,10,'$' ok_msg db 'OK',13,10,'$' pak db 'Press any key...$'

1.7 Особенности работы с графикой

Для отображения несложной графики используется GDI (graphics device interface). Особенности GDI - простота использования и низкая скорость, что делает его пригодным, в основном, для создания нестандартных элементов интерфейса и приложений со "слабой" графикой.

Для создания изображений часто применяются команды FPU и SIMD инструкции (MMX;XMM;3DNow!), поэтому изложенные материалы о GDI будут использоваться в следующих главах для наглядного изучения дополнительных инструкций процессора.

Основное понятие GDI - это Device Context -DC. - Представляет из себя набор свойств среды рисования: изображение, используемые шрифты, цвета и т.д.

Для того, чтобы добавить/заменить в DC какой-либо элемент, нужно создать его, а после использовать функцию SelectObject. Рисование производится на объекте типа Bitmap.

Цвета, передаваемые функциям GDI - RGB: байт #0 определяет уровень красного цвета, #1 - зеленого, #2 - синего, и #3=0

Чаще всего GDI используется для отображения графики в окне.

При необходимости обновить часть изображения окна, Windows добавляет этот регион в т.н Update Region и, позже, посылает сообщение WM_PAINT. Обработчик сообщения обычно вызывает функцию BeginPaint, возвращающую хэндл DC клиент - части окна, с установленным clipping region'ом равным update region'у. Т.е рисование будет происходить только в части окна, необходимой для обновления. Это сделано для избежание мерцания при рисовании. Далее Update Region очищается и следующее сообщение WM_PAINT произойдет только при следующей необходимости прорисовки изображения. В случае надобности перерисовки всего клиент - содержимого окна кроме WM_PAINT посылается также WM_ERASEBKGND, а для обновления не клиент - части - WM_NCPAINT.

Для добавления части/всего окна в update region используются функции InvalidateRect/ InvalidateRgn. Автоматическое добавление происходит при смене размера окна, удаления перекрытия другими окнами и т.д.

Можно получить DC окна функциями GetDC, GetWindowDC, и вывести изображение, но при появлении update region'а оно будет не действительным. Эти ф-ции не влияют и не зависят от Update Region'а

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

Можно создать DC, существующее только в памяти и не отображаемое на экране - Memory DC, вызвав функцию CreateCompatibleDC. Memory DC чаще всего используется для:

• Избежание мерцания (Flicker) изображения при прорисовке.

Мерцание происходит если пользователь видит процесс создания изображения, при прорисовке перекрывающихся элементов т.к графика, выводимая в DC окна, сразу же отображается. Для устранения мерцания можно использовать объекты типа Region, но чаще создается DC в памяти, на котором происходит рисование, а по завершению процесса создания изображения производится копирование из Memory DC в DC окна (обычно функцией BitBlt).

Объект Bitmap в таких случаях можно создать ф-цией CreateCompatibleBitmap

• Рисование изображения для последующих манипуляций с данными изображения. В таком случае объект Bitmap обычно создается функцией CreateDIBSection что позволяет иметь непосредственный доступ (чтение/запись) к массиву точек изображения. Функции рисования в DC также влияют на массив точек изображения в памяти. Такое изображение можно легко сохранить в.bmp файл, записав сначала структуру BITMAPFILEHEADER, за ней BITMAPINFOHEADER, далее палитру (если есть), и массив точек изображения (с выравниванием строк на dword)

2 СПЕЦИАЛЬНАЯ ЧАСТЬ

2.1 Постановка задачи №1

Нарисовать 2 треугольника разных цветов.

2.1.1 Выходные данные программы №1

2.1.2 Листинг программы №1

Dosseg; Директива задает

;Расположение сегментов в памяти

.model small;директива описание модели памяти

.stack 100h;директива определяет размерность стека

.code;директива,отмечаю начало

;расположение информации в сегменте

;Кода.

mov ah,06h;Функция установки окна на экране.

mov bh,70h;цвет окна и символа

mov ch,0;левая врехняя координата y

mov cl,0;левая верхняя координата x

mov dh,4;правая нижняя координата y

mov dl,79;правая нижняя координата x

int 10h;прерывания,по которому управлению

;передается BIOS для выполнения

;вышеназванной функции.

xor ax,ax;обнуление регистра ах

mov ah,06h;Функция установки окна на экране.

mov bh,90h;цвет окна и символа

mov ch,4;левая врехняя координата y

mov cl,0;левая верхняя координата x

mov dh,8;правая нижняя координата y

mov dl,79;правая нижняя координата x

int 10h;прерывания,по которому управлению

xor ax,ax;обнуление регистра ах

mov ah,06h;Функция установки окна на экране.

mov bh,60h;цвет окна и символа

mov ch,8;левая врехняя координата y

mov cl,0;левая верхняя координата x

mov dh,12;правая нижняя координата y

mov dl,79;правая нижняя координата x

int 10h;прерывания,по которому управлению

xor ax,ax;обнуление регистра ах

mov ah,06h;Функция установки окна на экране.

mov bh,40h;цвет окна и символа

mov ch,12;левая врехняя координата y

mov cl,0;левая верхняя координата x

mov dh,16;правая нижняя координата y

mov dl,79;правая нижняя координата x

int 10h;прерывания,по которому управлению

xor ax,ax;обнуление регистра ах

mov ah,06h;Функция установки окна на экране.

mov bh,30h;цвет окна и символа

mov ch,16;левая верхняя координата y

mov cl,0;левая верхняя координата х

mov dh,22;правая нижняя координата y

mov dl,79;правая нижняя координата x

int 10h;прерывания, по которому управлению

xor ax,ax;обнуление регистра ах

mov ah,06h;Функция установки окна на экране.

mov bh,10h;цвет окна и символа

mov ch,22;левая врехняя координата y

mov cl,0;левая врехняя координата x

mov dh,26;правая нижняя координата y

mov dl,79;правая нижняя координата x

int 10h;прерывания, по которому управлению

xor ax,ax;обнуление регистра ах

mov ah,06h;Функция установки окна на экране

mov bh,24;цвет окна и символа

mov ch,22;левая верхняя координата y

mov cl,0;левая верхняя координата x

mov dh,32;правая нижняя координата y

mov dl,79;правая нижняя координата x

int 10h;прерывания, по которому управлению

mov ah,01h;приостановка программы до нажатия любой

int 21h;клавиши

mov ah,4ch;функция ДОС завершения программы.

int 21h;прерывания по которому происходит

;передача управления ОС для выполнения

; ранее объявленной функции.

end;директива завершения программы на ассемблер

2.2 Постановка задачи №2

Нарисовать 4 треугольника разных цветов.

2.2.1 Выходные данные программы №2

2.2.2 Листинг программы №2

Dosseg; Директива задает

;Расположение сегментов в памяти

.model small;директива описание модели памяти

.code;директива, отмечаю начало

;расположение информации в сегменте

;Кода.

mov ah,06h;Функция установки окна на экране.

mov bh,70h;цвет окна и символа

mov ch,0;левая врехняя координата y

mov cl,79;левая верхняя координата x

mov dh,0;правая нижняя координата y

mov dl,79;правая нижняя координата y

int 10h;прерывания,по которому управлению

;передается BIOS для выполнения

;вышеназванной функции.

;передается BIOS для выполнения

;вышеназванной функции.

xor ax,ax;обнуление регистра ах

mov ah,06h;Функция установки окна на экране.

mov bh,52h;цвет окна и символа

mov ch,4;левая врехняя координата y

mov cl,79;левая верхняя координата x

mov dh,4;правая нижняя координата y

mov dl,79;правая нижняя координата x

int 10h;прерывания,по которому управлению

xor ax,ax;обнуление регистра ах

mov ah,06h;Функция установки окна на экране.

mov bh,20h60h;цвет окна и символа

mov ch,8;левая врехняя координата y

mov cl,79;левая верхняя координата x

mov dh,8;правая нижняя координата y

mov dl,79;правая нижняя координата y

int 10h;прерывания,по которому управлению

xor ax,ax;обнуление регистра ах

mov ah,06h;Функция установки окна на экране.

mov bh,80h;цвет окна и символа

mov ch,12;левая врехняя координата y

mov cl,79;левая верхняя координата x

mov dh,12;правая нижняя координата y

mov dl,79;правая нижняя координата x

int 10h;прерывания,по которому управлению

xor ax,ax;обнуление регистра ах

mov ah,06h;Функция установки окна на экране.

mov bh,10h;цвет окна и символа

mov ch,16;левая верхняя координата y

mov cl,79;левая верхняя координата х

mov dh,16;правая нижняя координата y

mov dl,79;правая нижняя координата x

int 10h;прерывания, по которому управлению

xor ax,ax;обнуление регистра ах

mov ah,06h;Функция установки окна на экране.

mov bh,71h;Функция установки окна на экране.

mov ch,20;левая врехняя координата y

mov cl,79;левая врехняя координата x

mov dh,20;правая нижняя координата y

mov dl,79;правая нижняя координата x

int 10h;прерывания, по которому управлению

mov ah,01h;функция ДОС завершения программы.

int 21h;прерывания по которому происходит

mov ah,4ch;передача управления ОС для выполнения

int 21h;передача управления ОС для выполнения

end;директива завершения программы на ассемблер

2.3 Постановка задачи №3

Решить пример (a+b-c)/d

2.3.1 Выходные данные программы №3

2.3.2 Листинг программы №3

Dosseg; Директива задает

;Расположение сегментов в памяти

.model small;Расположение сегментов в памяти

.stack 100h;директива определяет размерность стека

.data;директива отмечает начало

;расположения информации в сегменте

;данных

start dw' ';Запуск строки

a dw 5;присваеваем переменной a значение5

b dw 2;присваеваем переменной b значение2

c dw 2;присваеваем переменной c значение2

d dw 2;присваеваем переменной d значение2

mes db'(a+b-c)/d=','$';присваеваем переменной a значение5

.code;начало сегмента кода

mov ah,0;функцияустановки режима дисплея

mov al,3;установка режима 25 строк в каждый из

int 10h;прерывание,по которому происходит

;очистка экрана

mov ax,@data;загрузка в регистр ds базового адресса

mov ds,ax;с которого в память будет начинать

;распологаться сегмент данных

mov ah,9;функция ДОС вывода строки на экран

mov dx,offset mes;загрузки в регистр dx смещение по

;которому в сегменте данных распологается

;строка с именем mes

int 21h;прерывание по которому происходит

;передача управления ОС для выполнения

;ранее объявленной функции

xor ax,ax;обнуление регистра ах

xor dx,dx;обнуление регистра dх

mov ax,a;обнуление регистра ах

mov bx,b;обнуление регистра bх

adc ax,bx;сложение ах и bx

mov bx,c; загрузка в регистр bx переменной c

sbb ax,bx;вычитание ax от bx

mov bx,d; загрузка в регистр bx переменной d

div d;деление содержимого регистра ax на

;переменную d результат будет помещен в регистр ax

cycl:;метка

push ax

push bx

push cx

push dx

xor cx,cx

p3:xor dx,dx

div cs:p16

mov bx,dx

mov dl,cs:pp[bx];

push dx

inc cx

cmp ax,0

jne p3

mov ah,2

p4:pop dx

int 21h

loop p4

pop dx

pop cx

pop bx

pop ax

mov ah,01h;приостановка программы до нажатия любой

int 21h;клавиши

mov ah,4ch;функция ДОС завершения программы.

int 21h; прерывания по которому происходит

;передача управления ОС для выполнения

; ранее объявленной функции.

p16 dw 10;в p16 заносится основание СС в которой

;будет осуществлятся вывод результата

pp db'0123456789'; выбор символа для вывода на экран

end;директива завершения программы на ассемблер

2.4 Постановка задачи №4

Решить пример (a*b*c**2)

2.4.1 Выходная форма программы №4

2.4.2 Листинг программы №4

Dosseg;Директива задает

;Расположение сегментов в памяти

.model small;Расположение сегментов в памяти

.stack 100h;директива определяет размерность стека

.data;директива отмечает начало

;расположения информации в сегменте

;данных

start dw'';Запуск строки

a dw 5;присваеваем переменной a значение5

b dw 2;присваеваем переменной b значение2

c dw 4;присваеваем переменной c значение4

d dw 2;присваеваем переменной d значение2

mes db'(a*b*c**2)=','$';текстовая строка с именем mes.

.code;начало сегмента кода

mov ah,0;функцияустановки режима дисплея

mov al,3;установка режима 25 строк в каждый из

;которых будет по 80 символов

int 10h;прерывание,по которому происходит

;очистка экрана

mov ax,@data;загрузка в регистр ds базового адресса

mov ds,ax;с которого в память будет начинать

;распологаться сегмент данных

mov ah,9;функция ДОС вывода строки на экран

mov dx,offset mes;загрузки в регистр dx смещение по

;которому в сегменте данных распологается

;строка с именем mes

int 21h;прерывание по которому происходит

;передача управления ОС для выполнения

;ранее объявленной функции

xor ax,ax;обнуление регистра ах

xor bx,bx;обнуление регистра ах

xor cx,cx;обнуление регистра cx

xor dx,dx;обнуление регистра dx

mov ax,a;загрузка в регистр ax переменной a

mov bx,b; загрузка в регистр bx переменной b

mov cx,c; загрузка в регистр cx переменной c

mov a,5;пересылка содержимого регистра 5 в

;регистр a

mov b,2;пересылка содержимого регистра 2 в

;регистр b

mul bx;умножение содержимого регистра bx на

;переменную b результат будет помещен в

;регистр bx

mov c,2; пересылка содержимого регистра 2 в

;регистр с

mul cx;умножение содержимого регистра сx на

;переменную с результат будет помещен в

;регистр сx

push ax;

push bx;

push cx;

push dx;

xor cx,cx;

p3:xor dx,dx;

div cs:p16;

mov bx,dx;

mov dl,cs:pp[bx];

push dx;

inc cx;

cmp ax,0;

jne p3;

mov ah,2;

p4:pop dx;

int 21h;

loop p4;

pop dx;

pop cx;

pop bx;

pop ax;

mov ah,01h;приостановка программы до нажатия любой

int 21h;клавиши

mov ah,4ch;функция ДОС завершения программы.

int 21h; прерывания по которому происходит

;передача управления ОС для выполнения

; ранее объявленной функции.

p16 dw 10;в p16 заносится основание СС в которой

;будет осуществлятся вывод результата

pp db'0123456789'; выбор символа для вывода на экран

end;директива завершения программы на ассемблер

ЗАКЛЮЧЕНИЕ.

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

Список литературы





Дата публикования: 2015-07-22; Прочитано: 275 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!



studopedia.org - Студопедия.Орг - 2014-2024 год. Студопедия не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования (0.079 с)...