Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
KPiYaP_Shpory.doc
Скачиваний:
46
Добавлен:
11.05.2015
Размер:
309.76 Кб
Скачать

1. Архитектура персонального компьютера. Назначение регистров микропроцессора.

2. Структура памяти и методы адресации. Способы адресации данных и переходов.

3. Сегментная организация памяти. Понятия физического и логического адреса.

4. Объявление и инициализация данных.

5. Использование логических и сдвиговых операций.

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

7. Упрощенные директивы определения сегментов.

8. Организация и использование стека.

9. Структура программ типа .com и .exe.

10. Организация обслуживания прерываний. Типы прерываний. Таблица векторов прерываний.

11. Подпрограммы. Передача параметров. Ближние и дальние процедуры.

12. Повторяющиеся блоки и макросы.

13. Вывод информации на экран. Видеорежимы. Видеопамять

14. Строковые команды. Префиксы повторения.

15. Организация циклов, условных и безусловных переходов

16. Мультимодульные программы.

17. Обработчики прерываний и резидентные программы.

18. Структура резидентной программы.

19. Интерфейс модулей, написанных на языке ассемблера с модулями, написанными на языке С.

20. Вызов из программы, написанной на языке С , процедур, написанных на ассемблере.

21. Вызов из ассемблерной программы функций на языке С.

22. Использование встроенного ассемблера.

23. Написать программу транспонирования матрицы, заданной в кодовом сегменте (в сегменте данных).

24. Найти в строке символ, введенный с клавиатуры, вывести на экран номер его позиции в строке.

25. Умножение длинных чисел. Числа ввести с клавиатуры

26. Обработка переполнения при делении чисел. Числа ввести с клавиатуры

27. Выполнить сортировку символов строки, заданной в кодовом сегменте (в сегменте данных), методом пузырька, выбора. Строку ввести с клавиатуры.

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

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

30. Найти суммы элементов четных (нечетных) строк матрицы. Матрицу чисел ввести с клавиатуры, результат вывести на экран.

31. Ввести с клавиатуры массив чисел. Найти в нем минимальное и максимальное значение. Вывести их на экран.

32. В сегменте данных расположены числа в формате двойного слова. С клавиатуры вводится число и определяется, имеется ли это число в сегменте данных.

33. Ввести с клавиатуры массив чисел. Отсортировать массив методом пузырька (выбора и т.д.). Вывести результат.

34. Написать программу вывода символов строки в обратном порядке. Строку ввести с клавиатуры, дополнительных строк не использовать.

35. Ввести с клавиатуры массив чисел. Найти суммы положительных и отрицательных чисел. Вывести результат.

36. Дан массив строк. Найти строку наибольшей длины, вывести ее на экран. Массив строк ввести с клавиатуры.

37. Выполнить перевод числа из одной системы счисления в другую. Данные вводить с клавиатуры.

38. В матрице найти сумму элементов строк, столбцов. Программа типа EXE. Или COM. Матрицу чисел ввести с клавиатуры, результат вывести на экран.

39. Преобразовать строковую запись в число. Строку ввести с клавиатуры, Результат вывести.

40. Отсортировать элементы главной (побочной) диагонали матрицы (строк, столбцов) заданной в сегменте данных (кодовом менте). Матрицу чисел ввести с клавиатуры, результат вывести на экран.

41. Ввести с клавиатуры матрицу чисел. Найти суммы элементов главной и побочной диагоналей и вывести их на экран.

42. Работа с окнами в текстовом режиме.

43. Сложение и вычитание длинных чисел. Числа вводить с клавиатуры, результат вывести на экран.

44. Вывести на экран ASCII символы по 16 в строке. Использовать прямой доступ к видеопамяти.

45. Переслать строку из сегмента данных в сегмент кода (или наоборот). Строку ввести с клавиатуры, результат вывести.

46. Ввести с клавиатуры массив символов, выделить из него числа, найти их сумму

47. Ввести с клавиатуры две строки. Используя процедуру, сравнить строки, результат вывести на экран.

48. В массиве чисел, определенном в сегменте данных, отрицательные значения заменить нулями, а положительные просуммировать.

49. Подсчитать количество четных элементов массивва чисел и найти их сумму. Массив задан в сегменте данных.

50. В массиве чисел, определенном в сегменте данных, подсчитать количество отрицательных, положительных и нулевых элементов.

51. В массиве чисел, определенном в сегменте данных, элементы, кратные пяти, заменить единицами, подсчитать их количество и записать в память.

52. Определить, входит ли в строку, определенную в сегменте данных, подстрока, введенная с клавиатуры. Результат работы программы – текст соответствующего сообщения.

53. Выполнить реверс слов строки, определенной в сегменте данных (кода). Результат вывести.

54. Отсортировать слова в строке (по длине слова, по алфавиту).

55. Удалить из строки заданное слово.

56. Удалить из строки слова, содержащие заданный символ.

57. Удалить из строки слова, являющиеся числами..

58. В массиве подсчитать число элементов, лежащих в заданном диапазоне.

59. Арифметические операции со знаковыми и беззнаковыми числами.

60. Процедуры в ассемблере, передача параметров, возврат значений.

61. Операции с файлами: создание, открытие, закрытие.

62. Операции с файлами: чтение и запись данных.

1. Архитектура персонального компьютера. Назначение регистров микропроцессора.

Реальный режим работы процессора.

Регистры процессора:

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

AX | AH | AL | , BX, CX, DX

SI, DI, BP, SP

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

CS, DS, SS, ES, IP и Flags

