
- •5. Использование логических и сдвиговых операций.
- •6. Стандартные директивы определения сегментов.
- •7. Упрощенные директивы определения сегментов.
- •8. Организация и использование стека.
- •9. Структура программ типа .Com и .Exe.
- •10. Организация обслуживания прерываний. Типы прерываний. Таблица векторов прерываний.
- •11. Подпрограммы. Передача параметров. Ближние и дальние процедуры.
- •12. Повторяющиеся блоки и макросы.
- •13. Вывод информации на экран. Видеорежимы. Видеопамять
- •14. Строковые команды. Префиксы повторения.
- •15. Организация циклов, условных и безусловных переходов
- •16. Мультимодульные программы.
- •17. Обработчики прерываний и резидентные программы.
- •19. Интерфейс модулей, написанных на языке ассемблера с модулями, написанными на языке с.
- •20. Вызов из программы, написанной на языке с , процедур, написанных на ассемблере.
- •21. Вызов из ассемблерной программы функций на языке с.
- •22. Использование встроенного ассемблера.
- •26. Обработка переполнения при делении чисел. Числа ввести с клавиатуры
- •32. В сегменте данных расположены числа в формате двойного слова. С клавиатуры вводится число и определяется, имеется ли это число в сегменте данных.
- •35. Ввести с клавиатуры массив чисел. Найти суммы положительных и отрицательных чисел. Вывести результат.
- •42. Работа с окнами в текстовом режиме.
- •52. Определить, входит ли в строку, определенную в сегменте данных, подстрока, введенная с клавиатуры. Результат работы программы – текст соответствующего сообщения.
- •53. Выполнить реверс слов строки, определенной в сегменте данных (кода). Результат вывести.
- •54. Отсортировать слова в строке (по длине слова, по алфавиту).
- •55. Удалить из строки заданное слово.
- •58. В массиве подсчитать число элементов, лежащих в заданном диапазоне.
- •59. Арифметические операции со знаковыми и беззнаковыми числами.
- •60. Процедуры в ассемблере, передача параметров, возврат значений.
- •61. Операции с файлами: создание, открытие, закрытие.
- •62. Операции с файлами: чтение и запись данных.
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. Использование логических и сдвиговых операций.
12) Логические и сдвиговые операции.
Логичиские операции: 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