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

UptoLike

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

81
; Она начинается здесь на границе параграфа.
; Когда эта процедура находится в области 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 ; Указание точки входа в программу
в) Использование команды JMP dword ptr
Assume CS: Code;, DS: Code
Code SEGMENT
org 100h
Start: jmp start1
len equ dend-dal ; Длина пересылаемой процедуры
s_dal equ 8800h ; Сегмент места пересылки процедуры
addr dw 0,s_dal ; Дальний адрес места назначения
start1: cld
mov ax,cs
mov ds,ax ; DS = CS
; Перенос процедуры DAL в область 8800h
les di,dword ptr addr ; ES:DI = s_dal:0000
lea si,dal ; SI = offset DAL
mov cx,len ; CX = длине пересылаемой проц.
rep stosb ; DS:SI ES:DI
; Стирание процедуры в тексте
mov ax,cs
mov es,ax ; ES = CS
lea di,dal ; DI = offset DAL
mov cx,len ; CX = длине пересылаемой проц.
xor ax,ax ; АХ=0 для стирания процедуры
rep movsb ; AX(0) ES:DI
; Вычисление значения DS для дальней процедуры
push ds ; DS ctack
lea ax,dal ; offset DAL
xor dx,dx ; Мы знаем, что это смещение
                                   81



; Она начинается здесь на границе параграфа.
; Когда эта процедура находится в области 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 ; Указание точки входа в программу

в) Использование команды JMP dword ptr
Assume CS: Code;, DS: Code
Code SEGMENT
       org 100h
Start: jmp start1
len equ dend-dal        ; Длина пересылаемой процедуры
s_dal equ 8800h         ; Сегмент места пересылки процедуры
addr dw 0,s_dal         ; Дальний адрес места назначения
start1: cld
       mov ax,cs
       mov ds,ax        ; DS = CS
; Перенос процедуры DAL в область 8800h
       les di,dword ptr addr ; ES:DI = s_dal:0000
       lea si,dal       ; SI = offset DAL
       mov cx,len       ; CX = длине пересылаемой проц.
       rep stosb        ; DS:SI ⇒ ES:DI
; Стирание процедуры в тексте
       mov ax,cs
       mov es,ax        ; ES = CS
       lea di,dal       ; DI = offset DAL
       mov cx,len       ; CX = длине пересылаемой проц.
       xor ax,ax        ; АХ=0 для стирания процедуры
       rep movsb        ; AX(0) ⇒ ES:DI
; Вычисление значения DS для дальней процедуры
       push ds          ; DS ⇒ ctack
       lea ax,dal       ; offset DAL
       xor dx,dx        ; Мы знаем, что это смещение