- •1. Обработка символьной информации
- •Команды префикса повторения.
- •Примеры программ, реализующих действия со строками.
- •Практическая часть.
- •Контрольные вопросы и задания.
- •Передача параметров в процедуру.
- •1. Передача через регистры: программа перед вызовом заносит входные параметры в некоторые регистры процессора, а после возврата выбирает из регистров значения результатов.
- •Модульная структура программ на языке Ассемблера.
- •Работа с командой прерываний int.
- •Практические задания.
- •Синтаксис:
- •Команды сдвига.
- •Команды логического сдвига shl и shr.
- •Команды арифметического сдвига sal и sar.
- •Команды циклического сдвига: rol и ror, rcl и rcr.
- •Использование логических и арифметических команд сдвига.
- •1. Команды логического сдвига. Используются для выполнения быстрого умножение и деление целых чисел на степени двойки, на 2 k.
- •Литература
Передача параметров в процедуру.
Передавать фактические параметры процедуре можно по-разному. Используются несколько способов передачи параметров. Выбор конкретного способа для определенной задачи зависит от количества используемых параметров и сложности их обработки.
1. Передача через регистры: программа перед вызовом заносит входные параметры в некоторые регистры процессора, а после возврата выбирает из регистров значения результатов.
Передача параметров по значению: перед обращением к процедуре основная процедура вычисляет значения фактических параметров и записывает их в регистры.
Пример. 1. Вычислить c=max (a, b)+max (5, a-l), где все числа - знаковые размером в слово. Вычисление max (х, у) описать как процедуру. Условия передачи параметров: первый параметр (х) - через регистр АХ, второй параметр (у) - через регистр ВХ, результат (max) - в регистре АХ.
При этих условиях процедура и соответствующий фрагмент основной программы выглядят следующим образом: (для примера опишем процедуру как дальнюю):
; процедура: АХ= max (АХ, ВХ) |
; основная программа |
||||
MAX |
PROC |
FAR |
MOV |
AX, А |
; АХ:=а |
|
CMP |
AX, BX |
MOV |
ВХ, В |
; ВХ:=b |
|
JGE |
MAX1 |
CALL |
MAX |
; АХ:=mах (а, b) |
|
MOV |
AX, BX |
MOV |
С, АХ |
; сохранить АХ |
МАХ1: |
RET |
|
MOV |
AX, 5 |
; АХ:=5 |
|
MAX |
ENDP |
MOV |
ВХ, А |
|
|
|
|
DEC |
ВХ |
; ВХ:=а-1 |
|
|
|
CALL |
MAX |
; AX:=max (5, a-l) |
|
|
|
ADD |
С, АХ |
; С:=mах (а, b)+mах (5, а-1) |
Передача параметров по ссылке означает передачу адреса (имени) ячейки, соответствующей фактическому параметру, через регистр: основная программа записывает в какой-то регистр адрес фактической переменной, а процедура берет его оттуда. Используют регистры-модификаторы ВХ, ВР, SI или DI, т.к. процедуре придется модифицировать по этому регистру.
Пример 2. Возьмем следующую процедуру на языке Паскаль:
procedure D (var x:integer);:=x div 16;
Пусть в программе есть такие обращения к ней: D(A) и D(B), где А и В-имена переменных, значениями которых являются неотрицательные числа. Используем регистр ВХ: к началу выполнения процедуры в регистре ВХ должен находиться адрес той ячейки (А или В), содержимое которой она изменяет. Доступ к ячейки в этом случае можно получить с помощью конструкции [ВХ].
Фрагмент основной программы, соответствующий обращениям D(A) и D(B):
; процедура |
; основная программа |
|||||
D |
PROC |
|
LEA |
BX, A |
; ВХ=адрес А |
|
|
PUSH СХ |
; сохранить cx |
CALL |
D |
D(A) |
|
|
MOV CL, 4 |
|
LEA |
BX, B |
; ВХ=адрес В |
|
|
SHR WORD PTR [BX], CL |
X:=x div 16 |
CALL |
D |
; D(B) |
|
|
POP CX |
; восстановить СХ |
|
|
|
|
|
RET |
|
|
|
|
|
D |
ENDP |
|
|
|
|
Замечание. В начале своей работы процедура должна сохранить в стеке значения тех регистров, которые ей потребуются для работы. Перед выходом она должна восстановить прежние значения этих регистров, считав их из стека.
В случае, когда параметром процедуры являются данные сложных типов, они также передаются в процедуру по ссылке с использованием одного из регистров-модификаторов и косвенной адресации.
. Передача через стек: программа перед вызовом заносит параметры в стек с помощью команды push. Чтобы подпрограмма могла изменять значения параметров, следует передавать ей не сами значения, а адреса параметров. Используется в случае большого количества параметров.
Выполнение процедуры должно начинаться со следующих команд («входные» действия процедуры):
Р PROCUSH ВР; сохранить ВРBP, SP; ВР - на вершину стека
…
команды процедуры
После записи в стек старого значения ВР (ВРст) для доступа к параметрам процедуры надо использовать выражение вида [ВР+i], где i=2*n (n - размерность параметра).
При выходе из процедуры стек должен быть в том же состоянии, в каком он был после «входных» действий. Для восстановления состояния стека выполняются «выходные» действия:
POP ВР; восстановить старое значение ВР2*k; очистка стека от k параметров-слов и возврат
Р ENDP
По команде RET i*k из стека удаляется адрес возврата, затем стек очищается на указанное операндом число байтов и далее выполняется переход по адресу возврата.