Пусть в память загружен исполняемы модуль некоторой программы. Команды должны в установленном порядке считываться и исполнятся, при этом они манипулируют данными в памяти или регистрах. В памяти выделяется три сегмента: для кода, данных и стека. Для 8086 каждый сегмент <=64 Кб. 8086 адресовал 1 Мб, Для того что бы адресовать 1 Мб с 16 бит регистром выполняется: вся память делится на сегменты по 64 Кб, причём каждый сегмент начинается на границе 16 байт от начала памяти, каждый стартовый байт – параграф. Начальный адрес каждого сегмента хранится в начале сегментного регистра, без последнего ноля. Физический адрес некоторого элемента памяти определяется суммой заданной в начале сегментного регистра и смещением. Смещение может хранится в одном из регистров:

IP(для кода); BX,SI,DI(для сегмента данных);BP,SP(для стека).Значения предыдущих кроме IP можно изменять, имея ввиду что память имеет кольцевую организацию.

AX - применяется при работе с портами, умножении и делении, ВХ - содержать адрес в опер. памяти(смещение),СХ – в операциях повторения,DX – адреса портов ввода-вывода, исплюю в дел. и умн. с АХ. Все они позвл. обращ. независимо к старшей и младш. полов.

SI – смещение в сегментах данных. при строк окманд(строки источника в DS)DI - смещение в сегментах данных. при строк окманд(строки приёмника в ES)BP – адреса в памяти смещение стека SP – тоже что BP указ на текущую вершину стека. измен командами (push, pop,pushf,popf,cell,ret)Их испол для хрон данных если они не испол на прим.

IP-смещение в сегменте кода. СS-стартовый адрес кода.DS-стартовый сегмент данных. ES-стартовый сегмент данных дополнительных данных.SS- адрес сегмента стека, в BP,SP Flags- биты установ в 01 при определённых условиях. С – перенос. Р – чётность 1 если чётно. А – выполняет операцию в ВCD кодах Z- признак нуля.S- повторяет занмение стартового бита результата. Т- признак трассировки.I- разрешение прирывание на вход,D- признак направления для стека 1-уменьшает индекс адр, 0- наоборот.

2. Структура памяти и методы адресации. Способы адресации данных и переходов.

В памяти можно различать байты, слова, двойные слова и т.д. Слово – 2 рядом расположенных байта. Младший байт хранится по младшему адресу. Адресом слова является его младший байт.

Адреса объектов тоже можно различать в памяти виде 4 – байтных элементов – сегмент смещения. Причем слово с меньшим адресом – смещение, а с большим – сегмент.

Методы адресации: - адресация данных; - адресация переходов;

Методы адресации данных:

1. Непосредственная, при которой операнд длинной байт или слово является частью команды. Операнд помещается в посл. байты команды причем младший байт располагается по меньшему адресу --- mov ax,1234h

2. Прямая адресация, при которой смещение данного размером 16 бит явл. частью команды: mov ax,my_label

3. Регистровая адресация – операнд нах-ся в одном из регистров общего назначения или в одном из сегментных регистров, имя регистра определяется в самой команде ---- mov ax,bx

4. Косвенная регистровая адресация, при которой смещение данного размером 16 бит нах-ся в одном из регистров bx, si, di, bp: mov ax,[bx]; mov ax,cs:[bx] – используется префикс замены. Префикс замены не может исп-ся с IP и SP

5. Относительная косвенная регистровая адресация. Смещение данного размером 16 бит вычисл. как сумма смещения в команде размером 8 или 16 бит и знач. в одном из регистров. --- mov ax,[bx+10] – смещение данного в сегменте ds опр-ся суммой знач, кот. хр-ся в регистре bx и числа 10. mov ax,[bx]+10; mov ax,10[bx]

6. Базовая индексная адресация - смещение данного размером 16 бит опр-ся суммой знач. базового рег-ра (bx,bp), индексного рег-ра (si,di) и смещением в команде. --- mov ax, ax,my_array[bx][si]

7. Неявная адресация – адреса объектов задаются неявно кодом операций.

Методы адресации переходов:

1. Внутрисегментный прямой переход, где смещение очередной ком-ды в сегменте кода. Опр-ся суммированием в регистре ip значения со знач. смещения в 8 или 16 бит заданным в команде --- jmp my_label

2. Внутрисегментный косвенный переход - содержимое регистра ip заменяется 16 битовым значением заданного регистра или адресации данных кроме непосредственных. --- jmp [bx]Межсегментный прямой переход – сод-мое регистра в ip и cs зам-ся 2 словами расп-ся непосредственно в команде ---- jmp far ptr far label

3. Межсегментный косвенный переход – при этом сод-мое регистров ip,cs зам-ся 2 словами последовательно расп. в памяти (ip по младшему алресу). --- jmp dword ptr[bx]

3.Сегментная организация памяти. Понятие физического и логического адреса.

При работе с сементными моделями памяти адрес представляет собой 2 числа:

1-е – адрес начала массива; 2-е – адрес байта внутри массива.

Пусть исполняемый модуль некоторой программы загружен в память ПК. Команды модуля считываются в микропроцессор и выполняются. При этом они используют данные, которые выбираются из памяти и регистров микропроцессора. Поскольку для адресации памяти микропроцессора 8086 используются 16-ти разрядные регистры, то это обеспечивает ему доступ к 65535 байтам.

Для того, чтобы получить значение полного физического адреса начала сегмента достаточно к содержимому нач. сегмента дописать 0 справа.

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

IP – смещение кода программы;

BX, SI, DI – смещение для данных;

BP, SP – для стека.

Суммирование происходит следующим образом:

Микропроцессор расширяет содержимое сегмента регистра или базовый адрес, добавляя к нему справа 0. При этом адрес становиться 20-ти битным. И добавляет к младшим 16-ти битам значение смещения. Полученный 20-ти битный результат будет представлять собой физический или абсолютный адрес ячейки памяти.

