- •Программирование на языке Ассемблер
- •Классификация языков программирования
- •Поколения мп
- •Структура мп 8086
- •Регистры мп
- •Регистры общего назначения
- •Сегментные регистры
- •Регистры смещений
- •Регистр флагов
- •Структура и организация памяти
- •Сегментация памяти и формирование адреса
- •Особенности машинных команд
- •Основные команды мп
- •1.2 Перестановка (exchange):
- •1.3 Загрузка исполнительного адреса (load effective address):
- •3.1 Команды умножения
- •3.2 Команды деления
- •Переходы. Циклы
- •Команды сравнения и условного перехода
- •Команды условного перехода
- •3. Команды управления циклом
- •Язык Ассемблера ibm pc. Структура операторов и директив. Метки, переменные и их атрибуты
- •Команды
- •Директивы
- •Директивы определения данных
- •Конструкция повторения dup
- •Директива dd (define double word, определить двойное слово)
- •Директивы эквивалентности и присваивания
- •Структура программы. Логические сегменты
- •Побитовая обработка и ее основные виды
- •2. Команды сдвига
- •2.1. Логические сдвиги
- •2.2. Арифметические сдвиги
- •2.3. Циклические сдвиги
- •Стек и сегмент стека
- •Стековые команды
- •Пример использования стека
- •Модульное программирование
- •Типы объединения модулей
- •Связь Паскаль-Ассемблер
- •Параметры-значения
- •Параметры-переменные
- •Способы адресации
- •Команды строковых примитивов
- •Сканирование строки: scasb, scasw
- •Приемы обработки структурированной информации
- •Inc si ; к следующей оценке
- •Inc dx ; учет отличника
- •Составление и оформление программ на ассемблере
- •Префикс программного сегмента. Com- и exe-программы
- •Команда прерывания
- •Функции прерывания 21h
- •Процесс разработки программы на языке ассемблера
- •Трансляция программы
- •Компоновка программы
- •Макроповторения
- •Макрооператоры
- •Директива local
- •Директивы условного ассемблирования
- •Директивы if и ife
- •Директивы ifidn и ifdif
Типы объединения модулей
<имя сегмента> SEGMENT <параметр(ы)>
[<объединение>]
Параметр «объединение» может принимать следующие значения: PUBLIC, COMMON, STACK.
Обращение к внешним идентификаторам
Внешние имена
Директива EXTRN (external, внешний):
EXTRN <имя>: <тип>, …, <имя>: <тип>
EXTRN X: BYTE ; переменная X размером в байт
Общие имена
Директива PUBLIC
PUBLIC <имя>, …, <имя>
PUBLIC X
Процедуры
.
Описание подпрограммы в виде процедуры:
<имя процедуры> PROC <параметр>
<тело процедуры>
<имя процедуры> ENDP
При параметре NEAR или при его отсутствии процедура называется «близкой», при параметре FAR – «дальней».
Вызов процедур и возврат из них
Чтобы из основной программы вызвать процедуру, необходимо указать в команде перехода имя процедуры.
При обращении к процедуре основная программа обязана сообщить ей адрес возврата.
Как сообщить адрес возврата?
Передать через регистр: основная программа записывает в некоторый регистр адрес возврата, а процедура извлекает его оттуда и делает по нему переход.
Передать через стек: основная программа записывает адрес возврата в стек, а процедура считывает его и использует для перехода.
В большинстве случаев принято передавать адрес возврата через стек. В систему команд МП введены специальные команды, которые упрощают реализацию переходов между основной программой и процедурами.
Вызов процедуры (переход с возвратом):
CALL <имя процедуры>
Возврат из процедуры (return):
RET
Связь Паскаль-Ассемблер
Директива компилятора $L: предназначена для поиска объектного файла и компоновке его с программой.
Внешние подпрограммы: каждая процедура или функция ассемблера, которую вы хотите сделать доступной в программе, должна объявляться, как идентификатор PUBLIC, и ей должно соответствовать в программе описание external (внешняя).
Соглашения по передаче параметров: для передачи параметров используется стек центрального процессора. Параметры всегда вычисляются и заносятся в стек в том порядке, в котором они указываются в описании подпрограммы, слева направо.
Параметры-значения
Параметр-значение – это параметр, значение которого не может изменяться подпрограммой, в которую он передается.
Параметры-значения передаются в одном направлении: в подпрограмму передается значение параметра, но любые изменения этого параметра не оказывают влияния на действительную переменную, которая использовалась при вызове подпрограммы. Подпрограмме передается не адрес этой переменной, а копия ее значения и поэтому сама переменная не изменяется.
Параметры-переменные
В отличии от параметров-значений параметры-переменные передаются посредством помещения в стек адресов. Это значит, что подпрограмма работает непосредственно с этими переменными. Параметры-переменные передаются в обоих направлениях, т.е. информация передается в подпрограмму и может также передаваться обратно в вызывающую программу, поскольку значение параметров может меняться. Чтобы передать адрес фактического параметра, в списке формальных параметров прописывают перед параметром слово var.
Обеспечение стека:
RET N (где N - это число байт передаваемых, то есть занесенных в стек, параметров)
Сохранить адрес возврата в регистрах (или в памяти) и извлечь параметры из стека поочередно.
Передача параметров через стек
PUSH BP
MOV BP, SP
PUSHA
POPA
POP BP
RET k
Загрузка дальнего указателя: LDS reg,mem
Команда загружает операнд памяти (двойное слово) в регистр сегмента и в регистр-получатель.
{$L sum.obj}
Program abc;
Uses CRT;
Const n=20;
Type tm = Array[1..n] of integer;
Var A: tm; i, s :integer;
Procedure SUM (Var A: tm; k:integer; var s: integer);external;
Begin
Clrscr; Randomize;
For i:= 1 to n do begin
A[i]:= Random (100);
Write (A[i]:3);
End;
SUM(A,n,s);
Writeln;
Write(s);
Readkey;
End.
.286 ; указание типа процессора и набора команд
public sum
stack1 segment stack
db 128 dup (?)
stack1 ends
code segment byte public
assume cs:code, ss:stack1
sum proc near
push bp
mov bp,sp
pusha
lds si,[bp+10]
mov cx,[bp+8]
lds di,[bp+4]
mov ax,0
cycl: add ax,[si]
add si,2
loop cycl
mov [di],ax
popa
pop bp
ret 10
sum endp
code ends
end