ВУЗ:
Составители:
80
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 ; Мы знаем, что это смещение
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
; Подготовка перехода в стеке
mov ax,s_dal
push ax ; s_dal ⇒ stack
xor ax,ax ; s_dal:0000 – Начало проц. в памяти
push ax ; 0 ⇒
stack
; Переход на дальнюю процедуру
retf ; Переход на 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.
80
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 ; Мы знаем, что это смещение
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
; Подготовка перехода в стеке
mov ax,s_dal
push ax ; s_dal ⇒ stack
xor ax,ax ; s_dal:0000 – Начало проц. в памяти
push ax ; 0 ⇒ stack
; Переход на дальнюю процедуру
retf ; Переход на 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.
Страницы
- « первая
- ‹ предыдущая
- …
- 78
- 79
- 80
- 81
- 82
- …
- следующая ›
- последняя »