Содержимое сегм. Регистра xxxx xxxx xxxx xxxx 0000 Полный адрес

+

Смещение xxxx xxxx xxxx xxxx

xxxx xxxx xxxx xxxx xxxx – абсолютный адрес.

CS:IP <- логический адрес

4. Объявление и инициализация данных.Псевдокоманды определения переменных

Псевдокоманды определения переменных указывают ассемблеру, что в соответствующем месте программы располагается переменная, определяют тип переменной (байт, слово, вещественное число и т.д.), задают ее начальное значение и ставят в соответствие переменной метку, которая будет использоваться для обращения к этим данным. Псевдокоманды определения данных записываются в общем виде следующим образом:имя_переменной d* значениегде D* — одна из нижеприведенных псевдокоманд:

DB — определить байт;

DW — определить слово (2 байта);

DD — определить двойное слово (4 байта);

DF — определить 6 байт (адрес в формате 16-битный селектор: 32-битное смещение);

DQ — определить учетверенное слово (8 байт);

DT — определить 10 байт (80-битные типы данных, используемые FPU).

Поле значения может содержать одно или несколько чисел, строк символов (взятых в одиночные или двойные кавычки), операторов ? и DUP, разделенных запятыми. Все установленные таким образом данные окажутся в выходном файле, а имя переменной будет соответствовать адресу первого из указанных значений.считает в регистр AL число 48h (код латинской буквы H).. Если нужно заполнить участок памяти повторяющимися данными, используется специальный оператор DUP, имеющий формат счетчик DUP (значение). Например, вот такое определение:

table_512w dw 512 dup(?)

создает массив из 512 неинициализированных слов, на первое из которых указывает переменная table_512w. В качестве аргумента в операторе DUP могут выступать несколько значений, разделенных запятыми, и даже дополнительные вложенные операторы DUP.

Директива STRUC позволяет определить структуру данных аналогично структурам в языках высокого уровня. Последовательность директив

имя struc

поля

имя ends

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

метка имя <значения>

И наконец, для чтения или записи в элемент структуры используется оператор «.» (точка).

5. Использование логических и сдвиговых операций.

Логические и сдвиговые операции.

Логичиские операции: AND - Команда выполняет побитовое «логическое И» над приемником (регистр или переменная) и источником (число, регистр или переменная; источник и приемник не могут быть переменными одновременно) и помещает результат в приемник. OR - Выполняет побитовое «логическое ИЛИ» над приемником (регистр или переменная) и источником (число, регистр или переменная; источник и приемник не могут быть переменными одновременно) и помещает результат в приемник. XOR - Выполняет побитовое «логическое исключающее ИЛИ» над приемником (регистр или переменная) и источником (число, регистр или переменная; источник и приемник не могут быть переменными одновременно) и помещает результат в приемник.NOT - Каждый бит приемника (регистр или переменная), равный нулю, устанавливается в 1, и каждый бит, равный 1, сбрасывается в 0. Сдвиговые операции SAR - Арифметический сдвиг вправо. SAL - Арифметический сдвиг влево. SHR - Логический сдвиг вправо. SHL - Логический сдвиг влево. ROR - Циклический сдвиг вправо. ROL - Циклический сдвиг влево. RCR - Циклический сдвиг вправо через флаг переноса. RCL - Циклический сдвиг влево через флаг переноса.

mov al,10010001b

shl al,1 ;al=00100010b

sal al,1 ;al=01000100b

mov al,10100011

mov cl,3

shl al,cl ;al=00011000b

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

Директива SEGMENT используется для описания сегментов. Формат директивы: <имя>SEGMENT[параметры]…<имя> ENDS. Данная директива может содержать три типа параметров: выравнивание; объединение; класс. 1. Выравнивание – определяет границу памяти для стартового адреса сегмента: byte – на границе байта word – на гр. слово dword – на гр. двойное слово para – на гр. параграфа page – 256 байт. По умолчанию используется знач. PARA. 2. Объединение – показывает как должны объединятся сегменты с одинаковыми именами в разных модулях. Возможны сл. типы объединений: COMMON – для сегментов с одним и тем же именем и классом и имеющим параметр объединения common устанавл. один общий адрес загрузки(размер сегмента – максимальный из совм. сегментов.) Это позволяет: - уменьшить объем памяти исп. программой; - к одним и тем же данным можно обращаться с исп. разных имен; - к одним и тем же данным получ. разл. способ доступа(byte, word, dword и т.п.), PUBLIC – сегменты с одним и тем же именем, классов и топом объединения public загружаются в смежные блоки памяти (объед.) и размер всего сегмента равен сумме размеров объединенных сегментов. Требуется когда несколько разр. создают общий сегмент данных к которому необходим доступ из различных программных модулей., MEMORY – тип объединение подобный PUBLIC, STACK – все сегменты с одинаковым именем, классом и типом объединения stack компонуются в один общий сегмент, аналогично сегментам с типом public(различие в том что сегмент с типом компоновки stack и классом ‘stack’ считается сегментом стека. , AT-выражение – выражение определяет сегментный адрес памяти, т.е. задает номер параграфа с которого в памяти будет распологаться данный сегмент., PRIVATE – данный сегмент не будет объединяться с другими. Этот тип компановки модулей устанавливается по умолчанию.

MOD1

D1 SEGMENT COMMON

a dd 9

b dw 7

D1 ENDS

;MOD2

D1 SEGMENT COMMON

k db 5

z db 2

D1 ENDS

7. Упрощенные директивы определения сегментов.

После того как модель памяти установлена, вступают в силу упрощенные директивы определения сегментов, объединяющие действия директив SEGMENT и ASSUME. Кроме того, сегменты, объявленные упрощенными директивами, не требуется закрывать директивой ENDS — они закрываются автоматически, как только ассемблер обнаруживает новую директиву определения сегмента или конец программы.

Директива .CODE описывает основной сегмент кода

.code имя_сегмента

NAME_TEXT. .stack размер

Директива .STACK описывает сегмент стека. Необязательный параметр указывает размер стека. По умолчанию он равен 1 Кб.

.data

Описывает обычный сегмент данных

.data?

Описывает сегмент неинициализированных данных:

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

.const

Описывает сегмент неизменяемых данных.

.fardata имя_сегмента

Сегмент дальних данных. Доступ к данным, описанным в этом сегменте, потребует загрузки сегментного регистра.

8. Организация и использование стека.

Стек - нек. область оперативной памяти которая исп. механизм безадресной записи и выборки данных. Эти механизмы работают : последний запис. - первый выбранный. Адрес сегмента памяти в кот. нах. стек определ. в регистре ss. ЄAaВершина стека в sp. Для 16 бит. процессора данные в стек помещ. в виде слов. ss:sp - в любой момент определ. вершина. push - занести в стек. (sp уменьш на 2). Для извлечения слова из стека исп. команда типа pop, при этом снач. произв. чтение слова, а потом sp увелич на 2. Особенности: 1)Несмотря на то что знач. sp можно изменять, этого делать не следует, т.к. стек исп. довольно часто и не только самой программой(но и при вызове различных подпрограмм). ОП могут исп. стек при вызове сервисных процедур. 2) Необходимо обращ. внимание для выделения памяти для стека. Для адрес. данных стека можно исп. bp (можно рассматр. как базовый регистр в сегменте стека и находить данные в стеке через смещение заданные относит. этого регистра).

