Системное программное обеспечение. Рощин А.В. - 82 стр.

UptoLike

Составители: 

82
mov cx,16 ; нацело делится на 16
div cx ; AX = (offset DAL)/16
mov dx,ax ; DX = (offset DAL)/16
mov ax,s_dal
sub ax,dx ; AX = s_dal – (offset DAL)/16
mov ds,ax ; DS = s_dal – (offset dal)/16
;**** Переменная часть Подготовка возврата в стеке
mov ax,cs
push ax ; CS stack
lea ax,l ; CS:(offset L) – точка возврата
push ax ; offset L stack
; Переход на дальнюю процедуру
jmp dword ptr addr ; Переход на s_dal:0000
;*************** Конец переменной части ******************
; Точка возвратапечать сообщения о завершении
l: pop ds ; Восстановление местного DS
mov ah,9 ; Функция 9
lea dx,text ; DS:DX – смещение текста сообщения
int 21h ; Вызов функции DOS
; Ожидание ввода клавиши пробела
loop1: mov ah,0 ; Функция 0
int 16h ; Клавиатурное
прерывание
cmp al,' ' ; Пробел ?
jnz loop1 ; Нет !
int 20h
text db 0dh,0ah,0ah,'Программа выполнена',0dh,0ah,'$'
; Выравнивание начала засылаемой процедуры на начало параграфа
if ($-start)mod 16 (если не 0) ; Псевдокоманда
org $+(16-($-start)mod 16) ; условного
endif ; ассемблирования
; Процедура, которая пересылается в область s_dal.
; Она начинается здесь на границе параграфа.
; Когда эта процедура находится в области s_dal,
; значение DS = s_dal – (offset dal)/16
dal proc far ; Дальняя процедура (т.е. будет дальний возврат – retf)
mov ah,9 ; Функция 9
lea dx,text1 ; DS:DX – смещение
текста сообщения
int 21h ; Вызов функции DOS
; Ожидание ввода клавиши ENTER
dal1: mov ah,0 ; Функция 0
int 16h ; Клавиатурное прерывание
cmp al,0dh ; ENTER ?
jnz dal1 ; Нет !
ret ; Возврат дальний !!!
text1 db 0dh,0ah,0ah,'Я нахожусь по адресу S_DAL',0dh,0ah,'$'
dal endp
                                     82



       mov cx,16           ; нацело делится на 16
       div cx              ; AX = (offset DAL)/16
       mov dx,ax           ; DX = (offset DAL)/16
       mov ax,s_dal
       sub ax,dx           ; AX = s_dal – (offset DAL)/16
       mov ds,ax           ; DS = s_dal – (offset dal)/16
;**** Переменная часть Подготовка возврата в стеке
       mov ax,cs
       push ax             ; CS ⇒ stack
       lea ax,l            ; CS:(offset L) – точка возврата
       push ax             ; offset L ⇒ stack
; Переход на дальнюю процедуру
       jmp dword ptr addr         ; Переход на s_dal:0000
;*************** Конец переменной части ******************
; Точка возврата – печать сообщения о завершении
l:     pop ds              ; Восстановление местного DS
       mov ah,9            ; Функция 9
       lea dx,text         ; DS:DX – смещение текста сообщения
       int     21h         ; Вызов функции DOS
; Ожидание ввода клавиши пробела
loop1: mov ah,0            ; Функция 0
       int     16h         ; Клавиатурное прерывание
       cmp al,' '          ; Пробел ?
       jnz loop1           ; Нет !
       int     20h
text db        0dh,0ah,0ah,'Программа выполнена',0dh,0ah,'$'
; Выравнивание начала засылаемой процедуры на начало параграфа
       if ($-start)mod 16 (если не 0)          ; Псевдокоманда
               org $+(16-($-start)mod 16)      ; условного
       endif                                   ; ассемблирования
; Процедура, которая пересылается в область s_dal.
; Она начинается здесь на границе параграфа.
; Когда эта процедура находится в области s_dal,
; значение DS = s_dal – (offset dal)/16
dal proc far         ; Дальняя процедура (т.е. будет дальний возврат – retf)
       mov ah,9 ; Функция 9
       lea dx,text1        ; DS:DX – смещение текста сообщения
       int     21h         ; Вызов функции DOS
; Ожидание ввода клавиши ENTER
dal1: mov ah,0             ; Функция 0
       int     16h         ; Клавиатурное прерывание
       cmp al,0dh          ; ENTER ?
       jnz dal1            ; Нет !
       ret                 ; Возврат дальний !!!
text1 db       0dh,0ah,0ah,'Я нахожусь по адресу S_DAL',0dh,0ah,'$'
dal endp