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

UptoLike

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

79
int 20h
text db 0dh,0ah,0ah
db 'Программа выполнена',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
dend: ; Метка для определения конца пересылаемой процедуры
Code ENDS ; Конец сегмента (кодового)
END Start ; Указание точки входа в программу
б) Использование команды RETF
Assume CS: Code;, DS: Code
Code SEGMENT
org 100h
len equ dend-dal ; Длина пересылаемой процедуры
s_dal equ 8800h ; Сегмент места пересылки процедуры
Start:
.386
cld
mov ax,cs
mov ds,ax ; DS = CS
; Перенос процедуры DAL в область 8800h
mov ax,s_dal
mov es,ax ; ES = s_dal
lea si,dal ; SI = offset DAL
xor di,di ; DI = 0
mov cx,len ; CX = длине пересылаемой проц.
rep stosb ; DS:SI ES:DI
; Стирание процедуры в тексте
                                     79



      int     20h
text db       0dh,0ah,0ah
      db      'Программа выполнена',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
dend: ; Метка для определения конца пересылаемой процедуры
Code ENDS ; Конец сегмента (кодового)
      END Start ; Указание точки входа в программу

б) Использование команды RETF
Assume CS: Code;, DS: Code
Code SEGMENT
       org 100h
len equ dend-dal       ; Длина пересылаемой процедуры
s_dal equ 8800h       ; Сегмент места пересылки процедуры
Start:
       .386
       cld
       mov ax,cs
       mov ds,ax      ; DS = CS
; Перенос процедуры DAL в область 8800h
       mov ax,s_dal
       mov es,ax      ; ES = s_dal
       lea si,dal     ; SI = offset DAL
       xor di,di      ; DI = 0
       mov cx,len     ; CX = длине пересылаемой проц.
       rep stosb      ; DS:SI ⇒ ES:DI
; Стирание процедуры в тексте