Оперативная память

Сегмент кода

Сегмент данных

Сегмент стека

Вершина стека

Дно стека

9. Структура программ типа .com и .exe.

Программа в формате ЕХЕ, созданная компоновщиком, состоит из следующих двух частей:

1) заголовка - записи, содержащей информацию по управлению и настройке программы;

2) собственно загрузочного модуля.

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

Заголовок имеет минимальный размер 512 байт и может быть больше , если программа содержит большое число настраиваемых элементов. Позиция 06 в заголовке указывает число элементов в выполняемом модуле, нуждающихся в настройке. Каждый элемент настройки в таблице, начинающейся в позиции 1С заголовка, состоит из 2-х байтовых величин смещений и 2-х байтовых сегментных значений. Система строит префикс программного сегмента (PSP) следом за резидентной частью COMMAND.COM, которая выполняет операцию загрузки.

Различия между программами в ЕХЕ и СОМ файлах:

- РАЗМЕР ПРОГРАММЫ. Программа в формате ЕХЕ может иметь любой размер, в то время как СОМ-файл ограничен размером одного сегмента и не превышает 64 К. Размер СОМ - файла всегда меньше, чем размер соответствующего ЕХЕ-файла; одна из причин этого - отсутствие в СОМ - файле 512-байтового заголовка ЕХЕ-файла.

- СЕГМЕНТ СТЕКА. В ЕХЕ-программе определяется сегмент стека, в то время как СОМ-программа генерирует стек автоматически. Таким образом, при создании ассемблерной программы, которая будет преобразована в СОМ - файл, стек должен быть опущен.

- СЕГМЕНТ ДАННЫХ. В ЕХЕ-программе обычно определяется сегмент данных, а регистр DS инициализируется адресом этого сегмента. В СОМ-программе все данные должны быть определены в сегменте кода.

- ИНИЦИАЛИЗАЦИЯ. В ЕХЕ-программе выполняется инициализация регистра DS. Так как в СОМ-программе стек и сегмент данных не определены, то эти шаги отсутствуют. Когда СОМ-программа начинает работать, все сегментные регистры содержат адрес PSP - 256 байтовый блок, который резервируется операционной системой DOS непосредственно перед СОМ- или ЕХЕ-программой в памяти.

10. Организация обслуживания прерываний. Типы прерываний. Таблица векторов прерываний.

Посредством прерывания работы микропроцессора можно приостанавл. работу текущей программы и осущ. запуск другой программы.Прерывания: 1)Внешние;2)Внутренние. Каждому прерыв. ставятся в соотв. 4-х байтный вектор с номером 0<n<255. Все векторы можно размещать по порядку в младш. килобайте памяти. Любой из них задает точку входа или старт адрес программы для обслуж. треб ситуации. В виде сегмент. прогр:смещ. прогр. (Вектор прерывания - адрес!!!) Внешн прер. вызываются на входе INTR(запрос маскируемого прерывания и на NMI(немаскер. прерывание). Если признак I в регистре флаг = 0, сигнал на входе INTR не распознается и прерывание не происх. При I=1 и налич сигнала ШТЕК возник маскируемое прерывание. Действие кот. будет при этом выполн.:1) На вход INTR - поступ. запрос прерывание;2) Послед. действия определ. допустимой ситуацией:а) ожид. завершение текущей команды; б)-||- сл. команды;в) запрос обраб во время вып. текущей команды.---В нек случаях сигнал INTR распазн только при б).--Имеются 2 случ. когда в): 1..При строковых командах с повторением.2.. При вып. команды wait. 3) Микропроц. выраб. 2 сигнала подтверждения INTX. 4) По шине адресов/данных в микропроц. передается байт с номером n прерываний. 5) Текущее содерж. регистра признаков и регистра CS и IP загруж. в стек. В стек загруж. IP соответ. смещениюкоманды перед которой возникло прерыв. 6) Признаки I,T сбрасываются в 0.7)В CS:IP загруж. содержимое вектора n. 8) Выполн. программа обработки прерывания. 9) В конце обработки прерыв. команда iret восстан. знач. регистра IP,ES и FL.10)Прерванная программа продолж. свое выполнение.

