
- •Конспект лекций по ассемблеру
- •Структурная схема эвм
- •Организация памяти
- •Порты ввода/вывода
- •Сегментация памяти
- •Логические и физические адреса памяти
- •Адресация команд
- •Адресация данных
- •Адресация сегмента стека
- •Перемещаемые программы
- •Структура микропроцессора
- •Назначение регистров микропроцессора
- •Регистр флагов
- •Ассемблер
- •Выражения
- •Структура машинного оператора
- •Директивы ассемблера
- •Директивы определения данных
- •Определение слова
- •Команды и способы адресации операндов
- •Режимы адресации
- •Команда сложения add
- •Команда сложения с переносом adc
- •Команда вычитания sub
- •Imul – команда умножения со знаком
- •Idiv – команда деления со знаком
- •Команда сравнения cmp
- •Команды безусловного перехода jmp
- •1. Короткий относительный переход
- •2. Внутрисегментный переход
- •Команды условных переходов
- •Знаковые
- •Беззнаковые
- •Специальные
- •Способы адресации
- •Двухоперандные команды
- •Косвенная адресация
- •Регистровая адресация
- •Прямая адресация с индексированием
- •Прямая адресация с базированием
- •Адресация по сумме d8 и индексный регистр
- •Адресация по сумме базового регистра и смещения
- •Адресация с базированием и индексированием
- •Прямая адресация с базированием и индексированием
- •Двухоперандная команда, в которой второй операнд непосредственный
- •Формат двухоперандных команд с акумулятором и но
- •Форматы команды inc
- •Форматы команд pop и push
- •Однобайтные команды без операндов
- •Команды передачи данных mov
- •Команда обмена xchg
- •Команда загрузки исполнительного адреса lea
- •Команды управления циклами команда цикла loop
- •Команды переходов loopz, loope
- •Команды вызова подпрограмм call
- •Структура подпрограммы
- •Команды возврата
- •Передача параметров в процедуру
- •Примеры на обработку матрицы
- •Функции ввода/вывода
- •Функция вызова команды int 21h
- •Вывод на экран дисплея
- •Ввод с клавиатуры
- •Процедура ввода числа форматом слово
Команды вызова подпрограмм call
CALL < имя подпрограммы >
7 0 7 0 7 0
┌───────┐ ┌───────┐ ┌───────┐
│ KOP │ │dispL │ │ dispH │
└───────┘ └───────┘ └───────┘
\ /
смещение адреса подпрограммы относительно адреса следующей команды
CALL OP ;OP определяет адрес входа в п/п
;косвенный внутрисегментный вызов п/п
0) IP:=IP +3;адрес следующей команды, длина команды 3 байта
1) SP:= SP – 2
2) [SP]:= IP; сохраняем в стеке адрес возврата
3) IP := IP +disp16; в IP адрес подпрограммы.
Структура подпрограммы
N_proc proc near
; ------ ---- ----
; имя директива внутрисегментная
; любая последовательность команд
; к-во push & pop должно быть одинаковым
ret
N_proc endp
Команды возврата
RET – внутресегментный возврат
KOP = C3; однобайтная команда
0) IP := IP +1;
1) [SP]--> IP
2) SP:= SP-2
RETf – возврат из дальней процедуры. На практике использование данной команды
0) IP := IP +1; не планируется
1) [SP]--> IP
2) SP:= SP+2
3) [SP]--> CS
4) SP:=SP+2
Передача параметров в процедуру
Передача параметров через общее поле памяти
Рассмотрим пример программы.
DSEG SEGMENT
A DB 10 DUP (?)
N DW ?
DSEG ENDS
CSEG SEGMENT
MAIN PROC FAR
.........................
MAIN ENDP
P1 PROC NEAR
.........................
P1 ENDP
CSEG ENDS
END MAIN
Данные, описанные в DSEG доступны из любой точки программы ассемблера, отсюда и название – «передача данных в процедуру через общее поле памяти». В нашей программе обработка массива А может осуществляться с одинаковым успехом в процедурах MAIN и P1. На Паскале такой способ называют «передача параметров в процедуру через аппарат глобальных переменных», а именно: в описанной процедуре параметры отсутствуют.
На Паскале используют вложенные процедуры. Переменные внутри процедуры локальные, т.е. не доступные для других процедур.
На Ассемблере переменные одинаково доступные для всех процедур, поэтому, хотя и можно, но не целесообразно строить программу с вложенными процедурами.
Передача параметров через регистры пероцессора
Пусть процедура выполняет операцию: С = А + В
MOV AX,A
MOV BX,B
CALL PSUM
MOV C,AX
-----------------------------------------
PSUM PROC NEAR
ADD AX,BX
RET
PSUM ENDP
Параметры процедуры делят на входные и выходные. В данном примере входные параметры: регистры AX и BX, выходные – регистр AX.
Данный способ является самым быстрым, однако не основным, т. к. регистров в МП не очень много.
Передача параметров через стек
Данный способ является основным способом передачи параметров. Будет рассматриваться в следующем семестре.