ВУЗ:
Составители:
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
; Стирание процедуры в тексте
Страницы
- « первая
- ‹ предыдущая
- …
- 77
- 78
- 79
- 80
- 81
- …
- следующая ›
- последняя »