Внутренне прерывание возникает либо при появлении некоторых микро сигналов внутри микропроцессора либо по команде внутри программы

11. Подпрограммы. Передача параметров. Ближние и дальние процедуры.

Подпрограммы на asm выз-ется командой call при этом выполн. сл. действия: -1-в стеке сохр. адрес сл. после call команды (для мал. моделей только регистр IP, большие – CS:IP).-2-В регистр CS:IP для больших моделей или IP загр. адрес точки входа в подпр.-3- посл. командой подпрогр. должна быть команда ret она загр. из стека адрес сл. после call команды. my_proc PROC – имя процедуры---my_proc ENDP. Для передачи параметров исп. 2 способа: - через регистр; - через стек; Также можно передавать копию аргумента или адрес аргумента. Команда CALL имеет 4 модификации: - вызов прямой ближний(в пределах текущего программного сегмента – near ptr):call near ptr proc1;- вызов косвенный ближний(word ptr): mov bx,offset proc1---call [bx];- прямой дальний вызов(вызов процедуры, расположенной в другом сегменте кода – far ptr): call far ptr proc1; - вызов косвенный дальний(dword ptr): adr dd proc1---call DS:adr(или call dword ptr adr).

.model small

.stack 100h

.code

start:

mov ax,12h

mov bx,2

call my_convert

mov ch,4ch

int 21h

my_convert PROC

push cx

……….

pop dx

pop cx

ret

my_convert endp

end start

12. Повторяющиеся блоки и макросы.

Чтобы не запис. в программе часто повт. фрагмент, рекоменд. хранить ее в именованном МАКРОСЕ и потом исп. его имя всякий раз, когда этот код потр. Макроопределение – это группа команд, которая должна вставляться в текст вместо макрокоманды. Макрокоманда – задает имя макроопределения, которое определяет, какую группу команд, в какое место программы необх. поместить и какие аргументы должны исп-ся вместо параметров. Макрорасширение –группа команд, реал. макроопределение, в котором парам. заменены на адреса конкр. переменных. Макроопр. имеет сл. вид: <имя макроса> MACRO <формальные параметры через запятую>---<тело макроса>---ENDM. Макрокоманда запис сл. обр. <имя макро>/<параметр>,…/. При написании макроопределений необходимо, чтобы метки в программе были уникальными. Для этой цели в языке имеется директива – local. LOCAL d1,d2,…; формальные параметры. Директива LOCAL позволяет объявить метку локальной и сгенерировать для нее уникальное имя вида: ??0000, ??0001 и т.д.

Swap MACRO w1,w2

push [word w1]

push [word w2]

pop [word w1]

pop [word w2]

ENDM

.data

val1 dw 15

val2 dw -7

. code

……….

swap val1, val2

13. Вывод информации на экран. Видеорежимы. Видеопамять

Вывод на экран

В текстовом режиме:

1. Функция DOS int 21h

2. Функция BIOS int 10h

3. Прямой доступ к видео памяти

Всё что выводится на монитор находится в памяти. Для того что бы вывести данные на монитор они должны быть занесены в память В000:0000h -//- B800:FFFFh всё что находится в этой памяти немедленно пересылается на экран. Для отображения каждого символа используется 2 байта инфы. Младший байт хранит код символа, старший атрибуты. мет RGB мет RGB начало фон конец цвет символа.

Графический режим

Прерывание 10h также позволяет переключать графические режимы

Номера режимов:

11h 640x480 2 цветов

12h 640x480 16 цветов

13h 320x200 256 цветов

14. Строковые команды. Префиксы повторения.

Все команды для работы со строками считают, что строка-источник находится по адресу DS:SI (или DS:ESI), то есть в сегменте памяти, указанном в DS со смещением в SI, а строка-приемник — соответственно в ES:DI (или ES:EDI). Кроме того, все строковые команды работают только с одним элементом строки (байтом, словом или двойным словом) за один раз. Для того чтобы команда выполнялась над всей строкой, необходим один из префиксов повторения операций

• Префикс: REP

• Назначение: Повторять

префиксы для операций над строками. Любой из префиксов выполняет следующую за ним команду строковой обработки столько раз, сколько указано в регистре ЕСХ (или СХ, в зависимости от разрядности адреса), уменьшая его при каждом выполнении команды на 1. Кроме того, префиксы REPZ и REPE прекращают повторения команды, если флаг ZF сброшен в 0, и префиксы REPNZ и REPNE прекращают повторения, если флаг ZF установлен в 1. Префикс REP обычно используется с командами INS, OUTS, MOVS, LODS, STOS, а префиксы REPE, REPNE, REPZ и REPNZ — с командами CMPS и SCAS. Поведение префиксов не с командами строковой обработки не определено.

Все команды для работы со строками считают, что строка-источник находится по адресу DS:SI (или DS:ESI), то есть в сегменте памяти, указанном в DS со смещением в SI, а строка-приемник — соответственно в ES:DI (или ES:EDI). Кроме того, все строковые команды работают только с одним элементом строки (байтом, словом или двойным словом) за один раз. Для того чтобы команда выполнялась над всей строкой, необходим один из префиксов повторения операций

• Префикс: REP

• Назначение: Повторять

префиксы для операций над строками. Любой из префиксов выпол

15. Организация циклов, условных и безусловных переходов

