- •Assembler.
- •Организация выполняемых программ в ms – dos.
- •Система команд процессора Intel 86.
- •Директивы ассемблера
- •Основные группы команд.
- •Использование процедур в ассемблере.
- •Режим адресации в памяти и микропроцессоре Intel 86.
- •Определение физического адреса.
- •Связь ассемблера с языками высокого уровня
Использование процедур в ассемблере.
Ассемблер относится как к процедурным языкам (Pascal, C, …), так и к непроцедурным. Считается удобным фрагменты текста на ассемблере оформлять в виде процедур, однако оператор CALL far PTR [BX] позволяет обращаться в произвольное место программы, имя процедуры не используется.
Явное описание процедур:
имя_процедуры PROC [тип] [язык] [uses regs]
тело процедуры
ret; retf или retn
имя_процедуры ENDP
тип: far, near (по умолчанию- near);
язык: (по умолчанию- ассемблер);
regs- сохраняются в стеке.
Схема вызова процедуры. При вызове типа NEAR обрабатывание CS не происходит.
My_Proc ENDP
Ret
- - - - - - - - - - - - Стек
My_Proc PROC IP
CS
- - - - - - - - - - - -
Call My_Proc CS IP
Обеспечивается вложенность процедур (ограничена стеком), могут организовываться рекурсивные вызовы. Этапы выполнения процедуры:
подготовка параметров для работы с процедурой (типы параметров: значения , ссылки, возвращаемые значения, именования (при макровызовах));
сохранение адреса возврата;
передача управления на начало процедуры;
выполнение тела процедуры, включая сохранение регистров, фиксацию результатов, фиксацию кода завершения, восстановление регистров;
возвращение в основную программу в место после команды вызова, может быть с очисткой стека.
Способы передачи параметров.
1). Передача параметров через РОН.
Достоинства: быстрый и удобный;
Недостатки: ограничен в размерах (не более 5).
Применение: написание операционных систем (печать строки. и др.).
2). Передача через общую область памяти. (общие переменные)
Общие переменные описываются следующим образом,
в вызывающей:
PUBLIC список имен (имена переменных или меток).
В вызываемой процедуре:
EXTERN {имя параметра, тип}
Пример:
;головная программа
DATA Segment
EXTERN A:WORD, R:WORD
DATA ENDS
CODE Segment PUBLIC
ASSUME DS:DATA,CS:CODE
PUBLIC PUB_PROC FAR
start:
mov AX, DATA
mov DS, AX
CALL far ptr pub_proc
mov cx, ds:A
sub cx, 2
add cx, ds:R
mov ds:A,cx
ret
CODE ENDP
END start
;Модуль, задающий общие переменные и процедура.
DATA Segment
PUBLIC A, R
A DW 10
B DW 5
C DW 3
B DW 1
DATA ENDS
CODE Segment PUBLIC
ASSUME DS:DATA,CS:CODE
Public Pub_Proc
Pub_Proc Proc Far
mov AX, B
add AX, C
mov R, AX
ret
Pub_Proc ENDP
CODE ENDS
END
3). Передача параметров через стек.
Такой метод применим не только между ассемблерными модулями, но и с разными языками. STDCALL- стандартная взаимосвязь процедур по параметрам. Основным средством доступа к параметрам является BP, для которого:
его значение при запуске процедуры сохраняется в стеке;
доступ к параметрам осуществляется с помощью базовой адресации
Структура стека на момент начала работы с параметрами вызванной процедуры:
(Этот вариант используется в языке С.)
BP |
SPBP |
CS:IP |
(BP)+2 |
Par1 |
(BP)+4/6 |
Par2 |
(BP)+6/8 |
……… |
|
ParN |
(BP)+(N+4)/(N+6) |
Стек |
|
Вариант для Pascal такой же, за исключением порядка параметров.
Пример:
;main
CODE Segment
EXTERN ADD3UP
Push AX
Push BX
Push CX
CALL ADD3UP
ADD SP,6
CODE ENDS
END start
;процедура обработки
ADD3UP Proc NEAR
Public ADD3UP
Push BP
mov BP, SP
mov AX, [BP+4]
add AX, [BP+6]
add AX, [BP+8]
pop BP
ret
ADD3UP ENDP
4). Передача параметров через поток кода.
Передаваемые параметры размещаются непосредственно в коде программы, сразу за вызывающей командой.
Пример:
Call Print_It
db ‘печатная строка’
;продолжение программы.
Плюсы: возможность использования любого числа параметров;
Недостатки: доступ косвенный, следовательно медленный.
5). Передача параметров результата.
Передача параметров результатов может быть реализована через стек, AX (BYTE, WORD), DX:AX (DWORD), ST(0)- вершина стека x87 (FLOAT).