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

UptoLike

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

78
a) Использование команды CALL 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 ; Мы знаем, что это смещение
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
;***** Переменная часть *** Переход на дальнюю процедуру
call 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 ; Нет !
                                   78



a) Использование команды CALL 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         ; Мы знаем, что это смещение
       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
;***** Переменная часть *** Переход на дальнюю процедуру
        call 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         ; Нет !