Безусл. переходы в асм. осущ. с помощью команды jmp mylabel; mylabel - метка куда перейдет. jmp - исп-ет 16 битное смещение элементов если задать. mov bx,wl;---jmp bx- преходпо содержимому регистра bx. jmp [wl] - аналогично. jmp можно использовать для перехода в другой сегмент но нужно делать перегрузку cs:ip. Сущ сл. переходы:1)типа short (короткий переход) — если адрес перехода находится в пределах от -127 до +128 байт от команды JMP; 2) типа near (ближний переход) — если адрес перехода находится в том же сегменте памяти, что и команда JMP; 3)типа far (дальний переход) — если адрес перехода находится в другом сегменте. Дальний переход может выполняться и в тот же самый сегмент, если в сегментной части операнда указано число, совпадающее с текущим значением CS; 4)переход с переключением задачи — передача управления другой задаче в многозадачной среде.

Условные переходы осущ. переход по заданному адресу в случае выполнения условия, задаваемого состоянием флагов процессора.

Код команды Реальное условие Условие для CMP

JA CF = 0 и ZF = 0 если выше

JNBE если не ниже или равно

JAE если выше или равно

JNB CF = 0 если не ниже

JNC если нет переноса

JB если ниже

JNAE CF = 1 если не выше или равно

JC если перенос

JBE CF = 1 и ZF = 1 если ниже или равно

JNA если не выше

JE ZF = 1 если равно

JZ если ноль

JG ZF = 0 и SF = OF если больше

JNLE если не меньше или рав

JGE SF = OF если больше или равно

JNL если не меньше

JL SF <> OF если меньше

JNGE если не больше или равн

JLE ZF = 1 и SF <> OF если меньше или равно

JNG если не больше

JNE ZF = 0 если не равно

JNZ если не ноль

JNO OF = 0 если нет переполнения

JO OF = 1 если есть переполнение

JNP PF = 0 если нет четности

JPO если нечетное

16. Мультимодульные программы.

Рассмотрим пути создания программ из нескольких модулей.

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

3 директивы:

• public

• extrn

• global

public [язык] метка [, [язык] метка…]

Определяет метки программы, которые будут доступны в других программах.

.data

public my_equ, my_var

my_equ equ 25

my_var dd 12345678h

.code

public my_proc

my_proc proc …

extrn определение [, определение…]

определение = [язык] метка:тип[:количество повторений]

Определяет какие метку будут взяты из другого модуля.

Тип: ABS (константа), BYTE, WORD,…, FAR, NEAR, PROC

global определение [, определение…]

Объединяет функции public и extrn.

.data

global my_out:dataptr, my_in:word …

my_in dw 10

.code

global my_out_code:near, my_in_code:far

my_in_code proc far …

call my_out_code

17. Обработчики прерываний и резидентные программы.

Посредством прерывания работы микропроцессора можно приостанавл. работу текущей программы и осущ. запуск другой программы.Прерывания: 1)Внешние;2)Внутренние. Каждому прерыв. ставятся в соотв. 4-х байтный вектор с номером 0<n<255. Все векторы можно размещать по порядку в младш. килобайте памяти. Любой из них задает точку входа или старт адрес программы для обслуж. треб ситуации. В виде сегмент. прогр:смещ. прогр. Внешн прер. вызываются на входе INTR(запрос маскируемого прерывания и на NMI(немаскер. прерывание). Если признак I в регистре флаг = 0, сигнал на входе INTR не распознается и прерывание не происх. При I=1 и налич сигнала INTR возник маскируемое прерывание. Действие кот. будет при этом выполн.:1) На вход INTR - поступ. запрос прерывание;2) Послед. действия определ. допустимой ситуацией:а) ожид. завершение текущей команды; б)-||- сл. команды;в) запрос обраб во время вып. текущей команды.---В нек случаях сигнал INTR распазн только при б).--Имеются 2 случ. когда в): 1..При строковых командах с повторением.2.. При вып. команды wait. 3) Микропроц. выраб. 2 сигнала подтверждения INTX. 4) По шине адресов/данных в микропроц. передается байт с номером n прерываний. 5) Текущее содерж. регистра признаков и регистра CS и IP загруж. в стек. В стек загруж. IP соответ. смещениюкоманды перед которой возникло прерыв. 6) Признаки I,T сбрасываются в 0.7)В CS:IP загруж. содержимое вектора n. 8) Выполн. программа обработки прерывания. 9) В конце обработки прерыв. команда iret восстан. знач. регистра IP,ES и FL.10)Прерванная программа продолж. свое выполнение.

Внутренне прерывание возникает либо при появлении некоторых микро сигналов внутри микропроцессора либо по команде внутри программы

+cм 18

18. Структура резидентной программы. См пред.пункт.

Резидентные программы.

