7.5.1. Спочатку треба демонстраційну програму завантажити в одне з середовищ, яке підтримує програмування на мові Pascal, і забезпечити її виконання в покроковому режимі.
7.5.2.Для отримання проміжних результатів під час покрокового виконання програми необхідно використати вікна REGISTERS і WATCH із меню DEBUG середовища мови Pascal.
7.5.3. Простежити, як вихідні дані і очікуваний результат з’являються в регістрах процесора.
7.5.4. Отримувані після виконання кожної команди процесора результати треба як коментарі до кожної команди фіксувати в зошиті для звітів. Але спочатку в зошиті для звітів треба відтворити відповідну асемблерну вставку із демонстраційної програми.
7.5.5. Текст демонстраційної програми.
program memory_move;
uses crt;
var
p :pointer;
y :byte;
segm_p, sm_p, segm, smesh,
k :word;
m :longint;
begin
clrscr;
getmem(p,100); {В данном случае процедура getmem выделит область}
{динамической памяти длиной 100 байтов и ее адрес}
{запишет в указатель p}
segm_p:=seg(p); { Это адрес }
sm_p:=ofs(p); {самого указателя p}
write('Адрес указателя p: ');
writeln('segm_p=',segm_p,' sm_p=',sm_p);
segm:=seg(p^); smesh:=ofs(p^); {Это адрес выделенного
динамически участка памяти}
write('Адрес выделенного динамически участка памяти: ');
writeln('segm=',segm,' smesh=',smesh);
smesh:=smesh+50;
writeln;
writeln('Вводим данные в наш сегмент данных, нажимая Enter:');
writeln(' input byte { byte ---> 0..255 (Unsigned 8-bit) }');
write('y = ');
readln(y);
writeln(' input word { word ---> 0..65535 (Unsigned 16-bit) }');
write('k = ');
readln(k);
writeln(' input longint { logint ---> -2 147 483 648..2 147 483 647');
writeln(' (Signed 32-bit) }');
write('m = ');
readln(m);
writeln;
writeln(‘Вывод результата:’);
asm
mov di,smesh
add di,3+1*2
mov ah,y { byte }
push ds { Переходим в выделенный }
mov ds,segm { участок памяти }
mov [di],ah
mov al,[di]
pop ds { Возвращаемся в наш сегмент данных }
add y,al
end;
writeln('byte y = ',y);
asm
mov di,smesh
add di,3+2*2
mov ax,k { word }
push ds
mov ds,segm
mov [di],ax
mov bx,[di]
pop ds
add k,bx
end;
writeln('word k = ',k);
asm
mov di, offset(m) { longint }
mov ax,[di]
mov bx,[di+2]
mov di,smesh
add di,3+3*2
push ds
mov ds,segm
mov [di],ax
mov [di+2],bx
mov cx,[di]
mov dx,[di+2]
pop ds
end;
writeln('longint m = ',m);
asm { запись в регистры }
mov di,smesh
add di,3+2*2
push ds
mov ds,segm
mov ax,[di]
pop ds
end;
asm
mov di,smesh
add di,3+1*2
push ds
mov ds,segm
mov bh,[di]
pop ds
end;
asm
mov di,smesh
add di,3+3*2
push ds
mov ds,segm
mov dx,[di]
mov cx,[di+2]
pop ds
end;
asm
sub bh,3
sub ax,9
end;
FreeMem(p,100);
writeln;
writeln(' Нажмите Enter');
readln;
end.