- •Системы счисления, используемые на компьютере. Десятичная система, двоичная и 16-ричная системы счисления. Правила перевода.
- •Арифметические операции в двоичной системе счисления. Понятие прямого, обратного и дополнительного кода. Сложение и вычитание целых чисел в двоичной системе счисления.
- •Арифметические операции в двоичной системе счисления. Представление вещественных чисел в компьютере. Сложение и вычитание вещественных чисел в двоичной системе счисления.
- •Основные логические операции: and, or, not, xor. Таблицы истинности для этих операций. Основные тождества булевой алгебры.
- •Понятие об информации и науке информатике. Исторические этапы способов обработки, хранения и передачи информации.
- •Функции компьютера. Их краткая характеристика.
- •Структура компьютера. Основные компоненты компьютера и их характеристика. Состав центрального процессора.
- •Язык блок-схем. Основные типы блоков. Понятие структуры. Виды структур.
- •17. Основные типы алгоритмов и способы их записи на языке блок-схем.
- •18. Архитектура эвм. Особенности фон Неймановской архитектуры.
- •Оперативная память компьютера. Понятие бита, байта, слова, двойного слова. Понятие адреса байта и слова.
- •Регистры центрального процессора. Краткая характеристика регистров общего назначения.
- •Регистры центрального процессора. Сегментные регистры и указатель команд. Регистр флагов.
- •Представление данных на компьютере. Представление целых чисел без знака и со знаком.
- •23 Представление данных на компьютере. Представление символьных данных и представление команд.
- •Понятие о языке Ассемблера. Этапы разработки программы на ассемблере.
- •Windows api функция для вывода символов на экран. Ее основные параметры и их назначение.
- •Windows api функция для ввода символов с консоли. Ее основные параметры и их назначение.
- •Особенности сложения и вычитания целых (в том числе и знаковых) чисел на Ассемблере.
- •29. Команды умножения и деления на Ассемблере.
- •30. Директивы определения данных.
- •33. Модификация адресов на ассемблере. Индексирование в одномерном массиве.
- •34. Модификация по нескольким регистрам на ассемблере. Обработка двумерных массивов.
- •Процедуры на Ассемблере. Правила оформления процедуры и обращения к ней.
- •36. Процедуры на Ассемблере. Передача параметров в процедуру. Рекурсивные процедуры.
- •Работа с файлами на Ассемблере. Открытие и закрытие файлов. Windows api процедуры открытия и закрытия файлов, их параметры.
- •38. Чтение из файла и запись в файл. Windows api процедуры записи и чтения файлов, их параметры.
- •39. Работа с вещественными числами на Ассемблере. Математический сопроцессор и его регистры. Форматы записи вещественных чисел.
- •40. Работа с вещественными числами на Ассемблере. Команды передачи данных и арифметические команды математического сопроцессора.
33. Модификация адресов на ассемблере. Индексирование в одномерном массиве.
Идея модификации адреса заключается в возможности программного изменения адреса операнда, обрабатываемого, какой-либо командой.
Ранее указывали точные адреса для операндов из памяти:MOV CX,A
Но можно вместе с адресом указать регистр: MOV CX, A[BX]
Тогда команда будет работать не с указанным в ней адресом A, а с так называемым исполнительным адресом
Aисп = (A+[BX]) mod 216
Здесь [BX] обозначает содержимое регистра BX. Иначе говоря, прежде чем выполнить команду, процессор прибавит к адресу A, указанному в команде, текущее значение регистра BX, получит новый адрес и именно из ячейки с этим адресом возьмет второй операнд. Если в результате сложения получится слишком большая сумма, то от нее берется только последние 16 битов, на что и указывает операция mod в приведенной формуле.
Регистры-модификаторы
Замена адреса из команды на исполнительный адрес называется модификацией адреса, а регистр, участвующий в модификации, принято называть регистром-модификатором. В качестве модификатора может выступать не любой регистр, а только один из следующих четырех: BX, BP, SI и DI.
Модификация адресов потребуется, например, при работе с индексами массивов.
ИНДЕКСИРОВАНИЕ В ОДНОМЕРНОМ МАССИВЕ
Пример. Пусть имеется массив X DW 100 DUP (?) (т.е. имеется массив X[0..99] ). Требуется записать в регистр AX сумму его элементов.
Для нахождения суммы, как ясно, нужно сначала в AX записать 0, а затем в цикле выполнять операцию AX:=AX+X[i] при i от 0 до 99. Поскольку адрес элемента X[I] равен X+2*I , то команда, соответствующая данной операции должна быть следующей:
ADD AX, X+2*I
Но такая команда запрещена – вторая ее часть (адрес) меняется. Чтобы разрешить эту проблему и используется модификация адресов. В данном случае будем заносить переменное слагаемое (2*I) в регистр SI и команда перепишется в виде:
ADD AX, X[SI]
Чтобы правильно менять содержимое регистра SI, нужно сначала в SI занести 0, а затем увеличивать его значение с шагом 2. В результате наша команда будет работать с адресами X, X+2, x+4,… X+198 (напомним, что массив двумерный и общее число элементов равно 200).
Поскольку в данном случае регистр-модификатор используется для хранения индекса, то такой регистр называют индексным, а описанный способ получения адреса переменной с индексом – индексированием.
В итоге фрагмент программы нахождения суммы элементов массива X имеет вид:
MOV AX,0 ; начальное значение суммы
MOV CX,100 ; счетчик цикла
MOV SI,0 ; начальное значение (удв-го) индекса
L: ADD AX,X[SI] ; AX:=AX+X[I]
ADD SI,2 ; следующий индекс
LOOP L ; цикл 100 раз
34. Модификация по нескольким регистрам на ассемблере. Обработка двумерных массивов.
Идея модификации адреса заключается в возможности программного изменения адреса операнда, обрабатываемого, какой-либо командой.
Ранее указывали точные адреса для операндов из памяти:MOV CX,A
Но можно вместе с адресом указать регистр: MOV CX, A[BX]
Тогда команда будет работать не с указанным в ней адресом A, а с так называемым исполнительным адресом
Aисп = (A+[BX]) mod 216
Здесь [BX] обозначает содержимое регистра BX. Иначе говоря, прежде чем выполнить команду, процессор прибавит к адресу A, указанному в команде, текущее значение регистра BX, получит новый адрес и именно из ячейки с этим адресом возьмет второй операнд. Если в результате сложения получится слишком большая сумма, то от нее берется только последние 16 битов, на что и указывает операция mod в приведенной формуле.
Регистры-модификаторы
Замена адреса из команды на исполнительный адрес называется модификацией адреса, а регистр, участвующий в модификации, принято называть регистром-модификатором. В качестве модификатора может выступать не любой регистр, а только один из следующих четырех: BX, BP, SI и DI.
Модификация адресов потребуется, например, при работе с индексами массивов.
ИНДЕКСИРОВАНИЕ В ДВУМЕРНЫХ МАССИВОВ
В ПК разрешено указывать сразу два модификатора, причем один из них обязательно должен быть BX или BP, а другой – регистром SI или DI (модифицировать по парам BX и BP или SI и DI нельзя). Применим это на примере.
Пример. Пусть имеется матрица (двумерный массив) размером 10х20:
A DB 10 DUP (20 DUP(?)) (т.е A[0..9,0..19] ) Требуется записать в регистр AL количество таких строк этой матрицы, в которых начальный элемент строки встречается еще раз.
При расположении элементов матрицы в памяти по строкам (первые 20 байтов – начальная строка матрицы, следующие 20 байтов – вторая строка и т.д.) адрес элемента A[i,j] равен A+20*i+j.
Для хранения величины 20*i отведем регистр BX, а для хранения j – регистр SI. Тогда A[BX] – это начальный адрес I-й строки матрицы, а A[BX][SI] - адрес j-го элемента этой строки.
MOV AL,0 ; количество искомых строк
; внешний цикл по строкам
MOV CX,10 ; счетчик внешнего цикла
MOV BX,0 ; смещение от А до начала ; строки (20*I)
L: MOV AH, A[BX] ; AH – нач.элемент строки
MOV DX, CX ; запоминание CX внешнего цикла
; внутренний цикл по столбцам
MOV CX, 19 ; задание счетчика внутр. цикла
MOV SI,0 ; индекс элемента внутри строки (j)
L1: INC SI ; j:=j+1
CMP A[BX][SI], AH ; A[i,j] =AH ?
LOOPNE L1 ; цикл, пока A[I,j]<>AH, но не более 19 раз
JNE L2 ; AH не повторился –> L2
INC AL ; учет строки
;конец внутреннего цикла
L2: MOV CX, DX ; восстановить CX для внешнего цикла
ADD BX, 20 ; на начало следующей строки
LOOP L ; цикл 10 раз
Здесь дополнительно использован вариант команды цикла LOOPNE, которая осуществит выход из цикла не только при равенстве вышесравниваемых значений, но и при счетчике (CX) равном нулю.