Способы адресации данных
1) lea DX,op1 - загрузка эффективного адреса операнда op1
в регистр DX
(load effective address)
2) les DX,op1 - загрузка адреса операнда op1 в два регистра:
ES <- сегмент, DX <- смещение
3) lds DX,op1 - загрузка адреса операнда op1 в два регистра:
DS <- сегмент, DX <- смещение
[r16] - содержимое регистра (только SI,DI,BP,BX)
5) ES:[SI] - содержимое ячейки в сегменте ES
со смещением, хранящимся в SI
ПРИЛОЖЕНИЕ 2
Ниже приводится примерная структура программы, в которой достаточно только дописать самое главное - тело процедуры работы с вещественными числами. Процедура должна быть оформлена в виде отдельного файла MATH.ASM и откомпиллирована с помощью Турбо Ассемблера (TASM) .
{$N+} {Использование математического сопроцессора}
USES crt;
VAR op1,op2,op3,op4 : SINGLE;
i1 : LONGINT absolute op1;
i2 : LONGINT absolute op2;
{$F+}
procedure MATH(var op1,op2); external;
{$L Math.obj}
{$F-}
function HEX(j:LONGINT):STRING;
{Перевод числа в шестнадцатеричную форму}
const s:string='0123456789ABCDEF';
var st:string;
k,n:byte;
begin
st:='';
for k:=1 to 8 do
begin
n:=j and 15;
st:=s[n+1]+st;
j:=j shr 4;
end;
Hex:=st;
end;
begin
repeat
clrscr;
write(' Input Float 1: ');
readln(op1);
writeln('op1= ',op1);
writeln(' i1= ',i1,' hex = ',Hex(i1));
write(' Input Float 2: ');
readln(op2);
writeln('op2= ',op2);
writeln(' i2= ',i2,' hex = ',Hex(i2));
op3:=op1*op2;
op4:=op1+op2;
MATH(op1,op2);
writeln;
writeln('произведение = ',op1);
writeln(' hex = ',Hex(i1));
op1:=op3;
writeln('проверка = ',op3);
writeln(' hex = ',Hex(i1));
writeln('сумма = ',op2);
writeln(' hex = ',Hex(i2));
op2:=op4;
writeln('проверка = ',op4);
writeln(' hex = ',Hex(i2));
until readkey = #27;
end.
; FILE MATH.ASM
TITLE $Demo
.MODEL TPASCAL
.386
.CODE
MATH PROC FAR op1:DWORD, op2:DWORD
PUBLIC MATH;
; Start Code
push DS ; сохраняем DS в стеке
lds SI,op1 ; загружаем op1 в DS:SI
les DI,op2 ; загружаем op2 в ES:DI
mov EAX,DS:[SI] ; 1 operand in eax
mov EBX,ES:[DI] ; 2 operand in ebx
; Здесь надо вставить содержательную часть процедуры сложения и
; умножения вещественных чисел и записать результаты в EAX и EBX
mov DS:[SI],EBX ; произведение в op1
mov ES:[DI],EAX ; сумма в op2
; exit code
pop DS ; восстанавливаем DS
ret
MATH endp
CODE ENDS
END
Лабораторная работа №3
ЗНАКОМСТВО С ПРЕРЫВАНИЯМИ
ЦЕЛЬ РАБОТЫ
Изучение системы прерываний ЭВМ, и обработка этих прерываний.
ЗАДАНИЕ НА РАБОТУ
Написать программу обработки прерывания 33h - "мыши". Программа должна вывести на экран курсор "мыши" и при перемещении отображать текущие координаты курсора. Перемещение должно осуществляться в окне размером примерно в пол-экрана. Нажатие на правую кнопку мыши должно отключать отображение текущих координат, нажатие на левую кнопку - вновь включать его.
РЕКОМЕНДАЦИИ ПО ВЫПОЛНЕНИЮ РАБОТЫ
Все процедуры опроса состояния "мыши" целесообразно оформить в виде отдельных базовых процедур и использовать их потом в различных комбинациях в основной программе. Вызов прерываний можно выполнить, используя встроенные функции языка Pascal (intr) или C (int86).
Вот пример функции, определяющей наличие в системе драйвера "мыши". Аналогично можно организовать и все остальные функции (процедуры).
Function MouseInit:BOOLEAN;
Var
InitDriver : INTEGER;
Begin
asm
mov AX,00h
int 33h
mov InitDriver,AX
end;
If InitDriver = 0 then begin
clrscr;
write('Error: Mouse Driver not installed!');
halt;
end;
MouseInit := TRUE;
End;
ПРИЛОЖЕНИЕ 1.