Команды ассемблера
Подпрограммы
Синтаксис
Передача параметров в подпрограммы
Вызов подпрограммы
Возврат из подпрограммы RET
Прерывания DOS и BIOS
615.04K
Category: programmingprogramming

презенташки

1. Команды ассемблера

1
Команды
ассемблера
ПОДПРОГРАММЫ И ПРЕРЫВАНИЯ

2. Подпрограммы

2
Из одной главной программы вызываются процедуры на
выполнение. После завершения работы процедуры
возвращают управление главной программе и
выполнение продолжается с команды, следующей за
командой вызова подпрограммы.
Язык программирования Ассемблера поддерживает
применение процедур двух типов:
ближнего (near) – процедуры должны находится в том же
сегменте, что и вызывающая программа,
дальнего (far) – к процедуре можно обращаться из любого
другого кодового сегмента

3.

3
При вызове процедуры в стеке сохраняется адрес
возврата в вызывающую программу:
при вызове ближней процедуры – слово,
содержащее смещение точки вызова
относительно текущего кодового сегмента;
при вызове дальней процедуры – слово,
содержащее адрес сегмента, в котором
расположена точка возврата, и слово,
содержащее смещение точки возврата в этом
сегменте.

4. Синтаксис

<имя_процедуры>
4
PROC <параметр>
<тело_процедуры>
<имя_процедуры>
ENDP
Следует обратить внимание, что в директиве PROC
после имени не ставится двоеточие, хотя имя и
считается меткой.
Параметр, указываемый после ключевого слова
PROC, определяет тип процедуры: ближний
(NEAR) или дальний (FAR). Если параметр
отсутствует, то по умолчанию процедура
считается ближней.

5. Передача параметров в подпрограммы

5
Через регистры: основная программа
записывает параметры в какие-либо регистры,
а процедура по мере необходимости
извлекает их из этих регистров и использует в
своей работе. Такой способ имеет один
основной недостаток: передавать параметры
через регистры можно если их немного (если
много, то просто не хватит регистров).
Через стек: в этом случае основная программа
записывает параметры в стек и вызывает
подпрограмму, подпрограмма работает с
параметрами и, возвращая управление,
очищает стек.

6. Вызов подпрограммы

6
Вызов подпрограммы - CALL.
NEAR CALL (внутрисегментный). Указывает новое
значение регистра IP и сохраняет старое
значение счетчика команд (IP) в стеке в качестве
адреса возврата.
FAR CALL (межсегментный) – задает новые
значения сегмента CS и смещения IP для
дальнейшего выполнения программы и
сохраняет в стеке как регистр IP, так и
регистр CS.

7. Возврат из подпрограммы RET

7
внутрисегментный возврат извлекает из стека одно слово и
помещает его в регистр IP;
межсегментный возврат извлекает из стека два слова,
помещая слова из меньшего адреса в регистр IP, а слово
из большего адреса – в регистр CS.
Команда RET может иметь операнд, который представляет
собой значение, прибавляемое микропроцессором к
содержимому указателя стека SP после извлечения
адреса возврата (очистка стека).

8. Прерывания DOS и BIOS

Прерывания DOS и BIOS
8
Это обычные процедуры, написанные разработчиками
операционной системы (прерывания DOS) или
разработчиками аппаратных средств компьютера
(прерывания BIOS).
Для вызова используется команда
INT <номер прерывания> (INT 10h, INT 21h)
После такой команды начинает работать подпрограмма
обработки прерывания, начальный адрес которой записан
в таблице векторов прерываний под соответствующим
номером.

9.

9
Процедуры объединяются в группы. Перед вызовом
прерывания в регистр AH заносится номер
необходимой функции:
MOV AH,<номер функции>
INT <номер прерывания>
Ниже приведен пример использования прерывания
21H функции 02 для вывода символа на экран.
MOV AH,02h
;AH – номер функции
MOV DL,’a’
;DL – выводимый символ
INT 21h
;инициализация прерывания

10.

10
CALL m1
MOV AX, 2
RET ; вернуться в операционную систему.
m1 PROC
MOV BX, 5
RET ; вернуться в программу, из которой была вызвана.
m1 ENDP
END

11.

11
LEA SI, msg ; загрузить адрес msg в регистр SI.
CALL print_me
RET ; вернуться в ОС.
;==========================================
; эта процедура печатает строку, строка должна
оканчиваться
; нулем (иметь ноль в конце), адрес строки должен быть в
; регистре SI:
print_me PROC
next_char:
CMP [SI], 0 ; проверить регистр SI, если он
JE stop ; равен 0, перейти к метке stop

12.

12
MOV AL, [SI] ; иначе получить ASCII-символ.
MOV AH, 0Eh ; номер функции для печати символа.
INT 10h ; используем прерывание для печати
; символа из AL.
ADD SI, 1 ; увеличить индекс строкового массива
JMP next_char ; вернуться и напечатать другой символ
stop: RET ; вернуться в программу.
print_me ENDP
;========================================
msg DB 'Hello World!', 0 ; строка с нулевым окончанием END
English     Русский Rules