Отримання за допомогою демонстраційної програми результатів з метою виконання індивідуального завдання

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.