Программы, кот. ост. в памяти после возврата действия в ДОС носят назв. резидентных. Блоки памяти в которых сидят резиденты ОС отмечает как занятые. Прерывания делятся: 1) Аппаратные: - маскируемые; - немаскируемые; 2) Программные: - прерывания BIOS; - прерывания DOS; пользовательские; 3) Исключительные ситуации: - ошибки; - ловушки; - аварийное завершение. Они вызываются процессором при возникновении ошибки(00 h – 1Fh) и поддерживаются только в защищенном режиме. Сущ. 2 способа оставить программу резидентной: 1) с помощью int 21h (ah=31h; al=код возврата; dx=размер резидента в 16-байтных параграфах включая PSP; cs=сегмент резидента). 2) int 27h – оставить программу резидентной(dx= адрес последнего байта программы; cs = сегмент резидента). 1-ый исп. когда резиденты большого размера и явл. exe. Резиденты небольшого размера, реализуются в виде com и ост. в памяти обработчиком int 27h. Резиденты – активные (перехватывают прерывания от внешних устройств) и пассивные (активизируются при вып. команды int с нужным номером). Способы установки векторов прерывания: 1) непосредственным обращением к соотв. байтам( xor ax,ax---mov es,ax---mov ax,es:[9*4]---mov int_ofs,ax---mov ax,es:[9*4+2]---mov int_seg,ax---Установить адрес входа в собственный обработчик также можно напрямую, путем модификации таблицы векторов(запрещает прерывание т.к. недопустимо чтобы INT_NUM появилось в момент, когда изменяем вектор.--- push 0---pop es---mov bx,INT_NUM---shl bx,2---mov ax,seg ISR---shl eax,16---mov ax,offset ISR---mov es:[bx],eax---sti). В многозадачной среде ОС может поддерживать несколько таблиц векторов прерываний, и реальный физический адрес может быть известен только DOS. 2) Используя функции DOS. Функция 35h получает адрес обработчика.(Вход ah=35h,al=номер прерывания; выход es:bx=адрес обработчика). 25h – устанавливает адрес входа в обработчик.(вход ah=25h; al=номер прерывания; ds:dx = адрес нового обработчика; выход – ничего).

19. Интерфейс модулей, написанных на языке ассемблера с модулями, написанными на языке С.

Команды ассемблера в тексте программы на C без изменения вкл. в формируемый компилятором код. Для встроенного ассемблера разр. использовать: - машинные команды; строковые команды; - все инструкции передач управления с прямой или косвенной адресацией; - директивы описания и определения данных. Нельзя исп. директивы, управляющие его работой: ASSUME,SEGMENT,ENDS,PROC,ENDP,ORG и т.д. а также имя группы DGROUP, имена сегментов _TEXT,_STACK,_DATA и т.п. Можно ссылаться на описанные в С переменные. Группа инструкций, заключенная в фигурные скобки, не требует повторения перед каждой из них ключевого слова “asm”.

#include <iostream.h>

#progme inline

asm v1 dw 10

asm v2 dw 90

void main(void)

{unsigned i;

again:

asm {mov ax,v2

add ax,v1

push ax

mov i,ax

}

printf(“i=%d”,i);

if(i>190)

asm jmp _end_

else if (i==150)

asm {

mov ah,2

mov dl,7

int 21h

}

asm {

pop ax

mov v2,ax

jmp again

}

_end_:

puts(“конец проги”);

}

20. Вызов из программы, написанной на языке С , процедур, написанных на ассемблере.

Общая схема: 1) Процедуры на asm и C объединяются совместно, используя файл-проект. В этом случае перечисляются C функции и имена объектных модулей, написанных на asm после трансляции их с помощью TASM. 2) Компиляция из командной строки: а) выполнить трансляцию модуля на С; б) выполнить трансляцию модуля на ассемблере; в) выполнить объединение объектных модулей. ASM процедура должна удовлетворять ниже перечисленным требованиям: - гарантировать получение необходимой информации редактором связей; - обеспечить получ. значений аргументов, переданных ей при вызове, и видимость всех внешних переменных; - должно собл. соотв. моделей памяти, используемых при компиляции C-функции и при обработке asm процедур. В этой связи ассемблерная процедура должна: а) использовать правило именования сегментов, принятое в С; б) явно описывать все глобальные и внешние идентификаторы; в) поддерживать принятую в С посл. передачи аргументов и возврата значений в точку вызова. Все внешние переменные, на которые ссылается ассемблерная процедура. и описанные в С-функциях как внешние, должны объявляться в asm блоке явно с исп. директивы extrn имя_переменной: тип. Если имеются переменные, описанные в ассемблерном модуле, значения которых исп. в С функции. то они в asm модуле объявляются с атрибутом public.

C_asm.cpp

extern void asm f1(int *i1,int *i2,unsigned long l);

void main (void)

{int i=5,j=7;

unsigned long l=0x12345678;

asm_f1(&I,&j,l);

printf(“i=%d,j=%d,l=%lx/n”,i,j,l); }

Вызов процедуры аsm

.model small .code

public asm_f1

asm_f1 PROC near

push bp

mov bp,sp

push si,di

mov si,[bp+4]

mov di,[bp+6]

mov bx,[bp+8]

mov ax,[bp+10]

mov cx,[si]

xchg cx,[di]

mov [si],cx

pop di si

pop bp

ret

asm_f1 endp

end

21. Вызов из ассемблерной программы функций на языке С.

Для каждой прогаммы нужно указать, какие переменные она передаёт в другой модуль и какие переменные она получает из другого модуля.

Фкнкция С++ должна быть описанна в асм. после дерективы EXTERN.

Описание глобальных переменных происходит следующим образом:

-если она обявлена в асм., то должна иметь атрибут PUBLIC а в С++ - EXTERN

-если она обявлена в С++ как внешняя, тогда в асм. она должна иметь атрибут EXTERN

Если функция на С++ возрващает 16-битное значение(char,short,int,enum) то оно будет помещенов регистр АХ, если 32-битное(long) - то DX:AX причём старшая часть в DX

22. Использование встроенного ассемблера.

Необходимо задать дерективу #pragma inline

Асм. команду записывают в виде asm код_операции операнды (;) или (новая строка)

код_операции - (mov,xor...) Если необходимо задать много асм. команд, то они заключаются в фигурные скобки.

Коментарии ожно записывать только в форме, принятой в языке С++.

23. Транспонирование матрицы заданной в кодовом сегменте.

.model small

.stack 100h

.code

start:

jmp continue ; оставить место для матрицы

razmer equ 4

matrix dw 1,2,3,4

dw 5,6,7,8

dw 9,10,11,12

dw 13,14,15,16

continue:

push cs

pop ds ; направляем ds на сегмент кода

mov si,2 ; si - указывает на matrix[0][1]

mov bx,razmer ; в bx - размер матрицы

shl bx,1 ; bx=bx*2, то есть bx указывает на matrix[1][0]

mov ax,bx ; в ax - смещение, равное длине строки

mov cx,razmer ; в cx - razmer

dec cx ; количество перестановок на 1 меньше, чем размер матрицы

loop1: ; внешний цикл по строкам

push cx ; сохранить cx в стеке

loop2: ; внутренний цикл по столбцам (выше главной диагонали)

mov dx,matrix[bx] ; в dx - элемент ниже диагонали

mov di,matrix[si] ; в di - элемент выше диагонали

mov matrix[bx],di ; переставляем их

mov matrix[si],dx

add si,2 ; смещаемся вправо

add bx,ax ; смещаемся вниз

loop loop2 ; цикл повторяется cx раз

pop cx ; восстанавливаем сохраненное cx

push ax ; сохраняем в стеке длину строки

mov ax,razmer ; вычисляем, на сколько сместиться, чтобы оказаться

sub ax,cx ; главной диагональю

inc ax

shl ax,1

add si,ax ; смещаемся на matrix[i][i+1], i - номер очередного ци

mov bx,si ; уставнавливаем bx на si

pop ax ; восстанавливаем длину строки

add bx,ax ; смещаем bx на строку вниз

sub bx,2 ; и на 1 элемент назад

loop loop1 ; цикл, пока cx != 0

mov ah,4ch

int 21h

end start

24. Ввод символа. Определить его позицию в строке и вывести на экран

.model small

.stack 100h

.data

stroka db 80 dup(?),'$'

symb db ?,' ','$' ; можно и не выделять память для символа

msg_in db 0ah,0dh,"Vvedite simvol:",0ah,0dh,"$"

msg db 0ah,0dh,"Simvol ","$"

msg1 db "nayden! Ego index - ","$"

msg_err db "ne nayden.","$"

c10 dw 10

.code

start:

mov ax,@data

mov ds,ax

xor bx,bx ; в bx - индекс вводимого символа

input_loop:

mov ah,01h ; считываем символ

int 21h

cmp al,13 ; если это enter

je for_find ; то конец ввода

mov stroka[bx],al ; иначе записываем символ в строку

cmp bx,80 ; если ввели 80 символов

je for_find ; то конец ввода

inc bx ; увеличиваем bx

jmp input_loop

for_find:

lea dx,msg_in ; вывод msg_in

mov ah,09h

int 21h

mov ah,01h ; ввод нужного символа

int 21h

mov byte ptr symb,al ; сохраняем его в symb ( можно использовать любой из свободных регистров, если хошь)

mov cx,bx ; в cx - длина строки

xor bx,bx ; bx - индекс элемента

mov ah,byte ptr symb ; в ah - нужный символ

find:

cmp ah,stroka[bx] ; сравниваем текущий элемент с нужным симв

je found ; если совпадают, то jmp на found

inc bx ; переход к следующему элементу

loop find ; цикл повторяется cx раз

lea dx,msg ; если символ не найден, то

mov ah,09h ; вывод msg

int 21h

lea dx,symb ; вывод самого символа

int 21h

lea dx,msg_err ; вывод msg_err

int 21h

jmp end_program ; завершить программу

found: ; если найден символ

lea dx,msg ; вывод msg

mov ah,09h

int 21h

lea dx,symb ; вывод самого символа

int 21h

lea dx,msg1 ; вывод msg1

int 21h

mov ax,bx ; сохраняем индекс в ax

xor cx,cx ; cx - счетчик цифр

number_to_string:

xor dx,dx ; подготовка к делению

div c10 ; деление

add dx,30h ; в dx - ASCII-код остатка от деления

push dx ; сохраняем его в стеке

inc cx ; инкремент счетчика цифр

cmp ax,0 ; цикл, пока частное ненулевое

jne number_to_string

out_index_loop: ; цикл вывода индекса

pop dx ; извелекаем очередную цифру

mov ah,02h ; выводим ее на экран

int 21h

loop out_index_loop

end_program:

mov ah,4ch

int 21h

end start

25.Ввод с клавиатуры и умножение длинных чисел

.model small

.stack 100h

.data

num1 dd 0

num2 dd 0

proizv dd 0,0

msg1 db 0ah,0dh,"Vvedite pervoe chislo:",0ah,0dh,"$"

msg2 db 0ah,0dh,"Vvedite vtoroe chislo:",0ah,0dh,"$"

c10 dw 10

.code

start:

mov ax,@data

mov ds,ax

lea dx,msg1 ; вывод на экран msg1

mov ah,09h

int 21h

call input ; ввод первого числа

lea bx,num1 ; записываем введенное длинное число в num1:

mov word ptr[bx],si ; младшее слово

mov word ptr[bx+2],di ; старшее слово

lea dx,msg2 ; вывод на экран msg2

mov ah,09h

int 21h

call input ; ввод второго числа

lea bx,num2 ; записываем введенное длинное число

mov word ptr[bx],si

mov word ptr[bx+2],di

mov ax,word ptr num1 ; перемножение чисел (смотри конспект)

mul word ptr num2

mov word ptr proizv,ax

mov word ptr proizv+2,dx

mov ax,word ptr num1

mul word ptr num2+2

add word ptr proizv+2,ax

adc word ptr proizv+4,dx

mov ax,word ptr num1+2

mul word ptr num2

add word ptr proizv+2,ax

adc word ptr proizv+4,dx

mov ax,word ptr num1+2

mul word ptr num2+2

add word ptr proizv+4,ax

adc word ptr proizv+6,dx

mov ah,4ch

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]