fix: Кодировка

This commit is contained in:
Mark Zheleznyakov
2024-09-10 22:24:24 +03:00
parent be2b9502d1
commit 67824a5297
19 changed files with 2159 additions and 2159 deletions

View File

@ -1,131 +1,131 @@
/**************************************************************************** /****************************************************************************
** <EFBFBD><EFBFBD><EFBFBD> <20>ணࠬ<E0AEA3><E0A0AC> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD>,** ** Эта программа демонстрирует, как можно добиться взаимодействия с мышкой,**
** <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>++ <20> <20><><EFBFBD><E1A5AC><EFBFBD><EFBFBD>. ** ** используя С++ и Ассемблер. **
****************************************************************************/ ****************************************************************************/
#include <conio.h> #include <conio.h>
#include <stdio.h> #include <stdio.h>
#include <dos.h> #include <dos.h>
#include <iostream.h> #include <iostream.h>
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><E0A5AC><EFBFBD><EFBFBD><EFBFBD>, <20><EFBFBD><20><><EFBFBD><EFBFBD><E0A4A8><EFBFBD><EFBFBD> <20> <20><EFBFBD><E0A8A7><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> //Глобальные переменные, хранящие координаты и признак нажатия на кнопку
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD>. //мыши.
unsigned int MouseX, MouseY, MouseB; unsigned int MouseX, MouseY, MouseB;
char IfMouse (); char IfMouse ();
void ShowMouse (); void ShowMouse ();
void HideMouse (); void HideMouse ();
void ReadMouse (); void ReadMouse ();
void SetMouseXY (unsigned int X, unsigned int Y); void SetMouseXY (unsigned int X, unsigned int Y);
void SetMinMaxX (unsigned int Min, unsigned int Max); void SetMinMaxX (unsigned int Min, unsigned int Max);
void SetMinMaxY (unsigned int Min, unsigned int Max); void SetMinMaxY (unsigned int Min, unsigned int Max);
//<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><E6A5A4><EFBFBD> <20><EFBFBD><E0AEA2><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD> //Эта процедура проверяет доступна ли мышь
char IfMouse () char IfMouse ()
{ {
unsigned int Result; unsigned int Result;
asm mov ax, 0 asm mov ax, 0
asm int 0x33 asm int 0x33
asm mov Result, ax asm mov Result, ax
return Result; return Result;
} }
//<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><E6A5A4><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> //Эта процедура делает видимым курсор мыши
void ShowMouse () void ShowMouse ()
{ {
asm mov ax, 0x1 asm mov ax, 0x1
asm int 0x33 asm int 0x33
} }
//<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><E6A5A4><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> //Эта процедура делает невидимым курсор мыши
void HideMouse () void HideMouse ()
{ {
asm mov ax, 0x2 asm mov ax, 0x2
asm int 0x33 asm int 0x33
} }
//<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><E6A5A4><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EBA2A0> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20> <20><EFBFBD><E0A8A7><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> //Эта процедура считывает положение курсора мыши и признак нажатия
//<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> //на клавишу
void ReadMouse () void ReadMouse ()
{ {
asm mov ax, 0x3 asm mov ax, 0x3
asm int 0x33 asm int 0x33
asm mov MouseB, bx asm mov MouseB, bx
asm mov MouseX, cx asm mov MouseX, cx
asm mov MouseY, dx asm mov MouseY, dx
} }
//<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><E6A5A4><EFBFBD> <20><><EFBFBD><E2A0AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><E0A4A8><EFBFBD><EFBFBD> //Эта процедура устанавливает курсор в другие координаты
void SetMouseXY (unsigned int X, unsigned int Y) void SetMouseXY (unsigned int X, unsigned int Y)
{ {
asm mov ax, 0x4 asm mov ax, 0x4
asm mov cx, X asm mov cx, X
asm mov dx, Y asm mov dx, Y
asm int 0x33 asm int 0x33
} }
//<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><E6A5A4><EFBFBD> <20><><EFBFBD><E2A0AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><E1A8AC><EFBFBD> <20><><EFBFBD><EFBFBD><E7A5AD> //Эта процедура устанавливает минимальное и максимальное значение
//<EFBFBD><EFBFBD><EFBFBD> <20><EFBFBD><E0AEAC><EFBFBD>⪠, <20> <20><><EFBFBD><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> //границ промежутка, в котором может двигаться курсор мыши
//<EFBFBD> <20><><EFBFBD><E0A8A7>⠫쭮<E2A0AB> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>. //в горизонтальном положении.
void SetMinMaxX (unsigned int Min, unsigned int Max) void SetMinMaxX (unsigned int Min, unsigned int Max)
{ {
asm mov ax, 0x7 asm mov ax, 0x7
asm mov cx, Min asm mov cx, Min
asm mov dx, Max asm mov dx, Max
asm int 0x33 asm int 0x33
} }
//<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><E6A5A4><EFBFBD> <20><><EFBFBD><E2A0AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><E1A8AC><EFBFBD> <20><><EFBFBD><EFBFBD><E7A5AD> //Эта процедура устанавливает минимальное и максимальное значение
//<EFBFBD><EFBFBD><EFBFBD> <20><EFBFBD><E0AEAC><EFBFBD>⪠, <20> <20><><EFBFBD><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> //границ промежутка, в котором может двигаться курсор мыши
//<EFBFBD> <20><><EFBFBD><EFBFBD><E2A8AA><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>. //в вертикальном положении.
void SetMinMaxY (unsigned int Min, unsigned int Max) void SetMinMaxY (unsigned int Min, unsigned int Max)
{ {
asm mov ax, 0x8 asm mov ax, 0x8
asm mov cx, Min asm mov cx, Min
asm mov dx, Max asm mov dx, Max
asm int 0x33 asm int 0x33
} }
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><E0A0AC> - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><E6A5A4><EFBFBD> <20><><EFBFBD><EFBFBD><E1A0AD><EFBFBD> <20><><EFBFBD><EFBFBD>. //Главная пограмма - тестирует мышь и процедуры описанные выше.
main(){ main(){
clrscr(); clrscr();
IfMouse(); IfMouse();
cout<<"<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD>.\n"; cout<<"Мышь доступна в системе.\n";
delay(3000); delay(3000);
cout<<"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFA2A8><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> - <20><><EFBFBD><EFBFBD><EFBFBD> 3 ᥪ.\n"; cout<<"Сейчас появится курсор - задержка 3 сек.\n";
delay(3000); delay(3000);
ShowMouse(); ShowMouse();
cout<<"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><E7A5A7><EFBFBD> - <20><><EFBFBD><EFBFBD><EFBFBD> 3 ᥪ.\n"; cout<<"Сейчас курсор исчезнет - задержка 3 сек.\n";
delay(3000); delay(3000);
HideMouse(); HideMouse();
cout<<"<EFBFBD><EFBFBD>१ 3 ᥪ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFA2A8><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>.\n"; cout<<"Через 3 сек курсор появится вновь.\n";
delay(3000); delay(3000);
ShowMouse(); ShowMouse();
ReadMouse(); ReadMouse();
cout<<"\n<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> #1:\n"; cout<<"\nКоординаты мыши на момент #1:\n";
cout<<"<EFBFBD>-<2D><><EFBFBD><EFBFBD><E0A4A8><EFBFBD><EFBFBD>: "<<MouseX<<"\n"; cout<<"Х-координата: "<<MouseX<<"\n";
cout<<"<EFBFBD>-<2D><><EFBFBD><EFBFBD><E0A4A8><EFBFBD><EFBFBD> "<<MouseY<<"\n"; cout<<"У-координата "<<MouseY<<"\n";
delay(3000); delay(3000);
cout<<"<EFBFBD><EFBFBD>१ 3 ᥪ <20><><EFBFBD><EFBFBD><EFBFBD><20><><EFBFBD><EFBFBD><E0A4A8><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20>=120 <EFBFBD> <20>=120\n"; cout<<"Через 3 сек поменяем координаты мыши на х=120 и у=120\n";
delay(3000); delay(3000);
SetMouseXY(120,120); SetMouseXY(120,120);
ReadMouse(); ReadMouse();
cout<<"\n<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> #2:\n"; cout<<"\nКоординаты мыши на момент #2:\n";
cout<<"<EFBFBD>-<2D><><EFBFBD><EFBFBD><E0A4A8><EFBFBD><EFBFBD>: "<<MouseX<<"\n"; cout<<"Х-координата: "<<MouseX<<"\n";
cout<<"<EFBFBD>-<2D><><EFBFBD><EFBFBD><E0A4A8><EFBFBD><EFBFBD> "<<MouseY<<"\n"; cout<<"У-координата "<<MouseY<<"\n";
delay(3000); delay(3000);
cout<<"\n<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.\n"; cout<<"\nНажмите клавишу мыши.\n";
delay(3000); delay(3000);
ReadMouse(); ReadMouse();
//if ((MouseB&1)==1) cout<<"\n<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>."; //if ((MouseB&1)==1) cout<<"\nКлавиша мыши нажата.";
if (MouseB==1) cout<<"\n<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>."; if (MouseB==1) cout<<"\nКлавиша мыши нажата.";
else cout<<"\n<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>."; else cout<<"\nКлавиша мыши не нажата.";
delay(3000); delay(3000);
cout<<"\n<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><EFBFBD><E0A0AD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD>:\n"; cout<<"\nУстановим границы движения мыши по экрану:\n";
cout<<"100<X<300\n"; cout<<"100<X<300\n";
cout<<"0<Y<10\n"; cout<<"0<Y<10\n";
SetMinMaxX(100,300); SetMinMaxX(100,300);
SetMinMaxY(0,10); SetMinMaxY(0,10);
cout<<"\n<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E8A5AD><><E0A0A1><EFBFBD> <20>ணࠬ<E0AEA3><E0A0AC> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.\n"; cout<<"\nДля завершения работы программы нажмите любую клавишу.\n";
getch(); getch();
return 0; return 0;
} }

View File

@ -1,76 +1,76 @@
// "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> IBM PC <EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>" // "Обмен IBM PC с клавиатурой"
// Labv10 // Labv10
#include <iostream.h> #include <iostream.h>
#include <stdio.h> #include <stdio.h>
#include <conio.h> #include <conio.h>
#include <dos.h> #include <dos.h>
#include <bios.h> #include <bios.h>
#define Port8042 0x60 #define Port8042 0x60
long far * pTime=(long far*)0x46C; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD>稪 ⨪<><E2A8AA> long far * pTime=(long far*)0x46C; // Указатель на счетчик тиков
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><><E3AAA0><EFBFBD> <20><><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> // Определим указатели начала и конца буфера
int far * pHeadPtr=(int far *)0x41A; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><><E3AAA0><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>.<2E><>. int far * pHeadPtr=(int far *)0x41A; // Указатель на указатель головы буф.кл.
int far * pTailPtr=(int far *)0x41C; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><><E3AAA0><EFBFBD><><E5A2AE><EFBFBD> <20><><EFBFBD>.<2E><>. int far * pTailPtr=(int far *)0x41C; // Указатель на указатель хвоста буф.кл.
unsigned char far * pBuf; unsigned char far * pBuf;
void main() void main()
{ {
// 3<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> N1. // 3адание N1.
clrscr(); clrscr();
cout << "\n 3<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> N1:\n"; cout << "\n 3адание N1:\n";
cout << "\n <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><E7A5AD> <20><><EFBFBD><EFBFBD><EFBFBD>!"; cout << "\n Нажимайте клавиши для получения кодов!";
cout << "\n <EFBFBD><EFBFBD><EFBFBD> - <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.\n"; cout << "\n Пробел - идем дальше.\n";
char cScan,cAsci; char cScan,cAsci;
int iAdres; int iAdres;
do do
{ {
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><><E0A5A3><EFBFBD>஢, <20><><EFBFBD><EFBFBD><E0A8AC> ds:si <20><><EFBFBD><EFBFBD><E7A5AD><EFBFBD> 0x40:0x1A // Загрузить пару регистров, например ds:si значением 0x40:0x1A
asm{ asm{
push ds // push ds //
push si // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><><E0A5A3><EFBFBD><EFBFBD><EFBFBD> push si // Сохранили регистры
push di // push di //
mov ax,0x40 // mov ax,0x40 //
mov ds,ax // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><><E1A5A3><EFBFBD><EFBFBD> mov ds,ax // Загрузили сегмент
mov si,0x1A // <EFBFBD><><E3AAA0><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> mov si,0x1A // и указатели на голову
mov di,0x1C // <EFBFBD> <20><><><E5A2AE> mov di,0x1C // и на хвост
} }
wait_kbd: wait_kbd:
asm{ asm{
mov ax,[si] // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><><E3AAA0><EFBFBD> - mov ax,[si] // Сравниваем указатели -
cmp ax,[di] // <EFBFBD>.<2E>. <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> cmp ax,[di] // т.е. ждем нажатия
je wait_kbd je wait_kbd
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><><E0A5A3><EFBFBD><EFBFBD> di <20><><EFBFBD><EFBFBD><E7A5AD><EFBFBD> 0x1C // Загрузить регистр di значением 0x1C
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><><E3AAA0><EFBFBD> // Сравнить указатели
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><><E3AAA0><EFBFBD> // Прочитать указатель
mov si,[si] mov si,[si]
} }
iAdres=_SI; iAdres=_SI;
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><E7A5AD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> // Прочитать значение из буфера
asm mov ax,[si] asm mov ax,[si]
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> _AL <EFBFBD> _AH <EFBFBD><EFBFBD><>-<2D><><EFBFBD> <20> ASCII-<EFBFBD><EFBFBD><EFBFBD> // Теперь _AL и _AH содержат скан-код и ASCII-код
asm pop di asm pop di
asm pop si asm pop si
asm pop ds asm pop ds
cScan=_AH; cScan=_AH;
cAsci=_AL; cAsci=_AL;
printf("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> = %x <EFBFBD><EFBFBD><EFBFBD><EFBFBD> = %d ASCII = %d \n",iAdres,cScan,cAsci); printf("Адрес = %x Скан = %d ASCII = %d \n",iAdres,cScan,cAsci);
} while(getch() != 32); } while(getch() != 32);
cout << "\n <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><E0A2AE> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>. Press any key...\n"; cout << "\n Конец первого задания. Press any key...\n";
getch(); getch();
delay(1000); delay(1000);
asm in al,0x60 asm in al,0x60
cScan=0; // ?????? cScan=0; // ??????
printf(" <EFBFBD><EFBFBD><EFBFBD><EFBFBD> = %x \n",cScan); printf(" Скан = %x \n",cScan);
// goto met; // goto met;
// //
} }
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> // Задание
// 1 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><EFBFBD><EFBFBD><E2A0A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ணࠬ<E0AEA3><E0A0AC> // 1 Разберите представленную программу
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>⫨稥 ASCII <20><><EFBFBD><EFBFBD><EFBFBD>: <20><EFBFBD><E1ADAE><EFBFBD><EFBFBD> <20> <20><><EFBFBD><E3A6A5><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> // Определите отличие ASCII кодов: основных и служебных клавиш
// 2 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ணࠬ<E0AEA3><E0A0AC><><E6A8AA><EFBFBD><EFBFBD><EFBFBD><E1AAAE> <20><EFBFBD><E2A5AD><> <20><><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD> 60 // 2 Напишите мини программу циклического чтения скан кодов из порта 60
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>⫨稥 ᪠<> <20><><EFBFBD><EFBFBD><EFBFBD>: <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><E1AAA0><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> // Определите отличие скан кодов: нажатия и отпускания клавиши

View File

@ -1,40 +1,40 @@
/* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><><E0A0A1><EFBFBD> 11 /* Лабораторная работа 11
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <><E0A5A6><EFBFBD> sVGA Видеоадаптер, графические режимы sVGA
*/ */
#include <dos.h> #include <dos.h>
#include <mem.h> #include <mem.h>
#include <conio.h> #include <conio.h>
void set_mode(int mode) void set_mode(int mode)
{ {
asm{ asm{
mov ax,0x4f02; mov ax,0x4f02;
mov bx,mode ; mov bx,mode ;
int 0x10; int 0x10;
} }
} }
void main(void) void main(void)
{ {
set_mode(0x0112); set_mode(0x0112);
unsigned char c=0; unsigned char c=0;
for (int i=2; i<640*4;i+=4) for (int i=2; i<640*4;i+=4)
{ {
asm { asm {
mov ax,0xa000; mov ax,0xa000;
mov es,ax; mov es,ax;
mov si,i mov si,i
mov bh,c mov bh,c
mov bl,c mov bl,c
mov es:[si],bl mov es:[si],bl
} }
c++; c++;
} }
getch(); getch();
set_mode(0x3); set_mode(0x3);
} }
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> // Задание
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><><E6A2A5> <20> 111 <EFBFBD> 112 <EFBFBD><EFBFBD><EFBFBD><EFBFBD> //Определите в каком порядке кодируются цвета в 111 и 112 режимах
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ணࠬ<E0AEA3><E0A0AC> <20><EFBFBD><EBA2AE> <20><><EFBFBD><EFBFBD><EFBFBD><E2AEAD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD> //Напишите программу вывода полутонового клина на Асс

114
LABV5.CPP
View File

@ -1,57 +1,57 @@
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> N LAB5 // Работа N LAB5
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ணࠬ<E0AEA3><E0A0AC> // Шаблон программы
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD> - <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> // Тема - ПОДПРПОГРАММЫ
#include <stdio.h> #include <stdio.h>
#include<conio.h> #include<conio.h>
#include<iostream.h> #include<iostream.h>
/* /*
<EFBFBD><EFBFBD><EFBFBD> <20><EFBFBD><EBA7AE> <20>㭪樨 <20> <20><>, <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Call При вызове функции в Си, она интерпретируется как команда Call
<EFBFBD> Assembler. <EFBFBD><EFBFBD><EFBFBD> <20><20><><EFBFBD><E0A5A4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><EFBFBD><E3ADAA><EFBFBD> <20><><EFBFBD><E0A0AC><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> в Assembler. При этом передаваемые в функцию параметры, заносятся в
<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20>ਭ樯<E0A8AD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>. <20><><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> IP ᫥<><E1ABA5><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, СТЕК по принципу справа налево. Затем заносится IP следующей команды,
<EFBFBD><EFBFBD><EFBFBD><20><> Call. (<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E1A5A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><EFBFBD> <20><><EFBFBD><EFBFBD><E6A5A4><EFBFBD>) идущей за Call. (внутрисегментный вызов процедуры)
<EFBFBD><EFBFBD><20><> <20>㭪樨 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E2A2AB><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> RET. Выход из функции осуществляется с помощью команды RET.
*/ */
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><EFBFBD><EBAFAE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><><E1ABAE><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><E0A0AC><EFBFBD><EFBFBD> <20><><20><><20> //Функция, выполняющая сложение, параметры перед через стек
void addition(long sl_1,long sl_2, long &sum) void addition(long sl_1,long sl_2, long &sum)
{ {
/* asm{ /* asm{
mov AX,[BP+4] //AX - <EFBFBD><EFBFBD><EFBFBD><EFBFBD>訥 p<><70>p<EFBFBD><70><EFBFBD> <20><>p<EFBFBD><70><EFBFBD><EFBFBD><><E1ABA0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> mov AX,[BP+4] //AX - младшие pазpяды пеого слагаемого
mov DX,[BP+8] //DX - <EFBFBD><EFBFBD><EFBFBD><EFBFBD>訥 p<><70>p<EFBFBD><70><EFBFBD> <20><><EFBFBD><EFBFBD><><E1ABA0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> mov DX,[BP+8] //DX - младшие pазpяды второго слагаемого
mov SI,[BP+12] //SI - <EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> p<><70>p冷<70> mov SI,[BP+12] //SI - сумма младших pазpядов
add AX,DX //<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> p<><70>p冷<70> add AX,DX //сложение младших pазpядов
mov [SI],AX //p<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><E1A2A5><EFBFBD> <20> SI mov [SI],AX //pезультат косвенно в SI
mov AX,[BP+6] //AX - <EFBFBD><EFBFBD><EFBFBD>p訥 p<><70>p<EFBFBD><70><EFBFBD> <20><>p<EFBFBD><70><EFBFBD><EFBFBD><><E1ABA0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> mov AX,[BP+6] //AX - стаpшие pазpяды пеого слагаемого
mov DX,[BP+10] //DX - <EFBFBD><EFBFBD><EFBFBD><EFBFBD>訥 p<><70>p<EFBFBD><70><EFBFBD> <20><><EFBFBD><EFBFBD><><E1ABA0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> mov DX,[BP+10] //DX - младшие pазpяды второго слагаемого
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>p<EFBFBD><70><EFBFBD> p<><70>p冷<70> //сложение стаpших pазpядов
mov [SI+2],AX //p<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> SI mov [SI+2],AX //pезультат в SI
}*/ }*/
sum=sl_2; sum=sl_2;
} }
void main ( void ) void main ( void )
{ {
long a,b; long a,b;
long sum; long sum;
cout<<"\n <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><><E1ABA0><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: "; cout<<"\n Введите первое слагаемое: ";
cin>>a; cin>>a;
cout<<" <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>஥ ᫠<><E1ABA0><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: "; cout<<" Введите второе слагаемое: ";
cin>>b; cin>>b;
addition(a,b,sum); addition(a,b,sum);
cout<<"a + b = "<<sum; cout<<"a + b = "<<sum;
getch(); getch();
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> // Задания
// 1 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ணࠬ<E0AEA3><E0A0AC><><E1ABAE><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> 32-<2D><><EFBFBD><EFA4AD> <20><><20><> <20><> // 1 Напишите программу сложения двух 32-х разрядных чисел на Си
// 2 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><><E1ABAE><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ணࠬ<E0AEA3><E0A0AC><EFBFBD> <20><> <20><><EFBFBD><E1A5AC><EFBFBD><EFBFBD><EFBFBD> (ᬮ<><E1ACAE><EFBFBD> <20><EFBFBD><E0A8AC>) // 2 Оформите сложение подпрограммой на Ассемблере (смотри пример)
// 3 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E1A5A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>) <20><EFBFBD> <20><><EFBFBD>ணࠬ<E0AEA3><E0A0AC> // 3 Проведите внутрисегментный (ближний) вызов подрограммы
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><E1A5A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><EFBFBD> <20><><EFBFBD><EFBFBD>ணࠬ<E0AEA3><E0A0AC> (<28><><EFBFBD><EFBFBD><E6A5A4><EFBFBD>) // Проведите межсегментный вызов подпрограммы (процедуры)
// <EFBFBD><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><E0A5A4><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Tiny - Large // путем изменения модели распределения памяти Tiny - Large
// <EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ? // Что изменилось ?
// 4 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><E0A5A4><EFBFBD> <20><><EFBFBD><E0A0AC><20><>१ ॣ<><E0A5A3><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> // 4 Реализуйте передачу параметров через регистры или общую память
} }

View File

@ -1,46 +1,46 @@
/* LAB6 /* LAB6
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><><E0A0A1><EFBFBD> <20><><> Лабораторная работа по теме
"<EFBFBD>ணࠬ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EBA2A0><EFBFBD>" "Программные прерывания"
<EFBFBD><EFBFBD><EFBFBD> <20><EFBFBD><EBA7AE> <20>㭪樨 - <20><><EFBFBD><EFBFBD><EFBFBD><EBA2A0><EFBFBD> <20><> <20><>, <20><EFBFBD><E1AFAE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> INT. При вызове функции - прерывания из СИ, используется INT.
<EFBFBD> <20><><20> <20><20><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD>. В связи с этим стек заполняется несколько иначе.
<EFBFBD> <20><EFBFBD> <20><><EFBFBD><EFBFBD><E0A0AD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><E7A5AD> IP, <EFBFBD>S (<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>),<2C><> <20><20><><EFBFBD><EFBFBD><EBA2A0><EFBFBD><EFBFBD> В стеке сохраняются значения IP, СS (сегмент кода),от куда вызывается
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><E4ABA0>. прерывание, и флаги.
<EFBFBD><EFBFBD><20><> INT <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E2A2AB><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> IRet,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><EFBFBD><EBADA8><EFBFBD><EFBFBD> <20><> <20><EFBFBD> Выход из INT осуществляется с помощью IRet,которая вынимает из стека
<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><><E0A5A3><EFBFBD>஢ CS, IP <20><><E4ABA0><EFBFBD>. все старые регистров CS, IP и флагов.
<EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD> <20><EFBFBD><EBA7AE> <20><><EFBFBD><EFBFBD><EFBFBD><EBA2A0><EFBFBD>,䫠<><E4ABA0><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EBA2A0><EFBFBD> i <EFBFBD> t Так же при вызове прерывания,флажок прерывания i и t
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> 0, <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EBA2A0><EFBFBD>, устанавливается в 0, что запрещает вызов любых других прерываний,
<EFBFBD><><E2A0AA> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E0AEA2>. а также запрещает трассировку.
*/ */
#include<stdio.h> #include<stdio.h>
#include<dos.h> #include<dos.h>
#include<iostream.h> #include<iostream.h>
#include <conio.h> #include <conio.h>
void interrupt (*old)(...); // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><EFBFBD> <20><><EFBFBD><EFBFBD><E0A0AD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> void interrupt (*old)(...); // здесь будем сохранять старый вектор
void interrupt cmp_int(...) // <EFBFBD> <20><><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><E0A0A1> void interrupt cmp_int(...) // а это наш обработчик
{ {
cout<<"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> "; cout<<"Прерывание ";
getch(); getch();
} }
void main(void) void main(void)
{ int aa; { int aa;
aa=1; aa=1;
old=getvect(0xf0); old=getvect(0xf0);
disable(); disable();
setvect(0xf0,cmp_int); setvect(0xf0,cmp_int);
enable(); enable();
// aa=aa/0; // aa=aa/0;
geninterrupt(0xf0); geninterrupt(0xf0);
puts("v1=v2"); puts("v1=v2");
setvect(0xf0,old); setvect(0xf0,old);
return; return;
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> // Задания
// 1 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ணࠬ<E0AEA3><E0A0AC> <20><><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD><EBA2A0><EFBFBD> // 1 Напишите программу обработки прерывания
// 2 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EBA2A0><EFBFBD> <20><><20><EFBFBD><E0A3A0><EFBFBD><EFBFBD><20><EFBFBD><E1AEA1><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> // 2 Вызовите прерывание путем организации особого случая
// 3 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><EFBFBD><EFBFBD><ECA7AE><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> int3, <20><><EFBFBD><E0A5A4><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD> <20> <20><EFBFBD>. TD // 3 Покажите использование команды int3, определите ее код с испол. TD
} }

View File

@ -1,41 +1,41 @@
/* LAB-7 /* LAB-7
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><><E0A0A1><EFBFBD> <20><><> Лабораторная работа по теме
"<EFBFBD><EFBFBD>᫠ ᯫ<><E1AFAB><EFBFBD><EFBFBD><20><><EFBFBD><EFBFBD>" "Числа сплавающей запятой"
*/ */
#include<stdio.h> #include<stdio.h>
#include<dos.h> #include<dos.h>
#include<iostream.h> #include<iostream.h>
#include <conio.h> #include <conio.h>
#include <float.h> #include <float.h>
void main(void) void main(void)
{ int aa; { int aa;
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><20><><EFBFBD><EFBFBD><20><> <20><EFBFBD><E0AEA2> <20><> // Операции с плавающей запятой на уровне Си
float bb,ad; float bb,ad;
aa=1; bb=5.0;ad=3.1; aa=1; bb=5.0;ad=3.1;
bb=aa; bb=aa;
cout<<"\n Ci "<<bb; cout<<"\n Ci "<<bb;
// cin>>bb; // cin>>bb;
getch(); getch();
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><20><><EFBFBD><EFBFBD><20><> <20><EFBFBD><E0AEA2> <20><><EFBFBD><E1A5AC><EFBFBD><EFBFBD><EFBFBD> // Операции с плавающей запятой на уровне Ассемблера
asm { finit asm { finit
fld ad fld ad
fld bb fld bb
fadd fadd
fstp bb fstp bb
} }
cout<<" Acc "<<bb; cout<<" Acc "<<bb;
getch(); getch();
return; return;
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> // Задания
// 1 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><20><><EFBFBD> <20><><EFBFBD><E1ABA0> <20> <20><> <20><> <20><EFBFBD><E0AEA2> <20><> // 1 Выполните операции над числами с ПЗ на уровне Си
// 2 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ணࠬ<E0AEA3><E0A0AC> <20><> <20><><EFBFBD> (<28><> <20><EFBFBD><E0A8AC>): <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><>, // 2 Напишите программу на Асс (см пример): Введите в диалоге три числа,
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><E0A5A3><EFBFBD><EFBFBD><EFBFBD> FPU, <20><><EFBFBD><EFBFBD><EFBFBD><E3ACAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><EFBFBD><EBA2A5><EFBFBD><EFBFBD><><E0A5A7><EFBFBD><EFBFBD><EFBFBD><EFBFBD> // загрузите их в регистры FPU, просуммируйте, выведите результат
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><><E0A0A1><EFBFBD> FPU <EFBFBD> TD. <EFBFBD><EFBFBD><EFBFBD> <20><EFBFBD><E1AFAE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><><E0A5A3><EFBFBD><EFBFBD><EFBFBD> FPU ? // Проследите работу FPU в TD. Как используются регистры FPU ?
// 3 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> FPU <20><><EFBFBD><EFBFBD>᫮ (NaN), <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20> TD. <20><EFBFBD><EBA7AE><EFBFBD><EFBFBD> // 3 Получите в FPU нечисло (NaN), покажите его в TD. Вызовите
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><EFBFBD> <20><EFBFBD><E1AEA1><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>. // прерывание по этому особому случаю.
// 4 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD> <20><><EFBFBD><E0A0A6><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><20> <20><>: x=x/y. <20><EFBFBD><E0AEA2><EFBFBD><EFBFBD><EFBFBD> <20> TD // 4 Напишите на Асс выражение для чисел с ПЗ: x=x/y. Проверьте в TD
} }

142
LABV9.CPP
View File

@ -1,72 +1,72 @@
/* Lab: Ass, BIOS and Ci functions /* Lab: Ass, BIOS and Ci functions
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ணࠬ<E0AEA3><E0A0AC> <20><><EFBFBD><><E0A0A1><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E2A5AC> Labv9 Шаблон программы для работы с видеосистемой Labv9
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <><E0A5A6><EFBFBD> Графические режимы
*/ */
#include <graphics.h> #include <graphics.h>
#include <dos.h> #include <dos.h>
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <conio.h> #include <conio.h>
#include <time.h>; #include <time.h>;
union REGS r; union REGS r;
void main() void main()
{ {
// <EFBFBD><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E0A5A6><EFBFBD> // Устан номера видеорежима
int j,i,ii,color=0; int j,i,ii,color=0;
r.h.ah=0x0; r.h.ah=0x0;
r.h.al=0x13; r.h.al=0x13;
//_asm int 0x10; //_asm int 0x10;
int86(0x10,&r,&r); int86(0x10,&r,&r);
// <EFBFBD><EFBFBD> 梥⭮<E6A2A5><E2ADAE> <20><><EFBFBD><EFBFBD><EFBFBD> // Вывод цветного клина
for( j =1 ; j <319 ; j ++) for( j =1 ; j <319 ; j ++)
{ color=color+1; { color=color+1;
_AH=0x0c; _AH=0x0c;
_AL=color; _AL=color;
if(color==256) color=0; if(color==256) color=0;
_BH=0; _BH=0;
_DX=50; _DX=50;
_CX=j; _CX=j;
geninterrupt(0x10); geninterrupt(0x10);
} }
getch(); getch();
//<EFBFBD><EFBFBD>९ணࠬ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><><E2A0A1><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> //Перепрограммирование таблицы палитры
ii=clock(); ii=clock();
for( i = 0 ; i < 255 ; i++) for( i = 0 ; i < 255 ; i++)
{ _AH=0x10; { _AH=0x10;
_AL=0x10; _AL=0x10;
_BX=i; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><><E0A5A3><EFBFBD><EFBFBD><EFBFBD> _BX=i; // Номер регистра
_CH=i; /* G */ _CH=i; /* G */
_CL=i; /* B */ _CL=i; /* B */
_DH=i; /* R */ _DH=i; /* R */
geninterrupt(0x10); geninterrupt(0x10);
} /* */ } /* */
color=256; color=256;
i=clock()-ii; i=clock()-ii;
// <EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><E2AEAD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> // Вывод полутонового клина
for( j =1 ; j <319 ; j ++) /* */ for( j =1 ; j <319 ; j ++) /* */
{ color=color-1; { color=color-1;
_AH=0x0c; _AH=0x0c;
_AL=color; _AL=color;
if(color==0) color=256; if(color==0) color=256;
_BH=0; _BH=0;
_DX=100; // <EFBFBD><EFBFBD><EFBFBD> <20><EFBFBD><EBA2AE> _DX=100; // строка вывода
_CX=j; _CX=j;
geninterrupt(0x10); geninterrupt(0x10);
} }
// printf("<EFBFBD><EFBFBD> <20><>९ணࠬ<E0AEA3><E0A0AC><EFBFBD><E0AEA2><EFBFBD><EFBFBD><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> : %d",i); // printf("Время перепрограммирования табл палитр : %d",i);
getch(); getch();
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> // Задания
// 1 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><E2AEAD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 梥⮬ // 1 Подкрасьте полутоновой клин красным цветом
// 2 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20> <><E0A5A6><EFBFBD> <20><><EFBFBD><><E0A0A1><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> // 2 Выведите клин в режиме прямой работы с видео памятью
// (<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20>ணࠬ<E0AEA3><E0A0AC> <20><EFBFBD><EBA2AE> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>, <20><><EFBFBD><E7A8AD> <20> a0000) // (напишите Асс программу вывода возрастающ кода, начиная с a0000)
// 3 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><EFBFBD> <20><EFBFBD><EBA2AE> <20> <20><>९ணࠬ<E0AEA3><E0A0AC><EFBFBD><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><EFBFBD><E1AFAE><EFBFBD><EFBFBD><EFBFBD> i=clock() // 3 Измерьте время вывода и перепрограммир табл палитры используя i=clock()
// 4 <EFBFBD>ਤ㬠<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><E0A0AA><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><EFBFBD><EBA2A5> <20><><EFBFBD> // 4 Придумайте абстрактную анимацию, выведя несколько
// 梥⮢<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><20><><E6A8AA><EFBFBD><EFBFBD><20><>९ணࠬ<E0AEA3><E0A0AC><EFBFBD><EFBFBD><EFBFBD><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> // цветовых клиньев и циклически перепрограммируя табл палитры
return; return;
} }

View File

@ -2,16 +2,16 @@
.MODEL TINY .MODEL TINY
.STACK 100h .STACK 100h
.DATA .DATA
Message DB 13,10,'Hi <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>! ',13,10,'$' Message DB 13,10,'Hi Привет! ',13,10,'$'
.CODE .CODE
mov ax,@Data mov ax,@Data
mov ds,ax ; <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> DS <20><><EFBFBD><EFBFBD><EFBFBD> mov ds,ax ; установить регистр DS таким
; <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ; образом, чтобы он указывал
; <EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ; на сегмент данных
mov ah,9 ; <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> DOS <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> mov ah,9 ; функция DOS вывода строки
mov dx,OFFSET Message ; <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> "<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>!" mov dx,OFFSET Message ; ссылка на сообщение "Привет!"
int 21h ; <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> "<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>!" <20><> <20><><EFBFBD><EFBFBD><EFBFBD> int 21h ; вывести "Привет!" на экран
mov ah,4ch ; <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> DOS <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> mov ah,4ch ; функция DOS завершения
; <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ; программы
int 21h ; <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> int 21h ; завершить программу
END END

452
Labv1.cpp
View File

@ -1,226 +1,226 @@
// <EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><E0ACAB><EFBFBD><EFBFBD> <20>ணࠬ<E0AEA3><E0A0AC> // Пример оформления программы
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> N 0 // Работа N 0
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><EFBFBD><E0A5AC><EFBFBD> <20><EFBFBD><EBAFAE><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><EFBFBD><E0A0A3><EFBFBD><EFBFBD><EFBFBD> <20>ணࠬ<E0AEA3><E0A0AC> // Измерение времени выполнения фрагмента программы
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> 000.0 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, & <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> // Студенты гр 000.0 Иванофф, Петрофф, & Сидорофф
// //
#include <dos.h> #include <dos.h>
#include <bios.h> #include <bios.h>
#include <stdio.h> #include <stdio.h>
#include <conio.h> #include <conio.h>
#define PortCan0 0x40 #define PortCan0 0x40
void beep(unsigned iTone,unsigned iDlit); // <EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20>㭪樨 void beep(unsigned iTone,unsigned iDlit); // Это прототип функции
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><><E1A8A3><EFBFBD><EFBFBD>, <20><EFBFBD><E1AFAE><EFBFBD><EFBFBD><E3A5AC> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><E0A5AD> <20><EFBFBD><E0A5AC><EFBFBD> // звукового сигнала, используемой при измерении времени
void main(void) void main(void)
{ {
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><E0A5AC><EFBFBD><EFBFBD><EFBFBD> // Объявление переменных
long int lCnt=0; // <EFBFBD><EFBFBD><EFBFBD> - <20><><EFBFBD><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E0A5AD> long int lCnt=0; // Ячейка - счетчик повторений
int iA=0x1234; // <EFBFBD><EFBFBD>-<2D><EFBFBD><E7A5A9>, <20><EFBFBD><E1AFAE><EFBFBD><EFBFBD><E3A5AC> <20> <20><><EFBFBD><EFBFBD><E3A5AC> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> int iA=0x1234; // Думми-ячейка, используемая в исследуемой команде
/*************************************************************************\ /*************************************************************************\
/* <EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> */ /* Как из Си посмотреть содержимое байта с известным физическим адресом */
// <EFBFBD><20><><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><><EFBFBD><E0A6A8><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD> 0046<EFBFBD>h // Если хотим напечатать содержимое байта с адресом 0046Сh
//<EFBFBD><EFBFBD><EFBFBD>塞 far-㪠<><E3AAA0><EFBFBD> <20><> <20><><EFBFBD><E0A5AC><EFBFBD><EFBFBD><EFBFBD> <> char <20> <20><><EFBFBD><EFBFBD><E6A8A0><EFBFBD><EFBFBD><EFBFBD> //объявляем far-указатель на переменную типа char и инициализируем
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><><E3AAA0><EFBFBD> <20><><EFBFBD><EFBFBD><E7A5AD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><EFBFBD><E0A5A4><EFBFBD><EFBFBD>⥫쭮 <20><EFBFBD><EFBFBD><E0A0A7><EFBFBD><EFBFBD> //этот указатель значением адреса, предварительно преобразовав
//<EFBFBD><EFBFBD><EFBFBD> <20> <> char * //его к типу char *
char far * pT=(char *)0x46C; // (1) char far * pT=(char *)0x46C; // (1)
printf ("\n <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 10 ࠧ <20><><EFBFBD><EFBFBD><E7A5AD> <20><><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> \n"); printf ("\n Печатаем 10 раз значение байта с известным адресом \n");
for (int i=0; i<10; i++) for (int i=0; i<10; i++)
printf (" \n %d ", * pT); // (1) printf (" \n %d ", * pT); // (1)
printf ("\n <EFBFBD><EFBFBD><EFBFBD> <20><EFBFBD><E0AEA4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> \n"); printf ("\n Для продолжения нажмите любую клавишу \n");
getch(); // <EFBFBD>ணࠬ<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> getch(); // Программа ждет нажатия клавиши
/******************************************\ /******************************************\
\* <EFBFBD><EFBFBD><EFBFBD> <20><> <20><> <20><><EFBFBD><E1ACAE><EFBFBD><EFBFBD><EFBFBD><><EFBFBD><E0A6A8><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> */ \* Как из Си посмотреть содержимое порта */
// <EFBFBD><EFBFBD><EFBFBD><><EFBFBD><E0A6A8><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD>ᮬ 40 <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>㭪樨 <20><> // Читаем содержимое порта с адресом 40 с помощью функции Си
printf ("\n <EFBFBD><EFBFBD><EFBFBD><><EFBFBD><E0A6A8><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD>ᮬ 40 <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>㭪樨 <20><> \n" ); printf ("\n Читаем содержимое порта с адресом 40 с помощью функции Си \n" );
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 0.5 <EFBFBD> // Цикл повторяется каждые 0.5 с
printf ("\n <EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><><E6A8AA> - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> \n" ); printf ("\n Для выхода из цикла - нажмите любую клавишу \n" );
while (bioskey(1)==0) // <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> while (bioskey(1)==0) // пока не будет нажата любая клавиша
{ {
printf (" \n <EFBFBD><EFBFBD><EFBFBD><EFBFBD>40 = %d ", inp(PortCan0)); //(2) printf (" \n Порт40 = %d ", inp(PortCan0)); //(2)
// <EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> TD <20><><EFBFBD><E1ACAE><EFBFBD><EFBFBD><EFBFBD>, <20><> <20><><EFBFBD> <20><EFBFBD><E0A5A2><EFBFBD><E9A0A5><EFBFBD> <20>-<2D><><EFBFBD> inp() // С помощью TD посмотрите, во что превращается ф-ция inp()
// <EFBFBD><EFBFBD> <20><EFBFBD><E0AEA2> <20><><EFBFBD><E8A8AD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> // на уровне машинных команд
delay(500); // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD>ᥪ㭤<E1A5AA> (500 <EFBFBD><EFBFBD>) delay(500); // Задержка на полсекунды (500 мс)
} }
getch(); // <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> getch(); // Очищаем буфер клавиатуры
/**************************************************************************\ /**************************************************************************\
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>: * Примечания: *
<EFBFBD><EFBFBD><EFBFBD><EFBFBD> printf (...) <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><E1AFA5><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><E7A5AD> <20><><EFBFBD><E0A5AC><EFBFBD><EFBFBD><EFBFBD>, * Функция printf (...) позволяет распечатать на экране значения переменных, *
<EFBFBD><><E2A0AA> <20><EFBFBD><E0AEA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><><E2A5AA>. * а также произвольный текст. *
<EFBFBD><EFBFBD><EFBFBD><EFBFBD> bioskey(1) <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><E0A5A4><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> * Функция bioskey(1) позволяет определить, нажата ли клавиша *
<EFBFBD><EFBFBD><EFBFBD><EFBFBD> inp(uPort) <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD> Port * Функция inp(uPort) позволяет считать байт из порта Port *
<EFBFBD><EFBFBD><EFBFBD><EFBFBD> outp(uPort,iValue) <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><EFBFBD><EBA2A5><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> iValue <EFBFBD> <20><><EFBFBD><EFBFBD> uPort * Функция outp(uPort,iValue) позволяет вывести величину iValue в порт uPort *
<EFBFBD><EFBFBD><EFBFBD><EFBFBD> delay(uTime) <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ணࠬ<E0AEA3><E0A0AC><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><> uTime <20><><EFBFBD><EFBFBD><EFBFBD>ᥪ㭤 * Функция delay(uTime) организует программную задержку на uTime миллисекунд *
<EFBFBD><EFBFBD><EFBFBD><EFBFBD> getch() <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><><E1A8AC><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>. * Функция getch() считывает один символ из буфера клавиатуры. *
<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><20><><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> * В данном случае это надо для очистки буфера клавиатуры *
\**************************************************************************/ \**************************************************************************/
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD> <20><> <20><><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ணࠬ<E0AEA3><E0A0AC> <20><> <20><><EFBFBD><EFBFBD><E0AEA5><EFBFBD><EFBFBD> <20><><EFBFBD><E1A5AC><EFBFBD><EFBFBD><EFBFBD> // Снова читаем тот же порт с помощью программы на встроенном ассемблере
printf ("\n <EFBFBD><EFBFBD><EFBFBD><><EFBFBD><E0A6A8><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD>ᮬ 40 <20><><EFBFBD><E1A5AC><EFBFBD> \n" ); printf ("\n Читаем содержимое порта с адресом 40 ассемблером \n" );
while (bioskey(1) == 0 ) // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><> <20><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, while (bioskey(1) == 0 ) // Этот цикл будет повторяться,
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> // пока не нажмем клавишу
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><EFBFBD><EFBFBD><ECA7AE><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><E0AEA5><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><E1A5AC><EFBFBD><EFBFBD><EFBFBD> (3) // Примеры использования встроенного ассемблера (3)
{ {
asm { push ax // <EFBFBD><EFBFBD><EFBFBD><EFBFBD> ᯮᮡ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><E0AEA5><EFBFBD><EFBFBD> <20><><EFBFBD><E1A5AC><EFBFBD><EFBFBD><EFBFBD> asm { push ax // Один способ записи на встроенном ассемблере
in al,0x40 in al,0x40
} }
unsigned char Tmm = _AL; // <EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> mov Tmm,al unsigned char Tmm = _AL; // Эта команда эквивалентна mov Tmm,al
// !! <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> TD // !! Убедитесь в этом с помощью TD
asm pop ax // <EFBFBD><EFBFBD><EFBFBD> ᯮᮡ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><E0AEA5><EFBFBD><EFBFBD> <20><><EFBFBD><E1A5AC><EFBFBD><EFBFBD><EFBFBD> asm pop ax // Другой способ записи на встроенном ассемблере
delay (500); delay (500);
printf (" \n <EFBFBD><EFBFBD><EFBFBD><EFBFBD>40 = %d ", Tmm ); printf (" \n Порт40 = %d ", Tmm );
// <EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> - <20><> <20><> // Если нажата клавиша - то выход
} }
getch(); getch();
printf ("\n <EFBFBD><EFBFBD><EFBFBD> <20><EFBFBD><E0AEA4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> \n "); printf ("\n Для продолжения - нажмите любую клавишу \n ");
getch(); getch();
/************************************************************* /*************************************************************
<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><E1ACAE><EFBFBD><EFBFBD><EFBFBD><><EFBFBD><E0A6A8><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (<28><><EFBFBD><EFBFBD><E0A8AC>)<29><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E2AEA2> Как посмотреть содержимое длинной (например)четырехбайтовой
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 0046<EFBFBD> c <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><EFBFBD><E0A5A4><EFBFBD> <20><> */ переменной с адреса 0046С c помощью средств Си */
long far * pTime=(long *)0x46C; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD>稪 ⨪<><E2A8AA> long far * pTime=(long *)0x46C; // Указатель на счетчик тиков
while (bioskey(1) == 0) while (bioskey(1) == 0)
{ {
printf ("\n %ld",*pTime); printf ("\n %ld",*pTime);
delay(1000); delay(1000);
} }
getch(); getch();
// <EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><><EFBFBD><E0A6A8><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><E2AEA2> <20><><EFBFBD><E0A5AC><EFBFBD><EFBFBD><EFBFBD> // Читаем и печатаем содержимое двухбайтовой переменной
// <EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 0046C <20><EFBFBD><EFBFBD><E2A2A0> <20><><EFBFBD><EFBFBD><E0AEA5><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><E1A5AC><EFBFBD><EFBFBD><EFBFBD> // с адреса 0046C средствами встроенного ассемблера
int Time; int Time;
while (bioskey(1) == 0) while (bioskey(1) == 0)
{ {
asm push ds // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD> <20><><EFBFBD>砩 ॣ<><E0A5A3><EFBFBD><EFBFBD><EFBFBD> asm push ds // Сохраним на всякий случай регистры
asm push si asm push si
// <EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><E0AEA5><EFBFBD><EFBFBD> <20><><EFBFBD><E1A5AC><EFBFBD><EFBFBD><EFBFBD> // Во встроенном ассемблере
asm mov ax,40h // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EBA2A0> hex-<2D><><EFBFBD><EFBFBD><EFBFBD><E2A0AD> ... asm mov ax,40h // можно записывать hex-константы так ...
asm mov ds,ax asm mov ds,ax
asm mov si,0x6C // ... <EFBFBD><EFBFBD><EFBFBD> asm mov si,0x6C // ... или так
asm mov ax,[ds:si] asm mov ax,[ds:si]
asm mov Time,ax asm mov Time,ax
asm pop si // <EFBFBD><><E2A5AF><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><E2A0AD><EFBFBD><EFBFBD><><E0A5A3><EFBFBD><EFBFBD><EFBFBD> asm pop si // А теперь восстановим регистры
asm pop ds // (<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><E2A0A9> <20><><EFBFBD><EFBFBD> !!!) asm pop ds // (не перепутайте порядок !!!)
printf ("\n %d",Time); printf ("\n %d",Time);
delay(300); delay(300);
} }
/**************************************************************** /****************************************************************
<EFBFBD><EFBFBD><EFBFBD> <20><EFBFBD><EBAFAE><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <> <20> Пример выполнения задания типа И
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><EFBFBD> <20><EFBFBD><EBAFAE><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Требуется измерить время выполнения заданной команды
(<EFBFBD> <20><EFBFBD><E0A8AC><EFBFBD> - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> mov reg,mem, <20> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><EFBFBD><E0A5AF><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (в примере - команда mov reg,mem, а Вы спросите у преподавателя
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> ) какую команду Вам взять )
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><EFBFBD><E0A5AC><EFBFBD> <20><EFBFBD><EBAFAE><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><EFBFBD><E0A0A3><EFBFBD><EFBFBD><EFBFBD> <20>ணࠬ<E0AEA3><E0A0AC> */ Измерение времени выполнения фрагмента программы */
beep(400,200); // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>⬥砥<E2ACA5> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><E0A2A0> (5) beep(400,200); // Сигнал отмечает начало интервала (5)
for ( lCnt=0; lCnt<1000000; lCnt++) for ( lCnt=0; lCnt<1000000; lCnt++)
{ {
a1: asm { mov ax,iA a1: asm { mov ax,iA
mov ax,iA mov ax,iA
mov ax,iA mov ax,iA
mov ax,iA mov ax,iA
mov ax,iA mov ax,iA
mov ax,iA mov ax,iA
mov ax,iA mov ax,iA
mov ax,iA mov ax,iA
mov ax,iA mov ax,iA
a2: mov ax,iA } a2: mov ax,iA }
} }
beep(400,200); // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>⬥砥<E2ACA5> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><E0A2A0> (5) beep(400,200); // Сигнал отмечает конец интервала (5)
} }
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><E3AAAE><EFBFBD><EFBFBD><><E1A8A3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD>⥫쭮<E2A5AB><ECADAE><EFBFBD> (5) // Функция подачи звукового сигнала заданной высоты и длительности (5)
void beep(unsigned iTone,unsigned iDlit) void beep(unsigned iTone,unsigned iDlit)
{ sound(iTone); { sound(iTone);
delay(iDlit); delay(iDlit);
nosound(); nosound();
} }
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><EFBFBD><EBAFAE><EFBFBD><EFBFBD><EFBFBD><EFBFBD> // Результаты выполнения
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ணࠬ<E0AEA3><E0A0AC> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> // Запустили программу дважды
// <EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><20><><EFBFBD><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><E2AAA0> a1 <EFBFBD> a2 <EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E0AEA2> // При первом пуске участок между метками a1 и a2 был закомментирован
// <EFBFBD><EFBFBD> <20><EFBFBD><EBAFAE><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><E2A0A2><EFBFBD> 3.15 +- 0.2 ᥪ㭤 (<28><><EFBFBD> <20><EFBFBD><E6A5AD> <20><EFBFBD><E8A8A1> // Время выполнения составило 3.15 +- 0.2 секунд (для оценки ошибки
// <EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>७ 5 ࠧ <20> <20><20><EFBFBD><E6A5AD><EFBFBD> <20><EFBFBD><E0A5A4><EFBFBD> <20><><EFBFBD><EFBFBD><E7A5AD> <20> // прогон был повторен 5 раз и было оценено среднее значение и
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><EFBFBD><E2AAAB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>. <20><EFBFBD><E0A8A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><><E0A0A2> 2*<2A><><EFBFBD>) // среднеквадратическое отклонение. Приведенный допуск равен 2*СКО)
// <EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><20><><20><><EFBFBD><EFBFBD>⮪ a1-a2 ࠡ<>⠫. <20><EFBFBD> <20><EFBFBD><EBAFAE><EFBFBD><EFBFBD><EFBFBD><EFBFBD> // При втором пуске участок a1-a2 работал. Время выполнения
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 7.5 +- 0.2 ᥪ㭤. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E0A5AD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> MOV REG,MEM // составило 7.5 +- 0.2 секунд. Количество повторений команды MOV REG,MEM
// <EFBFBD><EFBFBD> 10^7, <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><EFBFBD><E0A5AC><EFBFBD><><E0A0A2> 4.35 +- 0.3 ᥪ㭤, <20><EFBFBD><E6A5AD> <20><EFBFBD><E0A5AC><EFBFBD> // равно 10^7, добавка времени равна 4.35 +- 0.3 секунд, оценка времени
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 0.44 +- 0.03 <EFBFBD><EFBFBD><EFBFBD>. // выполнения команды 0.44 +- 0.03 мкс.
// <EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> TD <20><><EFBFBD><E0A5A4><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><EFBFBD><EFBFBD><ECA7AE><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> // С помощью TD определили, что компилятор использовал адресацию
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> ᬥ饭<E1ACA5><E9A5AD><EFBFBD> [BP+disp] // базовая со смещением [BP+disp]
/* /*
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><EFBFBD><EBAFAE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><><E0A0A1><EFBFBD> LAB0-0 Задание на выполнение работы LAB0-0
1. <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><><E2A5AA> <20>ணࠬ<E0AEA3><E0A0AC> <20> <20><EFBFBD><EBA4A5><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><20><><EFBFBD><EFA7AD> <20><><EFBFBD><EFBFBD><EFBFBD>, 1. Прочитайте текст программы и выделите логически связные части,
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><><E2A5AA>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> поймите, что делают эти части. Разбирая текст, обратите внимание на
<EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD> <20>㭪樨 <20><> <20><EFBFBD><E1AFAE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><>祬. <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> то, какие функции Си используются и зачем. Делая это, научитесь
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><E2A5AA><EFBFBD><EFBFBD><EFBFBD> Help'<EFBFBD><EFBFBD> пользоваться контекстным Help'ом
2. <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ணࠬ<E0AEA3><E0A0AC> <20><><E3A1A5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD> <20> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><EFBFBD><E8A8A1> 2. Скомпилируйте программу и убедитесь, что в ней отсутствуют ошибки
3. <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ணࠬ<E0AEA3><E0A0AC>, <20><><EFBFBD><EFBFBD><EFBFBD><EEA4A0><EFBFBD><><E0A5A7><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><E3A1A5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD> <20><> <20><><EFBFBD><EFBFBD>- 3. Запустите программу, наблюдайте результат и убедитесь, что Вы пони-
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD> <20><EFBFBD><EFBFBD><E5AEA4>. маете, что происходит.
4. <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><EFBFBD><E1AFAE><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><E0AEA5><EFBFBD><EFBFBD> <20><EFBFBD> IDE: 4. Научитесь, используя встроенный отладчик IDE:
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ணࠬ<E0AEA3><E0A0AC> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><20><><EFBFBD><E2A0AD><EFBFBD>. <20><> <20><EFBFBD><E0AEA2> Выполнить программу до заданной точки останова. На уровне
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>-⥪<><E2A5AA><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><><E1A4A5><EFBFBD><EFBFBD>, <20><EFBFBD><E1AFAE><EFBFBD><EFBFBD><EFBFBD> <20><EFBFBD><E3ADAA> <20><><EFBFBD><EFBFBD> Run исходного Си-текста это можно сделать, используя пункты меню Run
<EFBFBD> Debug/Breakpoints. и Debug/Breakpoints.
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>/<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><><EFBFBD><E0A6A8><EFBFBD> <20><><EFBFBD><E0A5AC><EFBFBD><EFBFBD><EFBFBD> <20><><20><><EFBFBD><E2A0AD><EFBFBD>. Проверить/изменить содержимое переменных после останова.
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><EFBFBD> <20><><EFBFBD><EFBFBD> Debug/Evaluate/Modify, Используйте пункт меню Debug/Evaluate/Modify,
Debug/Inspect (<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Alt/F4) <EFBFBD><EFBFBD><EFBFBD><EFBFBD> Debug/Watches Debug/Inspect (горячая клавиша Alt/F4) либо Debug/Watches
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><EFBFBD> <20><EFBFBD><EBAFAE><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><EFBFBD><E0A5AF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E2A5AB> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Измерить время выполнения заданной преподавателем команды
⠪, <20><><EFBFBD> <20><><EFBFBD><><E1A4A5><EFBFBD><EFBFBD> <20> <20>ணࠬ<E0AEA3><E0A0AC> LAB0 <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> MOV REG,MEM. так, как это сделано в программе LAB0 с командой MOV REG,MEM.
5. <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><EFBFBD><EFBFBD> TD <20> <20><><EFBFBD><EFBFBD> CPU (<28><EFBFBD> <20><><EFBFBD><EFBFBD> View/CPU) <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: 5. Средствами отладчика TD в окне CPU (пункт меню View/CPU) научитесь:
- <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>/<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><><EFBFBD><E0A6A8><EFBFBD><><E0A5A3><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (<28><><EFBFBD><EFBFBD><E3ACA0><EFBFBD>, <20><>- - наблюдать/изменять содержимое регистров процессора (подумайте, ка-
<EFBFBD><EFBFBD><EFBFBD><><E0A5A3><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>- кие регистры можно менять безболезнено (изменения в некоторых ре-
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><EFBFBD><E0A8A2><EFBFBD><EFBFBD> <EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><ECADAE> <20><EFBFBD><EBAFAE><EFBFBD><EFBFBD><EFBFBD><EFBFBD> гистрах могут привести к фатальным для нормального выполнения
<EFBFBD>ணࠬ<EFBFBD><EFBFBD><><E0A5A7><EFBFBD><EFBFBD><EFBFBD>) программы результатам)
- <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>/<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><EFBFBD><E7A5A9> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><><E4A8A7><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>: - наблюдать/изменять ячейку памяти с известным физическим адресом:
(<EFBFBD><EFBFBD><EFBFBD>, 祬 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>㤠-<2D><><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><20><> <20><><EFBFBD><EFBFBD><E3ACA0>: <20><><EFBFBD> <20><><EFBFBD> <20><> (Прежде, чем писать куда-либо, хорошо было бы подумать: что это за
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> - <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>(<28><> <20><EFBFBD><E1AFAE><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>-<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> адрес - адрес ОЗУ(не использует ли этот адрес еще какая-нибудь
<EFBFBD>ணࠬ<EFBFBD><EFBFBD>), <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><><E4A8A7><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>⢮, ᮮ<>- программа), адрес ПЗУ, существует ли физическое устройство, соот-
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>... ветствующее данному адресу...
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: Варианты:
1. 0x46C 1. 0x46C
0x80000 0x80000
0xF000:0xFFF0 0xF000:0xFFF0
2. 0x0040:0x6D 2. 0x0040:0x6D
0x8000:0x0010 0x8000:0x0010
0xFFFFE 0xFFFFE
3. 0x41A 3. 0x41A
0x80210 0x80210
0xFFFF:0x100 0xFFFF:0x100
4. 0x0040:0x1E 4. 0x0040:0x1E
0xD00000 0xD00000
0x8000:0x200 0x8000:0x200
5. <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> - 0x41A-0x43C 5. область памяти - 0x41A-0x43C
0xD000:0x100 0xD000:0x100
0xFFFF:0xE 0xFFFF:0xE
- <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>/<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>/<2F><EFBFBD><EBA2AE> (<28><><EFBFBD><EFBFBD><E0A8AC>: <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> - читать/писать в произвольный порт ввода/вывода (например: считать
<EFBFBD><EFBFBD><EFBFBD><EFBFBD> 0x40 <EFBFBD><EFBFBD><EFBFBD>쪮 ࠧ - <20><><EFBFBD><EFBFBD><E0AEA1><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><E1ADA8> <20><><EFBFBD><EFBFBD><EFBFBD><EEA4A0><EFBFBD><EFBFBD><><E0A5A7><EFBFBD>- порт 0x40 несколько раз - попробуйте объяснить наблюдаемый резуль-
<EFBFBD><EFBFBD><EFBFBD>; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> 3 <EFBFBD> 61 <EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><20><><EFBFBD><EFBFBD>); тат; записать число 3 в 61 порт, потом быстро записать туда нуль);
6. <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><E1A5AC><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>࠭᫨஢<E1ABA8><E0AEA2> <20> <20><><20><> 6. Определите в какие команды Ассемблера оттранслирован с языка СИ
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><><E6A8AA>. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><EFBFBD><E0AEA2> <20><><EFBFBD><E1A5AC><EFBFBD><EFBFBD><EFBFBD><> <20><><EFBFBD><E0A8A0><><E6A8AA>. оператор цикла. Напишите на уровне Ассемблера свой вариант цикла.
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, १<><E0A5A7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><EFBFBD><EFBFBD><E2A0A2> <20><EFBFBD><E0A5AF><EFBFBD><EFBFBD><EFBFBD><EFBFBD>. Сравните, результаты представте преподавателю.
*/ */

View File

@ -1,87 +1,87 @@
/* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><E0AEA2><EFBFBD> <20><><EFBFBD><><E4A0A9> /* Структура растрового ВМР файла
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><><E0A0A1><EFBFBD> 12 Лабораторная работа 12
*/ */
#include <stdio.h> #include <stdio.h>
#include <conio.h> #include <conio.h>
typedef unsigned int WORD; typedef unsigned int WORD;
typedef unsigned long DWORD; typedef unsigned long DWORD;
struct BITMAPFILEHEADER { struct BITMAPFILEHEADER {
WORD bfType; WORD bfType;
DWORD bfSize; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><><E4A0A9> DWORD bfSize; // Размер файла
WORD bfReserved1; WORD bfReserved1;
WORD bfReserved2; WORD bfReserved2;
DWORD bfOffBits; DWORD bfOffBits;
}; };
struct BITMAPINFOHEADER{ struct BITMAPINFOHEADER{
DWORD biSize; DWORD biSize;
DWORD biWidth; DWORD biWidth;
DWORD biHeight; DWORD biHeight;
WORD biPlanes; WORD biPlanes;
WORD biBitCount; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><20><><EFBFBD> <20> <20><><EFBFBD><EFBFBD> WORD biBitCount; // Количество бит в пикселе
DWORD biCompression; DWORD biCompression;
DWORD biSizeImage; DWORD biSizeImage;
DWORD biXPelsPerMeter; DWORD biXPelsPerMeter;
DWORD biYPelsPerMeter; DWORD biYPelsPerMeter;
DWORD biClrUsed; DWORD biClrUsed;
DWORD biClrImportant; DWORD biClrImportant;
}; };
void main(int c,char **a) void main(int c,char **a)
{ {
FILE *in, *out; FILE *in, *out;
highvideo(); highvideo();
BITMAPFILEHEADER bfh; BITMAPFILEHEADER bfh;
BITMAPINFOHEADER bih; BITMAPINFOHEADER bih;
/* FILE *po; /* FILE *po;
if(argc==0) return 0; if(argc==0) return 0;
if(argc==2) { mode=257;} else mode=atoi(argv[2]); if(argc==2) { mode=257;} else mode=atoi(argv[2]);
po=fopen(argv[1],"rb"); po=fopen(argv[1],"rb");
fread(&bfh,14,1,po); fread(&bfh,14,1,po);
fread(&bih,40,1,po); fread(&bih,40,1,po);
if(bih.biBitCount!=8) return 1; if(bih.biBitCount!=8) return 1;
if(bih.biClrUsed==0){ cmax=256; } if(bih.biClrUsed==0){ cmax=256; }
else cmax=bih.biClrUsed; else cmax=bih.biClrUsed;
*/ */
cputs("(c) Rex Software'99 Bmp Universal Invertor v1.0"); cputs("(c) Rex Software'99 Bmp Universal Invertor v1.0");
normvideo(); normvideo();
cputs(""); cputs("");
int n,bpp; int n,bpp;
if (c!=2) if (c!=2)
{ {
puts("\nNeeds some bmps"); puts("\nNeeds some bmps");
return ; return ;
} }
in = fopen(a[1], "rb"); in = fopen(a[1], "rb");
if ((out = fopen("inversed.bmp", "wb"))== NULL) if ((out = fopen("inversed.bmp", "wb"))== NULL)
{ {
puts("Cannot open output file"); return ; puts("Cannot open output file"); return ;
} }
cprintf("\n"); cprintf("\n");
cputs("Please wait"); cputs("Please wait");
for (int i=0;i<54;i++) { for (int i=0;i<54;i++) {
int c=fgetc(in); int c=fgetc(in);
fputc(c,out); fputc(c,out);
if (i==28) bpp=c;} if (i==28) bpp=c;}
if (bpp==8) if (bpp==8)
{ {
for (i=0;i<1024;i++) fputc(255-fgetc(in),out); for (i=0;i<1024;i++) fputc(255-fgetc(in),out);
while (!feof(in)) fputc(fgetc(in),out); while (!feof(in)) fputc(fgetc(in),out);
} }
if (bpp==24) if (bpp==24)
{ for (int i=0;i<54;i++) fputc(fgetc(in),out); { for (int i=0;i<54;i++) fputc(fgetc(in),out);
while (!feof(in)) fputc(255-fgetc(in),out);} while (!feof(in)) fputc(255-fgetc(in),out);}
fcloseall(); fcloseall();
printf("\n%s is %d bit-per-pixel color depth bitmap\n",a[1],bpp); printf("\n%s is %d bit-per-pixel color depth bitmap\n",a[1],bpp);
puts("Successsfully retrieved to Inversed.bmp"); puts("Successsfully retrieved to Inversed.bmp");
} }
/* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> /* Задание
1. <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ணࠬ<E0AEA3><E0A0AC> <20><><EFBFBD><EFBFBD><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD><E0A0A6><EFBFBD><EFBFBD>. 1. Напишите программу бинаризации изображения.
2. <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ணࠬ<E0AEA3><E0A0AC> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E0AEA2><EFBFBD><EFBFBD> <20><EFBFBD><E5AEA4><EFBFBD><EFBFBD><><E4A0A9> (8 - 24 <EFBFBD><EFBFBD><EFBFBD><EFBFBD>) 2. Напишите программу тестирования входного файла (8 - 24 бита)
<EFBFBD><EFBFBD>易⥫쭮 <20><EFBFBD><E1AFAE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E0AEA2><EFBFBD><EFBFBD>. обязательно используйте структуры для тестирования.
*/ */

View File

@ -1,175 +1,175 @@
/* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><><E0A0A1><EFBFBD> 13 /* Лабораторная работа 13
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <><E0A5A6><EFBFBD> sVGA, VESA Видеоадаптер, графические режимы sVGA, VESA
*/ */
#include <dos.h> #include <dos.h>
#include <bios.h> #include <bios.h>
#include <conio.h> #include <conio.h>
#include <stdio.h> #include <stdio.h>
#define LOWORD(l) ((int)(1)) #define LOWORD(l) ((int)(1))
#define HIWORD(l) ((int)((l) >> 16)) #define HIWORD(l) ((int)((l) >> 16))
#define MYMODE1 113h //800x600x32k #define MYMODE1 113h //800x600x32k
#define MYMODE2 101h //640x480x256 #define MYMODE2 101h //640x480x256
#define MYMODE3 105h //1024x768x256 #define MYMODE3 105h //1024x768x256
int pattern_ust=1; int pattern_ust=1;
int current_b=0; int current_b=0;
/* struct Vesainfo { /* struct Vesainfo {
int attr_m; int attr_m;
char attr_a; char attr_a;
char attr_b; char attr_b;
int h_ust; int h_ust;
int size; int size;
unsigned segm_a; unsigned segm_a;
unsigned segm_b; unsigned segm_b;
void far (*fun)(); void far (*fun)();
int byte_str; int byte_str;
int resx; int resx;
int resy; int resy;
char xchsize; char xchsize;
char ychsize; char ychsize;
char kolvo; char kolvo;
char bit_pix; char bit_pix;
char kolvobank; char kolvobank;
char memmod; char memmod;
char size_bank; char size_bank;
char pages; char pages;
char reserved; char reserved;
char red_mask_s; char red_mask_s;
char red_mask_p; char red_mask_p;
char green_mask_s; char green_mask_s;
char green_mask_p; char green_mask_p;
char blue_mask_s; char blue_mask_s;
char blue_mask_p; char blue_mask_p;
char reserved_mask_s; char reserved_mask_s;
char reserved_mask_p; char reserved_mask_p;
char colour_info; char colour_info;
char reserved2[216]; char reserved2[216];
}mine; */ }mine; */
struct SvgaModeInfo struct SvgaModeInfo
{ {
unsigned state; unsigned state;
char a_window_state; char a_window_state;
char b_window_state; char b_window_state;
unsigned window_multiplicity; unsigned window_multiplicity;
unsigned window_size; unsigned window_size;
unsigned a_window_segment; unsigned a_window_segment;
unsigned b_window_segment; unsigned b_window_segment;
void far (*fun)(); void far (*fun)();
unsigned string_width; unsigned string_width;
unsigned width; unsigned width;
unsigned height; unsigned height;
char symbol_height; char symbol_height;
char symbol_width; char symbol_width;
char switches_count; char switches_count;
char bits_per_pixel; char bits_per_pixel;
char banks_count; char banks_count;
char memory_model; char memory_model;
char bank_size; char bank_size;
char pages_count; char pages_count;
char reserved1; char reserved1;
char red_mask; char red_mask;
char red_bit; char red_bit;
char green_mask; char green_mask;
char green_bit; char green_bit;
char blue_mask; char blue_mask;
char blue_bit; char blue_bit;
char reserved_mask; char reserved_mask;
char reserved_bit; char reserved_bit;
char palette_state; char palette_state;
char lfb[10]; char lfb[10];
char resrved2[206]; char resrved2[206];
}mine; }mine;
void Bank_ust(int begin) void Bank_ust(int begin)
{ {
if (begin==current_b) if (begin==current_b)
return; return;
current_b=begin; current_b=begin;
begin *= pattern_ust; begin *= pattern_ust;
asm{ asm{
mov ax,4F05h mov ax,4F05h
mov bx,0 mov bx,0
mov dx,begin mov dx,begin
push dx push dx
int 10h int 10h
pop dx pop dx
mov bx,1 mov bx,1
int 10h int 10h
}; };
} }
inline int RGBcolour(int red,int green,int blue) inline int RGBcolour(int red,int green,int blue)
{ {
return ((red >> 3)<<10) | ((green >> 3)<<5) | (blue >> 3); return ((red >> 3)<<10) | ((green >> 3)<<5) | (blue >> 3);
} }
void set_text_mode() void set_text_mode()
{ {
asm mov ax,0x0003 asm mov ax,0x0003
asm int 0x10 asm int 0x10
} }
void draw(int x,int y,int colour) void draw(int x,int y,int colour)
{ {
long ttt; long ttt;
asm{ asm{
mov dx,y //bank number mov dx,y //bank number
shr dx,6 shr dx,6
mov bx,0 mov bx,0
}; };
mine.fun(); mine.fun();
ttt = (y*1024%65536)+x; ttt = (y*1024%65536)+x;
_SI = (unsigned int)ttt; _SI = (unsigned int)ttt;
asm{ asm{
mov ax,colour mov ax,colour
mov bx,0xA000 mov bx,0xA000
mov es,bx mov es,bx
mov es:[si],al mov es:[si],al
}; };
} }
void paint(int begx,int begy,int endx,int endy,int colour) void paint(int begx,int begy,int endx,int endy,int colour)
{ {
int x,y; int x,y;
for(y=begy;y<=endy;y++) for(y=begy;y<=endy;y++)
for(x=begx;x<=endx;x++) for(x=begx;x<=endx;x++)
draw(x,y,colour); draw(x,y,colour);
} }
void main() void main()
{ {
int colour,x,y; int colour,x,y;
asm{ asm{
//information //information
mov cx,MYMODE3 mov cx,MYMODE3
lea di,mine lea di,mine
mov ax,ds mov ax,ds
mov es,ax mov es,ax
mov ax,0x4F01 mov ax,0x4F01
int 10h int 10h
}; };
asm{ //setting of this mode asm{ //setting of this mode
mov ax,4F02h mov ax,4F02h
mov bx,MYMODE3 mov bx,MYMODE3
int 10h int 10h
}; };
x=0; x=0;
y=0; y=0;
for(colour=1;colour<255;colour++){ for(colour=1;colour<255;colour++){
if(x>1024){ if(x>1024){
x=0; x=0;
y=y+48; y=y+48;
} }
paint(x,y,x+64,y+48,colour); paint(x,y,x+64,y+48,colour);
x=x+64; x=x+64;
} }
getch(); getch();
set_text_mode(); set_text_mode();
} }
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> // Задание
// 1. <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><E2AEAD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> 2 <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>. // 1. Выведите полутоновой клин во 2 банке памяти.
// 2. <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><E1AFAE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD>. // 2. Определите как располагаются банки памяти на экране.
// //

View File

@ -1,184 +1,184 @@
/* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><><E0A0A1><EFBFBD> 14 /* Лабораторная работа 14
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><> <20><><EFBFBD><E0A0AB><EFBFBD><EFBFBD><ECADAE> <20><EFBFBD><EBAFAE><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Объединение команд для их параллельного выполнения
(<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><EFBFBD><E0AEA2> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>) (оптимизация уровня команд)
*/ */
#include <stdio.h> #include <stdio.h>
#include <conio.h> #include <conio.h>
void NullProc(void){} void NullProc(void){}
void ExTime(void (*PP)(void)) void ExTime(void (*PP)(void))
{ {
long far* pTime = (long*)0x46C; //<EFBFBD><EFBFBD><EFBFBD><EFBFBD>稪 ⨪<><E2A8AA> long far* pTime = (long*)0x46C; //счетчик тиков
long Time0, Time1, Time2, i; long Time0, Time1, Time2, i;
void (*NP)(void); void (*NP)(void);
NP = NullProc; NP = NullProc;
Time0 = *pTime; Time0 = *pTime;
for (i = 1; i<1000000L; i++) for (i = 1; i<1000000L; i++)
{ {
NP(); NP();
NP(); NP();
NP(); NP();
NP(); NP();
NP(); NP();
NP(); NP();
NP(); NP();
NP(); NP();
NP(); NP();
NP(); NP();
} }
Time1 = *pTime; Time1 = *pTime;
for (i = 1; i<1000000L; i++) for (i = 1; i<1000000L; i++)
{ {
PP(); PP();
PP(); PP();
PP(); PP();
PP(); PP();
PP(); PP();
PP(); PP();
PP(); PP();
PP(); PP();
PP(); PP();
PP(); PP();
} }
Time2 = *pTime; Time2 = *pTime;
Time2 = (((Time2 - Time1) - (Time1 - Time0))*(6553500L/1193180L)); Time2 = (((Time2 - Time1) - (Time1 - Time0))*(6553500L/1193180L));
printf("%ld <EFBFBD><EFBFBD>\n",Time2); printf("%ld нс\n",Time2);
} }
void P1(void) //<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><E1A8AC><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> void P1(void) //регистровые зависимости имеются
{ {
asm{ asm{
mov ax,bx mov ax,bx
mov dx,ax mov dx,ax
stc stc
adc bx,cx adc bx,cx
stc stc
sbb dx,ax sbb dx,ax
add ax,bx add ax,bx
mov cx,ax mov cx,ax
sub dx,bx sub dx,bx
mov bx,dx mov bx,dx
} }
} }
void P2(void) //<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><E1A8AC><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><E0A0AD><EFBFBD> void P2(void) //регистровые зависимости устранены
{ {
asm{ asm{
} }
} }
void P3(void) //<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ᯠ७<E1AFA0><E0A5AD><EFBFBD><EFBFBD><EFBFBD> void P3(void) //другие причины неспаренности
{ {
asm{ asm{
mov cl,3 //<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> mov cl,3 //непосредственный операнд
inc bx inc bx
mov cl,3 mov cl,3
dec bx dec bx
mov cl,3 mov cl,3
inc bx inc bx
mov cl,3 mov cl,3
dec bx dec bx
inc bx //<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><><E1A4A2><EFBFBD> <20> cl <20> <20><><EFBFBD><EFBFBD><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD> inc bx //команды сдвига с cl в качестве счетчика
ror ax,cl ror ax,cl
dec bx dec bx
rol ax,cl rol ax,cl
inc dx //<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD>䨪ᠬ<E4A8AA> <20>. <EFBFBD>. <EFBFBD> U - <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> inc dx //команды с префиксами м. б. в U - конвейере
mov ax,ds:[bx] mov ax,ds:[bx]
mov ax,ss:[bx] mov ax,ss:[bx]
mov ax,es:[bx] mov ax,es:[bx]
mov ax,cs:[bx] mov ax,cs:[bx]
mov cl,3 mov cl,3
mov cl,3 mov cl,3
mov cl,3 mov cl,3
dec dx dec dx
inc dx //<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><><E1A4A2><EFBFBD> <20>. <EFBFBD>. <EFBFBD> U - <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> inc dx //команды сдвига м. б. в U - конвейере
ror ax,1 ror ax,1
rol ax,1 rol ax,1
dec dx dec dx
} }
} }
void P4(void) //<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ᯠ७<E1AFA0><E0A5AD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><E0A0AD><EFBFBD> void P4(void) //причины неспаренности устранены
{ {
asm{ asm{
} }
} }
void main(void) void main(void)
{ {
clrscr(); clrscr();
printf("Program1 - <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><E1A8AC><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>\n"); printf("Program1 - регистровые зависимости имеются\n");
ExTime(P1); ExTime(P1);
printf("Program2 - <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><E1A8AC><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><E0A0AD><EFBFBD>\n"); printf("Program2 - регистровые зависимости устранены\n");
ExTime(P2); ExTime(P2);
printf("Program3 - <EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ᯠ७<E1AFA0><E0A5AD><EFBFBD><EFBFBD><EFBFBD>\n"); printf("Program3 - другие причины неспаренности\n");
ExTime(P3); ExTime(P3);
printf("Program4 - <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ᯠ७<E1AFA0><E0A5AD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><E0A0AD><EFBFBD>\n"); printf("Program4 - причины неспаренности устранены\n");
ExTime(P4); ExTime(P4);
getch(); getch();
} }
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> //Задание
// 1. <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ᯠ७<E1AFA0><E0A5AD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>. // 1. Устраните причины неспаренности команд.
// 2. <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><E1ADA8> <20><EFBFBD> <20><EFBFBD><EBAFAE><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><EFBFBD><E0A0A3><EFBFBD><20>ணࠬ<E0AEA3>. // 2. Определите и объясните время выполнения фрагментов программ.
// //
/* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> /* ПРАВИЛА ОБЪЕДИНЕНИЯ КОМАНД
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Pentium <20><><EFBFBD><EFBFBD><EFBFBD> <20><EFBFBD><EBAFAE><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Процессор Pentium может выполнять одну или две команды в каждом
<EFBFBD><EFBFBD>. <20><><EFBFBD> <20><EFBFBD><EBAFAE><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E0A5AC><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> такте. Для выполнения в процессоре одновременно двух команд они
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><><E3A4AE><EFBFBD><EFBFBD><E2A2AE><EFBFBD><EFBFBD><><E1ABA5><EFBFBD><20><EFBFBD><E1ABAE><EFBFBD><EFBFBD>: должны удовлетворять следующим условиям:
-<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFA7A0> <20><><EFBFBD><EFBFBD> <<3C><><EFBFBD><EFBFBD><EFBFBD>묨> <20> <20><><EFBFBD>᫥, <20><><EFBFBD><E0A5A4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> -обе команды в паре обязаны быть <простыми> в смысле, определенном
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>; ниже;
-<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><><E0A5A3><EFBFBD><EFBFBD><E0AEA2> <20><><EFBFBD><EFBFBD><EFBFBD><E1A8AC><> <20><EFBFBD><E2A5AD>- <20><>- -между ними не должно быть регистровых зависимостей типа чтение- после-
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>-<2D><>᫥-<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (read-after-write or write-after-wnte) , записи или запись-после-записи (read-after-write or write-after-wnte) ,
-<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><><EFBFBD><E0A6A0> ᬥ饭<E1ACA5><E9A5AD> (displacement) <EFBFBD> -ни одна из команд не может содержать смещение (displacement) и
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>; непосредственный операнд;
-<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD>䨪ᠬ<E4A8AA> (<28><> <20><EFBFBD><EFBFBD><E7A5AD><EFBFBD> OF <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> JCC) -команды с префиксами (за исключением OF в командах перехода JCC)
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ⮫쪮 <20> U-<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>. могут встречаться только в U-конвейере.
<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><E0A0A2><EFBFBD><EFBFBD><EFBFBD> Под простыми командами понимаются команды, управление
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E2A2AB><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>⭮, <20><><EFBFBD> <20><EFBFBD><EFBFBD><ECA7AE><EFBFBD><EFBFBD><EFBFBD> выполнением которых осуществляется аппаратно, без использования
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><><E0A5A0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><>. <20><EFBFBD><EFBFBD><E7A5AD><EFBFBD><><EFA2AB><EFBFBD><EFBFBD><EFBFBD> микрокоманд, и которые реализуются за один такт. Исключением являются
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ALU mem, reg <EFBFBD> ALU reg, mem, <EFBFBD><EFBFBD><EFBFBD><20><><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD> ⠪⮢ <20><><EFBFBD> команды ALU mem, reg и ALU reg, mem, требующие трех и двух тактов для
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ᮮ⢥<E1AEAE><E2A2A5><EFBFBD><E2A2A5><EFBFBD>. <20><><EFBFBD><EFBFBD><E6A8A0><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><EFBFBD> выполнения соответственно. Специальные аппаратные средства
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><> <20><EFBFBD><EBAFAE><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> используются для их выполнения как простых команд. Следующие
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><E0A8A2><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> целочисленные команды рассматриваются в качестве простых и могут быть
ᯠ७<EFBFBD>: спарены:
-mov reg, reg/mem/imnl -mov reg, reg/mem/imnl
-mov mem, reg/imm (<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><E0A5A4><EFBFBD>) ; -mov mem, reg/imm (команды передачи) ;
-alu reg, reg/mero/imm (<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><E4ACA5><EFBFBD><EFBFBD><EFBFBD> -alu reg, reg/mero/imm (команды арифметических
- alu meln , reg/ imm <EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>) ; - alu meln , reg/ imm и логических операций) ;
- inc reg/mem (<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><E0A5AC><EFBFBD><EFBFBD>, - inc reg/mem (команды инкремента,
- dec reg/mem (<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>) ; - dec reg/mem (декремента) ;
-push reg/mem (<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><E9A5AD> -push reg/mem (команды обращения
- pop reg (<EFBFBD> <20><EFBFBD><E2A5AA><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>) ; - pop reg (к стековой памяти) ;
-lea reg,mem (<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><><E1A5A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><><E0A5A3><EFBFBD>) ; -lea reg,mem (команды загрузки сегментных регистров) ;
-jmp/call/jcc near (<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><E0A5A4><EFBFBD> <20><><EFBFBD><E0A0A2><EFBFBD><EFBFBD><EFBFBD>) ; -jmp/call/jcc near (команды передачи управления) ;
-n<EFBFBD><EFBFBD> (<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>) . -nор (пустая команда) .
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><E1ABAE><EFBFBD><EFBFBD> <20> <20><EFBFBD><E1ABAE><EFBFBD><EFBFBD> <20><><EFBFBD><E0A5A4> <20><><EFBFBD><E0A0A2><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> Команды безусловной и условной передач управления могут
<EFBFBD>6쥤<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD>, <20><20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD>. оединяться в пары, если они встречаются в качестве вторых команд в паре.
<EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> ᯠ७<E1AFA0> <20><><><E1ABA5><EFBFBD><20><><EFBFBD><E1ABA5><EFBFBD><EFBFBD>⥫쭮<E2A5AB> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>. <20><><EFBFBD><EFBFBD><EFBFBD> Они не могут быть спарены со следующей последовательной командой. Также
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> SHIFT/ROT <EFBFBD><EFBFBD><><E1A4A2><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><><E0A0A7><EFBFBD> <20> SHIFT <20><> <20><EFBFBD><E0AEA8><EFBFBD><EFBFBD><EFBFBD> команды SHIFT/ROT со сдвигом на один разряд и SHIFT на произвольное
<EFBFBD><EFBFBD>᫮ ࠧ<><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> ᯠਢ<E1AFA0><E0A8A2><EFBFBD><EFBFBD><EFBFBD> ⮫쪮 <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ( <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD>). число разрядов могут спариваться только как первые ( команды в паре).
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><E1A8AC><EFBFBD><EFBFBD> Регистровые зависимости
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><E1A8AC><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>騥 ᯠਢ<E1AFA0><E0A8A2><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Регистровые зависимости, запрещающие спаривание команд, включают
<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><E1A8AC><EFBFBD><EFBFBD> <20><>१ ॣ<><E0A5A3><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><><E4ABA0>, <20><><><E3AAA0><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>. неявные зависимости через регистры или флаги, не указанные в команде.
<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><E1A8AC><20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E0AEA2><EFBFBD> <20><> Все виды зависимостей по данным могут быть классифицированы по
<EFBFBD> <20><><EFBFBD><EFBFBD>樠権: RAR - "<22><EFBFBD><E2A5AD> <20><><20><EFBFBD><E2A5AD>", WAR - "<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><20><EFBFBD><E2A5AD>" <EFBFBD> типу ассоциаций: RAR - "чтение после чтения", WAR - "запись после чтения" и
WAW - "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>", RAW - "<22><EFBFBD><E2A5AD> <20><><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>". <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> WAW - "запись после записи", RAW - "чтение после записи". Некоторые из
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><E0A0AD><EFBFBD>. RAR, <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>, зависимостей по данным могут быть устранены. RAR, по сути дела,
ᮮ⢥<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><E1A8AC>⥩, <20><><EFBFBD><E1AAAE><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><20><><EFBFBD><EFBFBD> соответствует отсутствию зависимостей, поскольку в данном случае порядок
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><E7A5AD>. <20><><EFBFBD><EFBFBD>⢨⥫쭮<E2A5AB> <20><><EFBFBD><EFBFBD><EFBFBD><E1A8AC><EFBFBD><EFBFBD><EFBFBD><><EFA2AB><EFBFBD><EFBFBD><EFBFBD> выполнения команд не имеет значения. Действительной зависимостью является
⮫쪮 "<22><EFBFBD><E2A5AD> <20><><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>" (RAW), ⠪ <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><E5AEA4><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> только "чтение после записи" (RAW), так как необходимо прочитать
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>⥫쭮 <20><><EFBFBD><EFBFBD><EFBFBD><E1A0AD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>. предварительно записанные новые данные, а не старые.
<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><E1A8AC><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFA2AB><EFBFBD><EFBFBD><EFBFBD> <20><><E0A5A7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> "<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> Лишние зависимости по данным появляются в результате "записи после
<EFBFBD><EFBFBD><EFBFBD>" (WAR) <EFBFBD> "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>" (WAW). <20><><EFBFBD><EFBFBD><EFBFBD><E1A8AC><EFBFBD><EFBFBD> WAR <20><><EFBFBD><EFBFBD> <20> чтения" (WAR) и "записи после записи" (WAW). Зависимость WAR состоит в
⮬, <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><E7A5AD> <20> <20><EFBFBD><E7A5A9> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><><E0A5A3><EFBFBD><EFBFBD>, том, что команда должна записать новое значение в ячейку памяти или регистр,
<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><EFBFBD><E0AEA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><EFBFBD><E2A5AD>. <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><E1A8AC><EFBFBD><EFBFBD> <20><><EFBFBD><EFA2AB><EFBFBD><EFBFBD><EFBFBD> из которых должно быть произведено чтение. Лишние зависимости появляются
<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><E7A8AD>: <20><> <20><><EFBFBD><E2A8AC><EFBFBD><EFBFBD><E0AEA2><EFBFBD><EFBFBD><EFBFBD> <20>ணࠬ<E0AEA3><E0A0AC><EFBFBD><EFBFBD> <20><><EFBFBD>, <20><><EFBFBD><EFBFBD><E7A5AD> по нескольким причинам: не оптимизированный программный код, ограничение
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>⢠ ॣ<><E0A5A3><EFBFBD>஢, <20><><EFBFBD><E0A5AC><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><20>ணࠬ<E0AEA3><E0A0AC><EFBFBD><EFBFBD> количества регистров, стремление к экономии памяти, наличие программных
<EFBFBD><EFBFBD><EFBFBD>. циклов.
*/ */

View File

@ -1,256 +1,256 @@
/* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><><E0A0A1><EFBFBD> 15 /* Лабораторная работа 15
Saund Blaster Saund Blaster
FM ᨭ⥧ FM синтез
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Задание
1. <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>, <20><EFBFBD><EBA7AE><EFBFBD><EFBFBD><><E1AFA5><EFBFBD><EFBFBD><E4A5AA> 1. Проиграйте гамму, вызовите спецэффекты
2. <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 2. Сыграйте мелодию
*/ */
#include <stdio.h> #include <stdio.h>
#include <dos.h> #include <dos.h>
#include <conio.h> #include <conio.h>
#include <stdlib.h> #include <stdlib.h>
#include <ctype.h> #include <ctype.h>
#include <string.h> #include <string.h>
#define KEYON 0x20 // key-on bit in regs b0 - b8 #define KEYON 0x20 // key-on bit in regs b0 - b8
#define FM 8 // SB (mono) ports (e.g. 228H and 229H) #define FM 8 // SB (mono) ports (e.g. 228H and 229H)
unsigned IOport=544; // Sound Blaster port address unsigned IOport=544; // Sound Blaster port address
void mydelay(unsigned long clocks) void mydelay(unsigned long clocks)
// time = clocks / 2386360 // time = clocks / 2386360
{ {
unsigned long elapsed=0; unsigned long elapsed=0;
unsigned int last,next,ncopy,diff; unsigned int last,next,ncopy,diff;
/* Read the counter value. */ /* Read the counter value. */
outp(0x43,0); /* want to read timer 0 */ outp(0x43,0); /* want to read timer 0 */
last=inp(0x40); /* low byte */ last=inp(0x40); /* low byte */
last=~((inp(0x40)<< 8) + last); /* high byte */ last=~((inp(0x40)<< 8) + last); /* high byte */
do { do {
/* Read the counter value. */ /* Read the counter value. */
outp(0x43,0); /* want to read timer 0 */ outp(0x43,0); /* want to read timer 0 */
next=inp(0x40); /* low byte */ next=inp(0x40); /* low byte */
ncopy=next=~((inp(0x40)<< 8) + next); /* high byte */ ncopy=next=~((inp(0x40)<< 8) + next); /* high byte */
next-=last; /* this is now number of elapsed clock pulses since last read */ next-=last; /* this is now number of elapsed clock pulses since last read */
elapsed += next; /* add to total elapsed clock pulses */ elapsed += next; /* add to total elapsed clock pulses */
last=ncopy; last=ncopy;
} while (elapsed<clocks); } while (elapsed<clocks);
} }
void FMoutput(unsigned port, int reg, int val) void FMoutput(unsigned port, int reg, int val)
/* This outputs a value to a specified FM register at a specified FM port. */ /* This outputs a value to a specified FM register at a specified FM port. */
{ {
outp(port, reg); outp(port, reg);
mydelay(8); /* need to wait 3.3 microsec */ mydelay(8); /* need to wait 3.3 microsec */
outp(port+1, val); outp(port+1, val);
mydelay(55); /* need to wait 23 microsec */ mydelay(55); /* need to wait 23 microsec */
} }
void fm(int reg, int val) void fm(int reg, int val)
/* This function outputs a value to a specified FM register at the Sound /* This function outputs a value to a specified FM register at the Sound
* Blaster (mono) port address. * Blaster (mono) port address.
*/ */
{ {
FMoutput(IOport+FM, reg, val); FMoutput(IOport+FM, reg, val);
} }
void outdsp (unsigned char ch) void outdsp (unsigned char ch)
{ {
while (inportb(0x022C)&0x80); while (inportb(0x022C)&0x80);
outportb(0x022C,ch); outportb(0x022C,ch);
} }
void midimain(void) void midimain(void)
{ {
int i,val1,val2; int i,val1,val2;
int block,b,m,f,fn; int block,b,m,f,fn;
clrscr(); clrscr();
printf("Program compiled for Sound Blaster 1.0 - 2.0 .\n"); printf("Program compiled for Sound Blaster 1.0 - 2.0 .\n");
fm(1,0); /* must initialize this to zero */ fm(1,0); /* must initialize this to zero */
fm(0xC0,1); /* parallel connection */ fm(0xC0,1); /* parallel connection */
/*************************************** /***************************************
* Set parameters for the carrier cell * * Set parameters for the carrier cell *
***************************************/ ***************************************/
fm(0x23,0x21); /* no amplitude modulation (D7=0), no vibrato (D6=0), fm(0x23,0x21); /* no amplitude modulation (D7=0), no vibrato (D6=0),
* sustained envelope type (D5=1), KSR=0 (D4=0), * sustained envelope type (D5=1), KSR=0 (D4=0),
* frequency multiplier=1 (D4-D0=1) * frequency multiplier=1 (D4-D0=1)
*/ */
fm(0x43,0x0); /* no volume decrease with pitch (D7-D6=0), fm(0x43,0x0); /* no volume decrease with pitch (D7-D6=0),
* no attenuation (D5-D0=0) * no attenuation (D5-D0=0)
*/ */
fm(0x63,0xff); /* fast attack (D7-D4=0xF) and decay (D3-D0=0xF) */ fm(0x63,0xff); /* fast attack (D7-D4=0xF) and decay (D3-D0=0xF) */
fm(0x83,0x05); /* high sustain level (D7-D4=0), slow release rate (D3-D0=5) */ fm(0x83,0x05); /* high sustain level (D7-D4=0), slow release rate (D3-D0=5) */
/***************************************** /*****************************************
* Set parameters for the modulator cell * * Set parameters for the modulator cell *
*****************************************/ *****************************************/
fm(0x20,0x20); /* sustained envelope type, frequency multiplier=0 */ fm(0x20,0x20); /* sustained envelope type, frequency multiplier=0 */
fm(0x40,0x3f); /* maximum attenuation, no volume decrease with pitch */ fm(0x40,0x3f); /* maximum attenuation, no volume decrease with pitch */
/* Since the modulator signal is attenuated as much as possible, these /* Since the modulator signal is attenuated as much as possible, these
* next two values shouldn't have any effect. * next two values shouldn't have any effect.
*/ */
fm(0x60,0x44); /* slow attack and decay */ fm(0x60,0x44); /* slow attack and decay */
fm(0x80,0x05); /* high sustain level, slow release rate */ fm(0x80,0x05); /* high sustain level, slow release rate */
/************************************************* /*************************************************
* Generate tone from values looked up in table. * * Generate tone from values looked up in table. *
*************************************************/ *************************************************/
printf("440 Hz tone, values looked up in table.\n"); printf("440 Hz tone, values looked up in table.\n");
fm(0xa0,0x41); /* 440 Hz */ fm(0xa0,0x41); /* 440 Hz */
fm(0x20,0x40); fm(0x20,0x40);
fm(0xb0,0x32); /* 440 Hz, block 0, key on */ fm(0xb0,0x32); /* 440 Hz, block 0, key on */
getche(); getche();
fm(0xb0,0x12); /* key off */ fm(0xb0,0x12); /* key off */
/********************************************************* /*********************************************************
* Generate a range of octaves by changing block number. * * Generate a range of octaves by changing block number. *
*********************************************************/ *********************************************************/
printf("Range of frequencies created by changing block number.\n"); printf("Range of frequencies created by changing block number.\n");
for (block=0; block<=7; block++) { for (block=0; block<=7; block++) {
printf("f=%5ld Hz (press Enter)\n",(long)440*(1 << block)/16); printf("f=%5ld Hz (press Enter)\n",(long)440*(1 << block)/16);
fm(0xB0,((fn >> 8) & 0x3) + (block << 2) | KEYON); fm(0xB0,((fn >> 8) & 0x3) + (block << 2) | KEYON);
getche(); getche();
} }
/***************************************************************** /*****************************************************************
* Generate a range of frequencies by changing frequency number. * * Generate a range of frequencies by changing frequency number. *
*****************************************************************/ *****************************************************************/
printf("Range of frequencies created by changing frequency number.\n"); printf("Range of frequencies created by changing frequency number.\n");
block=4; block=4;
for (fn=0; fn<1024; fn++) { for (fn=0; fn<1024; fn++) {
fm(0xA0,(fn & 0xFF)); fm(0xA0,(fn & 0xFF));
fm(0xB0,((fn >> 8) & 0x3) + (block << 2) | KEYON); fm(0xB0,((fn >> 8) & 0x3) + (block << 2) | KEYON);
delay(1); delay(1);
} }
/********************************* /*********************************
* Attenuate the signal by 3 dB. * * Attenuate the signal by 3 dB. *
*********************************/ *********************************/
getche(); getche();
fm(0xB0,((fn >> 8) & 0x3) + (block << 2) | KEYON); fm(0xB0,((fn >> 8) & 0x3) + (block << 2) | KEYON);
printf("Attenuated by 3 dB.\n"); printf("Attenuated by 3 dB.\n");
fm(0x43,4); /* attenuate by 3 dB */ fm(0x43,4); /* attenuate by 3 dB */
getche(); getche();
fm(0xB0,((fn >> 8) & 0x3) + (block << 2)); fm(0xB0,((fn >> 8) & 0x3) + (block << 2));
exit(0); exit(0);
} }
unsigned int x; unsigned int x;
FILE *fp; FILE *fp;
char buf,key; char buf,key;
unsigned long playtime,showtime; unsigned long playtime,showtime;
unsigned char gstring[80]; unsigned char gstring[80];
int main ( int argc, char *argv[] ) int main ( int argc, char *argv[] )
{ {
//---------------- //----------------
// Initialize DSP for Voice // Initialize DSP for Voice
//------------- //-------------
outportb(0x0226,0x01); outportb(0x0226,0x01);
delay(3); delay(3);
outportb(0x0226,0x00); outportb(0x0226,0x00);
for(x=0;x<100;x++) for(x=0;x<100;x++)
{ {
if(inportb(0x022E)&0x80) if(inportb(0x022E)&0x80)
{ {
if(inportb(0x022A)==0xAA) break; if(inportb(0x022A)==0xAA) break;
} }
} }
if(x==100) if(x==100)
{ {
printf("Sound Blaster not found at 0220h\n"); printf("Sound Blaster not found at 0220h\n");
exit(1); exit(1);
} }
//------------ //------------
// Menu // Menu
//----------------- //-----------------
clrscr(); clrscr();
printf("1) Play original\n2) Play reduced\n3) FM Synth\n4) Exit\n"); printf("1) Play original\n2) Play reduced\n3) FM Synth\n4) Exit\n");
key=getch(); key=getch();
if (key=='4') exit(0); if (key=='4') exit(0);
if (key=='3') midimain(); if (key=='3') midimain();
//------------ //------------
// Read file & play // Read file & play
//----------------- //-----------------
clrscr(); clrscr();
printf("Program compiled for Sound Blaster ver. 1.0 (8bit 44100Hz mono).\n\n"); printf("Program compiled for Sound Blaster ver. 1.0 (8bit 44100Hz mono).\n\n");
if (key=='1') printf("Normal play.\n"); if (key=='1') printf("Normal play.\n");
if (key=='2') printf("Reduced play.\n"); if (key=='2') printf("Reduced play.\n");
printf("Playing .wav ...\n\n"); printf("Playing .wav ...\n\n");
if(argc==1) if(argc==1)
{ {
printf(".WAV file not specified\n"); printf(".WAV file not specified\n");
exit(1); exit(1);
} }
strcpy(gstring,argv[1]); strcpy(gstring,argv[1]);
strcat(gstring,".WAV"); strcat(gstring,".WAV");
if((fp=fopen(gstring,"rb"))==0) if((fp=fopen(gstring,"rb"))==0)
{ {
strcpy(gstring,argv[1]); strcpy(gstring,argv[1]);
if((fp=fopen(gstring,"rb"))==0) if((fp=fopen(gstring,"rb"))==0)
{ {
printf("Error opening .WAV file [%s]\n",argv[1]); printf("Error opening .WAV file [%s]\n",argv[1]);
exit(1); exit(1);
} }
} }
printf("FILE: [%s]\n",gstring); printf("FILE: [%s]\n",gstring);
fseek(fp,36L,SEEK_SET); fseek(fp,36L,SEEK_SET);
while (inportb(0x022C)&0x80); while (inportb(0x022C)&0x80);
outdsp(0xD1); //speaker on outdsp(0xD1); //speaker on
playtime=0; playtime=0;
while (fread(&buf,1,1,fp)!=0) while (fread(&buf,1,1,fp)!=0)
{ {
if(key=='2') fread(&buf,1,1,fp); if(key=='2') fread(&buf,1,1,fp);
if(key=='2') mydelay(15); if(key=='2') mydelay(15);
if(key=='2') playtime++; if(key=='2') playtime++;
if(key=='2') showtime=playtime/100000; if(key=='2') showtime=playtime/100000;
if(key=='2') if (showtime*100000== playtime) printf("Time: %u \r",showtime); if(key=='2') if (showtime*100000== playtime) printf("Time: %u \r",showtime);
outdsp(0x10); outdsp(0x10);
outdsp(buf); outdsp(buf);
mydelay(15); mydelay(15);
playtime++; playtime++;
showtime=playtime/100000; showtime=playtime/100000;
if (showtime*100000== playtime) printf("Time: %u r",showtime); if (showtime*100000== playtime) printf("Time: %u r",showtime);
} }
outdsp(0xD3); //speaker off outdsp(0xD3); //speaker off
fclose(fp); fclose(fp);
return 0; return 0;
}; };

578
Labv2.cpp
View File

@ -1,289 +1,289 @@
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ணࠬ<E0AEA3><E0A0AC> <20><><EFBFBD> <20><><EFBFBD><><E0A0A1><EFBFBD> LAB2 // Шаблон программы для лаб работы LAB2
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> // Изучение системы команд
#include <stdio.h> #include <stdio.h>
#include <conio.h> #include <conio.h>
int main (void) int main (void)
{ int aa; { int aa;
clrscr(); clrscr();
/* /*
******************************************************** ********************************************************
1 2 3 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ணࠬ<E0AEA3><E0A0AC>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>騥 ࠡ<><E0A0A1><EFBFBD><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: 1 2 3 Напишите программы, иллюстрирующие работу след команд:
1. <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> JL. 1. Команда JL.
JL metka. JL metka.
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><20><><><E3AAA0><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>, Осуществляет переход на указанную метку,
<EFBFBD>᫨ १<><E0A5A7><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><EFBFBD><E0A5A4><EFBFBD><EFBFBD> <20><EFBFBD><E0A0A2><EFBFBD><EFBFBD><EFBFBD>: <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> если результат предыдущего сравнения: БОЛЬШЕ
(<EFBFBD><EFBFBD><EFBFBD><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E2A2AB><EFBFBD><EFBFBD><EFBFBD>, <20>᫨ 䫠<><E4ABA0> SF=0 <EFBFBD> OF =0) (Переход осуществляется, если флаги SF=0 и OF =0)
asm { asm {
cmp ax, 13 cmp ax, 13
JL metka JL metka
..... ; <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>-<2D><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ..... ; какой-то блок команд
metka: metka:
...... ; <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>-<2D><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ...... ; какой-то блок команд
}; };
2. <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ROL 2. Команда ROL
Rol ax, 1 Rol ax, 1
Rol bx, cl Rol bx, cl
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><><E6A8AA><EFBFBD><EFBFBD><EFBFBD><E1AAAE><><E1A4A2><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>. Команда циклического сдвига влево.
<EFBFBD><20><><EFBFBD><20><><EFBFBD><EFBFBD> - CL, <20><> <20><>᫮ ࠧ<><EFBFBD>, <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Если второй операнд - CL, то число разрядов, на которые
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><><E1A4A2>, <20><><EFBFBD><E0A5A4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><><EFBFBD><E0A6A8><EFBFBD><><E0A5A3><EFBFBD><EFBFBD><EFBFBD> CL. осуществляется сдвиг, определяется содержимым регистра CL.
3. <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> LEA. 3. Команда LEA.
<EFBFBD><EFBFBD> <20><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><E0A0AD> <20><><EFBFBD><E0A5A4><EFBFBD><EFBFBD><EFBFBD> <20><><E0A5A3><EFBFBD><EFBFBD> По этой команде адрес второго операнда передается в регистр
<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><E0A0AD>. первого операнда.
lea ax, a; lea ax, a;
4. <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> NOP 4. Команда NOP
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> Команда нет операции
5. <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> AND 5. Команда AND
and ax,bx and ax,bx
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E1AAAE><><E3ACAD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Команда логического умножения
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><><E3ACAD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (<28><><EFBFBD><EFBFBD><EFBFBD><EEADAA><EFBFBD>) <20><> <20><><EFBFBD> Первый операнд лог умножается (конъюнкция) на второй
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */ результат в первый */
/* /*
******************************************************** ********************************************************
4 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ணࠬ<E0AEA3><E0A0AC> <20><> <20><><EFBFBD><E0AEAA><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 4 Напишите программу со строковыми командами
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> MOVS. Команда MOVS.
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>. Команда пересылки строки.
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><E0A5A4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><E7A5AD><EFBFBD><><E4ABA0> DF - 䫠<><E4ABA0> <20><><EFBFBD><EFBFBD><E0A0A2><EFBFBD><EFBFBD><EFBFBD>. Направление пересылки определяется значением флага DF - флага направления.
<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><20> <20><><EFBFBD><EFBFBD> - MOVSB Для операций с байтами - MOVSB
<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><20><><><E1ABAE><EFBFBD><EFBFBD> - MOVSW Для операций со словами - MOVSW
<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><E0A0AD><EFBFBD>. <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><><E4ABA0>. Не имеет операндов. Не воздействует на флаги.
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E3A5AC><><E0A5A3><EFBFBD> SI - sourse Пересылает из области памяти, адресуемой регистром SI - sourse
<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E3A5AC><><E0A5A3><EFBFBD> DI - destination. в область памяти, адресуемую регистром DI - destination.
*/ */
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><EFBFBD><E0A8A2><EFBFBD><EFBFBD> <20><EFBFBD><E0A8AC> <20>ணࠬ<E0AEA3><E0A0AC> // Ниже приведен пример программы
int A[10]={2,1,2,3,4,5,6,7,8,9}; int A[10]={2,1,2,3,4,5,6,7,8,9};
int B[10]={1,1,0,0,0,0,0,0,0,0}; int B[10]={1,1,0,0,0,0,0,0,0,0};
asm { asm {
cld //<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><> <20><><EFBFBD><EFBFBD><E0A0A2><EFBFBD><EFBFBD><EFBFBD> cld //сбрасываем флаг направления
lea si,A lea si,A
lea di,B lea di,B
// mov dx,di // mov dx,di
}; };
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: <20><><EFBFBD><E1AFA5><EFBFBD><E2A0A9> <20><><EFBFBD><EFBFBD><E7A5AD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><><E0A5A3><EFBFBD> // Задание: Распечатайте значения индексных регистров
// <EFBFBD><EFBFBD> <20><><EFBFBD><E0A5A4><EFBFBD> // до передачи
// printf ("\n <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><><E0A5A3><EFBFBD> is, di = %x %x ", _SI, _DI); // printf ("\n значения индекс регистров is, di = %x %x ", _SI, _DI);
asm mov cx,1 ; // ???? asm mov cx,1 ; // ????
asm movsb ; // ????? asm movsb ; // ?????
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: <20><><EFBFBD><E1AFA5><EFBFBD><E2A0A9> <20><><EFBFBD><EFBFBD><E7A5AD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><><E0A5A3><EFBFBD> // Задание: Распечатайте значения индексных регистров
// <EFBFBD><EFBFBD><20><><EFBFBD><E0A5A4><EFBFBD> <20><><EFBFBD><E0A5A4><EFBFBD> <20><><EFBFBD>諠? <20><><EFBFBD><EFBFBD>쪮 ᫮<> <20><><EFBFBD><E0A5A4><EFBFBD>? // после передачи Передача прошла? Сколько слов передано?
printf ("\n <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><><E0A5A3><EFBFBD> is, di = %x %x ", _SI, _DI); printf ("\n значения индекс регистров is, di = %x %x ", _SI, _DI);
printf ("\n <EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20> <20><><20><><EFBFBD><E0AEAA><EFBFBD><EFBFBD> <20><><EFBFBD><E0A5A4><EFBFBD>"); printf ("\n Вывод массива В после строковой передачи");
for (int i=0; i<10; i++) for (int i=0; i<10; i++)
{ {
printf (" \n %d ", B[i]); printf (" \n %d ", B[i]);
} }
getch(); getch();
//******************************************************** //********************************************************
// 5 <EFBFBD>ணࠬ<EFBFBD><EFBFBD> <20><><EFBFBD><20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><><E1A8AC><EFBFBD><EFBFBD> // 5 Программа поиска в видеопамяти символа
printf (" \n <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><><E1A8AC><EFBFBD><EFBFBD> "); printf (" \n Поиск символа ");
/* asm /* asm
asm asm
e1: asm { e1: asm {
mov ax, 0xb800 mov ax, 0xb800
mov es, ax mov es, ax
mov mov
cmp es:[di],al cmp es:[di],al
jnz e2 }; jnz e2 };
printf (" \n <EFBFBD><EFBFBD>諨 ᨬ<><E1A8AC><EFBFBD> "); printf (" \n Нашли символ ");
e2: asm add di, 2 e2: asm add di, 2
asm loop e1 asm loop e1
printf (" \n <EFBFBD><EFBFBD> <20><>諨 ᨬ<><E1A8AC><EFBFBD> "); printf (" \n Не нашли символ ");
getch(); getch();
*/ */
// return (0); // return (0);
//***************** <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ****************** //***************** Задания ******************
// //
// 1 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ணࠬ<E0AEA3><E0A0AC><EFBFBD><EFBFBD><><E3AAA0><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> // 1 Проиллюстрируйте программами указанные выше команды
// 2 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> // 2 Рассмотрите двоичный код этих команд
// 3 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><><E2A0A1><EFBFBD><EFBFBD>, <20><EFBFBD><E1AFAE><EFBFBD><EFBFBD><EFBFBD> TD. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E2A2AE><EFBFBD><EFBFBD> // 3 Заполните таблицу, используя TD. Должны присутствовать
// <EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><E0ACA0> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>. // все поля формата команды.
/* /*
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><E2A1A0> <20><><EFBFBD><EFBFBD><E9A5AD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.<2E><><EFBFBD><EFBFBD> Мнемоника Префикс КОП Постбайт Смещение Непоср.операнд
<EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> │адресации
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ ├────┼─────────────┼──────┼──────┼────────────┼─────────┼─────────────┤
<EFBFBD> 1 <EFBFBD>and ax,bx <EFBFBD> - <EFBFBD> <EFBFBD> <EFBFBD> - <EFBFBD> - <EFBFBD> 1 and ax,bx - - -
<EFBFBD> 2 <EFBFBD>rep and bx,ax<EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> 2 rep and bx,ax
<EFBFBD> 3 <EFBFBD>add ax,16 <EFBFBD> - <EFBFBD> <EFBFBD> <EFBFBD> - <EFBFBD> <EFBFBD> 3 add ax,16 - -
4 add al,[bx+si] 4 add al,[bx+si]
*/ */
// 4. <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ணࠬ<E0AEA3><E0A0AC> <20><> <20><><EFBFBD><E0AEAA><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> 10 <20><><EFBFBD><E0A5A4><EFBFBD><EFBFBD> // 4. Напишите программу со строковыми командами при 10 передачах
// 5. <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>-<2D><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ணࠬ<E0AEA3><E0A0AC> // 5. Разработайте блок-схему и напишите программу
// <EFBFBD><EFBFBD><EFBFBD>᪠ ᨬ<><E1A8AC><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 4-<2D> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E0A0AD><EFBFBD><EFBFBD> // поиска символа в видеопамяти на первых 4-х видеостраницах
// 6. <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><E0A0AD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 00FF. // 6. Ответьте на вопросы: Какая мнемоника двухоперандной команды 00FF.
// <EFBFBD><EFBFBD><EFBFBD> <20><EFBFBD><EBAFAE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> LDS BX,PtriA // Как выполняется команда LDS BX,PtriA
/* /*
<EFBFBD>_<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> i8086  _Структура процессора i8086
<EFBFBD>ணࠬ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><EFBFBD><E0AEA2> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><E0ADA0><EFBFBD><EFBFBD><EFBFBD><><E0A5A3><EFBFBD>- Программисту на уровне команд доступны четырнадцать регист-
஢. <20><><><E3A4AE><EFBFBD><><E0A0A7><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>: 1)<29><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, 2)<EFBFBD><EFBFBD>- ров. Их удобно разбить на четыре группы: 1)Регистры данных, 2)ад-
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, 3)ᥣ<><E1A5A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 4)㪠<><E3AAA0><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><E0A5A3><EFBFBD><EFBFBD><><E4ABA0><EFBFBD><EFBFBD>(<28><EFBFBD><E0A8A7>- ресные, 3)сегментные 4)указатель команд и регистр флажков(призна-
<EFBFBD><EFBFBD><EFBFBD>). ков).
1) <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (<28> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EBA2A0><><E0A5A3><EFBFBD><EFBFBD> <20><><EFBFBD> 1) Регистры данных (в некоторых книгах их называют регистрами общего
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>). <20><><EFBFBD><EFBFBD><E0A0AD> <20> <20><><EFBFBD><EFBFBD><><E0A5A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><><E1ABAE><20> назначения). Операнды в этих регистрах могут быть как слова так и
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>. <20><20><><EFBFBD><EFBFBD> - <20><><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><><E3AAA0><EFBFBD><EFBFBD> <20><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> байты. Если операнд - байт, может быть указана любая половина
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>. <20><><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>㭪樨 <20><EFBFBD><E2A4A5><EFBFBD><EFBFBD><EFBFBD><><E0A5A3><EFBFBD> регистра. Есть ряд команд, в которых функции отдельных регистров
ᯥ樠<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (<28><>.⠡<>.) специализированы (см.табл.)
2) <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><><E0A5A3><EFBFBD><EFBFBD><EFBFBD> (<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><><E0A5A3><EFBFBD><EFBFBD><EFBFBD>, <20><EFBFBD><E1AFAE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> 2) Указатели и индексные регистры (адресные регистры, используются для
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 16-ࠧ<><EFBFBD><EFA4AD> <20><><EFBFBD><EFBFBD>ᮢ). <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><><E0A5A3><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> хранения 16-разрядных адресов). Адресные регистры во многих командах
<EFBFBD><EFBFBD> ᯥ樠<E1AFA5><E6A8A0><EFBFBD><EFBFBD><EFBFBD><E0AEA2><EFBFBD> (<28><>.⠡<>.) также специализированы (см.табл.)
3) <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><><E0A5A3><EFBFBD><EFBFBD><EFBFBD> (㪠<><EFBFBD><EBA2A0> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><><E1A5A3><EFBFBD>⮢ - <20><><EFBFBD><EFBFBD><EFBFBD> 3) Сегментные регистры (указывают начала четырех сегментов - участков
<EFBFBD><EFBFBD> 64 <EFBFBD> <20><><EFBFBD><EFBFBD> <20> 1<> <20><><EFBFBD>: ᥣ<><E1A5A3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> CS, ᥣ<><E1A5A3><EFBFBD><EFBFBD> <20><EFBFBD> SS <20> <20><><EFBFBD> по 64 К байт в 1М ОЗУ: сегмент команд CS, сегмент стека SS и два
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> - DS <EFBFBD> ES extra) сегмента данных - DS и ES extra)
4) <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><E0A5A3><EFBFBD><EFBFBD><><E4ABA0><EFBFBD><EFBFBD> 4) Указатель команд и регистр флажков
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>㭪樨 ॣ<><E0A5A3><EFBFBD> 8086 Специальные функции регистров 8086
AX <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <09><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD>-<2D><EFBFBD><> AX Аккумулятор Умножение, деление и ввод-вывод слов
AL <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(<28><>) <09><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD>-<2D><EFBFBD> <20><><EFBFBD> AL Аккумулятор(мл) Умножение, деление и ввод-вывод байтов
AH <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(<28><>) <09><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> AH Аккумулятор(ст) Умножение и деление байтов
BX <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <09><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><><E0A5A3><EFBFBD><EFBFBD>, <20><EFBFBD><EFBFBD><E0A0A7><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (?) BX База Базовый регистр, преобразование (?)
CX <EFBFBD><EFBFBD><EFBFBD><EFBFBD><09><><EFBFBD><EFBFBD><EFBFBD><20><><EFBFBD><E7AAA0>, 横<><E6A8AA> CX Счетчик Операции с цепочками, циклы
CL <EFBFBD><EFBFBD><EFBFBD><EFBFBD>稪 (<28><>) <09><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><><E1A4A2><EFBFBD> <20> <20><><EFBFBD><EFBFBD> CL Счетчик (мл) Динамические сдвиги и ротации
DX <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <09><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><>, DX Данные Умножение и деление слов,
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>-<2D><EFBFBD> косвенный ввод-вывод
SP <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><EFBFBD> <09><EFBFBD><E2A5AA><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> SP Указатель стека Стековые операции
BP <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <09><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><><E0A5A3><EFBFBD><EFBFBD> BP Указатель базы Базовый регистр
SI <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><E7ADA8> <09><><EFBFBD><EFBFBD><EFBFBD><20><><EFBFBD><E7AAA0>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><><E0A5A3><EFBFBD><EFBFBD> SI Индекс источника Операции с цепочками, индексный регистр
DI <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <09><><EFBFBD><EFBFBD><EFBFBD><20><><EFBFBD><E7AAA0>, DI Индекс получателя Операции с цепочками,
<EFBFBD>_<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><><E4ABA0><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>  _Регистр флагов процессора
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ ├──┼──┼──┼──┼──┼──┼──┼──┼──┼──┼──┼──┼──┼──┼──┼──┤
OF DF IF TF SF ZF AF PF CF OF DF IF TF SF ZF AF PF CF
CF ( Carry Flag ) - <EFBFBD> <20><><EFBFBD><E0A5AD><EFBFBD>; CF ( Carry Flag ) - флаг переноса;
PF ( Parity Flag ) - <EFBFBD> <20><><EFBFBD><E2ADAE><EFBFBD>; PF ( Parity Flag ) - флаг четности;
AF ( Auxiliary Carry Flag ) - <EFBFBD> <20><EFBFBD><E1AFAE><EFBFBD><EFBFBD>⥫쭮<E2A5AB><ECADAE> <20><><EFBFBD><E0A5AD><EFBFBD>; AF ( Auxiliary Carry Flag ) - флаг вспомогательного переноса;
ZF ( Zero Flag ) - <EFBFBD> <20><><EFBFBD><EFBFBD>; ZF ( Zero Flag ) - флаг нуля;
SF ( Sign Flag ) - <EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>; SF ( Sign Flag ) - флаг знака;
TF ( Trap Flag ) - <EFBFBD> <20><><EFBFBD><EFBFBD>; TF ( Trap Flag ) - флаг ловушки;
IF ( Interrupt-Enable Flag ) - <EFBFBD><><E0A0A7><EFBFBD><E8A5AD> <20><><EFBFBD><EFBFBD><EFBFBD><EBA2A0><EFBFBD>; IF ( Interrupt-Enable Flag ) - флаг разрешения прерывания;
DF ( Direction Flag ) - <EFBFBD> <20><><EFBFBD><EFBFBD><E0A0A2><EFBFBD><EFBFBD><EFBFBD>; DF ( Direction Flag ) - флаг направления;
OF ( Overflow Flag ) - <EFBFBD> <20><><EFBFBD><E0A5AF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>. OF ( Overflow Flag ) - флаг переполнения.
- 5 - - 5 -
<EFBFBD>_<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>  _Организация памяти
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (<28><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>⢮) <20><EFBFBD><EFBFBD><E2A0A2><EFBFBD><EFBFBD><><E1AEA1> Адресуемая память (адресное пространство) представляет собой
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> 1<> <20><><EFBFBD><EFBFBD>(<28><><EFBFBD> <><E0A5A6><EFBFBD><><E0A0A1><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><E0AEAF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> область из 1М байт(в реальном режиме работы для микропроцессоров
i80286 <EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>). <20><><EFBFBD><><E1ACA5><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><E0A0A7><EFBFBD><><E1ABAE>. <20><><EFBFBD><EFBFBD>ᮬ ᫮<><E1ABAE> i80286 и старше). Два смежных байта образуют слово. Адресом слова
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>. <EFBFBD><EFBFBD> 8086 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><E0ACA0><EFBFBD> <20><> считается адрес младшего байта. МП 8086 считывает информацию из
<EFBFBD><EFBFBD><EFBFBD> 16 <EFBFBD><EFBFBD><EFBFBD>.᫮<><E1ABAE><EFBFBD><EFBFBD>, <20><><EFBFBD><E7A8AD><EFBFBD><E9A8AC><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ᮢ, <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ОЗУ 16 бит.словами, начинающимися с четных адресов, хотя команда
<EFBFBD><EFBFBD><EFBFBD><><E1ABAE> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><E1AFAE><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD> <20> <20><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>. или слово данных могут быть расположены в ОЗУ в любом адресе.
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> 20 <20><><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD>- Физический адрес памяти имеет длину 20 бит, однако все обра-
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><E0A5A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> 16 <20><><EFBFBD>. <20><><EFBFBD> <20><>- батываемые в регистрах МП величины имеют длину 16 бит. Для форми-
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><><E4A8A7><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><20><EFBFBD><E1AFAE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><E5A0AD><EFBFBD><><E1A5A3><EFBFBD><EFBFBD><EFBFBD><20><><EFBFBD><EFBFBD>- рования физических адресов используется механизм сегментации памя-
<EFBFBD><EFBFBD>. <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 1 <20> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>१ 4 "<22><><EFBFBD><EFBFBD>" ти. Пространство памяти 1 М доступно процессору через 4 "окна"
(<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>) <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><><E0A0A7>஬ 64 <20> <20><><EFBFBD><EFBFBD>. <20><><EFBFBD><E7A0AB><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>- (сегмента) каждый размером 64 К байт. Начальный адрес каждого сег-
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><><EFBFBD><E0A6A8><EFBFBD> <20> <20><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><><E1A5A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><><E0A5A3><EFBFBD>஢. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> мента содержится в оюном из четырех сегментных регистров. Команды
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><20><><E1ABAE><EFBFBD> <20> <20><EFBFBD><E0A5A4><EFBFBD><EFBFBD><><E1A5A3><EFBFBD>⮢, <20><EFBFBD><E1AFAE><EFBFBD><EFBFBD><EFBFBD> <20>- обращаются к байтам и словам в пределах сегментов, используя отно-
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E1A5A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>) <20><><EFBFBD><EFBFBD><EFBFBD>. сительный (внутрисегментный) адрес.
<EFBFBD>_<EFBFBD><EFBFBD><20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><><E1ABA5><EFBFBD>:  _Общий формат команды следующий:
[<EFBFBD><EFBFBD><EFBFBD><EFBFBD>] <20><><EFBFBD> [<5B><><EFBFBD><EFBFBD><E2A1A0> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>樨] [ᬥ饭<E1ACA5><E9A5AD>] [<5B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.<2E><><EFBFBD><EFBFBD>] [Префикс] КОП [постбайт адресации] [смещение] [непоср.операнд]
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><><E1AAAE><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E2A2AE><EFBFBD><EFBFBD>. Элементы в квадратных скобках могут отсутствовать.
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: Назначение элементов команды:
<EFBFBD>_<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.. <20><><EFBFBD><EFBFBD><EFBFBD> 1 <20><><EFBFBD><EFBFBD>.  рефикс .. Длина 1 байт.
<EFBFBD>)<29><><EFBFBD><EFBFBD> <20><><EFBFBD><E0A5AD><EFBFBD><EFBFBD><EFBFBD><E7A5AD><><E1A5A3><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><E0A5AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><><E1A5A3><EFBFBD><EFBFBD> а)Префикс переназначения сегмента позволяет переназначить сегмент
<EFBFBD><EFBFBD><EFBFBD>, <20> <20><><EFBFBD><EFBFBD><EFBFBD> <20><EFBFBD><EFBFBD><E5AEA4> <20><><EFBFBD><EFBFBD><EFBFBD><E9A5AD>.<2E><20><><EFBFBD><EFBFBD> <20><><EFBFBD><E0A5AD><EFBFBD><EFBFBD><EFBFBD><E7A5AD> ОЗУ, к которому происходит обращение.Если префикс переназначения
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, ᥣ<><E1A5A3><EFBFBD><EFBFBD> <20>롨ࠥ<EBA1A8><E0A0A5><EFBFBD> <20><><><EFBFBD><E7A0AD>. сегмента отсутствует, сегмент выбирается по умолчанию.
<EFBFBD>)<29><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E0A5AD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><E0AEAA><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> б)Префикс повторения действия для строковых команд
<EFBFBD>_<EFBFBD><EFBFBD><EFBFBD><EFBFBD>. - <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>樨. <20><><EFBFBD><EFBFBD><EFBFBD> 1 <20><><EFBFBD><EFBFBD>. 0-<2D> <20><><EFBFBD> <20><><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (<28><> <20><> <20><> <20><><EFBFBD><EFBFBD>)  _КОП . - код операции. Длина 1 байт. 0-й бит КОП во многих (но не во всех)
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EBA2A0>, <20><EFBFBD><E0AEA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><><E1ABAE><EFBFBD> ( =1) <EFBFBD><EFBFBD><EFBFBD> <20> командах показывает, производится ли операция со словом ( =1) или с
<EFBFBD><EFBFBD><EFBFBD> ( =0). 1-<EFBFBD> <20><><EFBFBD> <20><><EFBFBD> <20> <20><><EFBFBD><EFBFBD><E5A0A4><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><><EFBFBD><EBA2A0>, <20><><EFBFBD><EFBFBD><EFBFBD> байтом ( =0). 1-й бит КОП в двухадресных командах указывает, какой
<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><E0A0AD><EFBFBD><><EFA2AB><EFBFBD><EFBFBD><EFBFBD> <20><EFBFBD><E0A8A5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>. из операндов является приемником.
<EFBFBD>_<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.. <20><><EFBFBD><EFBFBD><EFBFBD> 1 <20><><EFBFBD><EFBFBD>. <20><><EFBFBD><EFBFBD><E2A1A0> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EBA2A0>, <20><><EFBFBD>  остбайт адресации .. Длина 1 байт. Постбайт адресации показывает, где
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><E0A0AD>. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><20><> 8086 <EFBFBD> находятся операнды. Структура системы адресации МП 8086 в
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><E1A8AC><EFBFBD><EFBFBD><EFBFBD>筠. <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><E0A0AD><EFBFBD> (<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>) <20><><EFBFBD><EFBFBD><EFBFBD> двухоперандной команде несимметрична. Один из операндов (первый) может
<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><E1AFAE><EFBFBD><EFBFBD><EFBFBD> <20><><E0A5A3><EFBFBD><EFBFBD><EFBFBD> (ॣ<><E0A5A3><EFBFBD><EFBFBD><E0AEA2> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>) <20><><EFBFBD> <20> <20><EFBFBD><E0AEA8><EFBFBD><EFBFBD><EFBFBD> быть расположен в регистре (регистровая адресация) или в произвольной
<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> (<28><><EFBFBD> ᯮᮡ<E1AFAE> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><20><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E2A2A5><EFBFBD><EFBFBD>). ячейке ОЗУ (все способы адресации кроме непосредственной).
<EFBFBD><EFBFBD><EFBFBD><20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><E5AEA4><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E2A2A5><EFBFBD><EFBFBD> Второй операнд может находиться в теле команды (непосредственная
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>) <20><><EFBFBD> <20><><E0A5A3><EFBFBD><EFBFBD><EFBFBD> (ॣ<><E0A5A3><EFBFBD><EFBFBD><E0AEA2> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>). <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> адресация) или в регистре (регистровая адресация). Каждый из
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><E7ADA8><EFBFBD><20> <20><EFBFBD><E0A8A5><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (<28><> <20><EFBFBD><EFBFBD><E7A5AD><EFBFBD> операндов может быть как источником так и приемником (за исключением
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>樨: <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E2A2A5><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> непосредственной адресации: непосредственный операнд может быть
⮫쪮 <20><><EFBFBD><EFBFBD><EFBFBD><E7ADA8><EFBFBD>). <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><E2A1A0><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>樨 ᫥<><E1ABA5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: только источником). Структура постбайта адресации следующая:
7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0
! mod ! reg ! r/m ! ! mod ! reg ! r/m !
!-----!-----!-----!-----!-----!-----!-----!----! !-----!-----!-----!-----!-----!-----!-----!----!
<EFBFBD><EFBFBD><EFBFBD><EFBFBD> mod <EFBFBD> r/m <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><E1AFAE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><E0A2AE> <20><><EFBFBD><EFBFBD><E0A0AD> (<28><><EFBFBD> Поля mod и r/m задают место расположения первого операнда (или
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>). <20><><EFBFBD><EFBFBD> reg <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> едиственного в одноадресной команде). Поле reg задает положение
<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><E0A0AD> <20> <20><><EFBFBD><EFBFBD><E5A0A4><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD> <20><EFBFBD><E1AFAE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> второго операнда в двухадресных командах, или используется для
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>. расширения КОП в одноадресных командах.
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> mod: Значения поля mod:
11 - <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><E0A5A3><EFBFBD><EFBFBD><EFBFBD> 11 - операнд в регистре
(<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><E2A0AB><EFBFBD><EFBFBD> mod <20><><EFBFBD><EFBFBD> <20> <20><><EFBFBD>, <20><><E0A5A3><EFBFBD><EFBFBD><EFBFBD>, <20><> (при остальных mod операнд в ОЗУ, а регистры, на
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><><EFBFBD><EBA2A0> <20><><EFBFBD><EFBFBD> mod <EFBFBD> r/m, <EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> которые указывают поля mod и r/m, содержат компоненты
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><E0A0AD>) адреса операнда)
10 - ᬥ饭<EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> (<28><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>) 10 - смещение два байта (без знака)
- 6 - - 6 -
01 - ᬥ饭<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> (<28><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>) 01 - смещение один байт (со знаком)
00 - ᬥ饭<EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 00 - смещение в команде отстутствует
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> reg <20><><E2A0AA> <20><><EFBFBD><EFBFBD> r/m <EFBFBD><EFBFBD><EFBFBD> mod=0 (<EFBFBD>.<2E>. <20><><EFBFBD><><E0A5A3><EFBFBD><EFBFBD><E0AEA2> Значения поля reg а также поля r/m при mod=0 (т.е. при регистровой
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>樨 ᫥<><E1ABA5><EFBFBD>: адресации следующие:
reg <EFBFBD><EFBFBD><EFBFBD> r/m <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> reg или r/m Байт Слово
000 AL AX 000 AL AX
001 CL CX 001 CL CX
010 DL DX 010 DL DX
011 BL BX 011 BL BX
100 AH SP 100 AH SP
101 CH BP 101 CH BP
110 DH SI 110 DH SI
111 BH DI 111 BH DI
<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><E7A5AD> mod <EFBFBD> r/m <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ᯮᮡ При адресации в память значения mod и r/m определяют способ
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><><E1ABA5><EFBFBD><20><><EFBFBD><E0A0A7>: вычисления адреса следующим образом:
r/m mod=00 mod=01 <EFBFBD><EFBFBD><EFBFBD> 10 r/m mod=00 mod=01 или 10
000 BX+SI BX+SI+ᬥ饭<EFBFBD><EFBFBD> 000 BX+SI BX+SI+смещение
001 BX+DI BX+DI+ᬥ饭<EFBFBD><EFBFBD> 001 BX+DI BX+DI+смещение
010 BP+SI BP+DI+ᬥ饭<EFBFBD><EFBFBD> 010 BP+SI BP+DI+смещение
011 BP+DI BP+DI+ᬥ饭<EFBFBD><EFBFBD> 011 BP+DI BP+DI+смещение
100 SI SI+ᬥ饭<EFBFBD><EFBFBD> 100 SI SI+смещение
101 DI DI+ᬥ饭<EFBFBD><EFBFBD> 101 DI DI+смещение
110 direct BP+ᬥ饭<EFBFBD><EFBFBD> 110 direct BP+смещение
111 BX BX+ᬥ饭<EFBFBD><EFBFBD> 111 BX BX+смещение
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>. <20><><EFBFBD><EFBFBD><EFBFBD> 1 <20><><EFBFBD><EFBFBD> (<28><><EFBFBD> mod-01) <20><><EFBFBD> 2 <20><><EFBFBD><EFBFBD><EFBFBD>(<28><><EFBFBD> mod=10). Смещение. Длина 1 байт (при mod-01) или 2 байта(при mod=10).
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>. <20><><EFBFBD><EFBFBD><EFBFBD> 1 <20><><EFBFBD> 2 <20><><EFBFBD><EFBFBD><EFBFBD> Непосредственный операнд. Длина 1 или 2 байта
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><E0A0A7>, <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20> <20><EFBFBD><E0A5A4><EFBFBD><EFBFBD> <20><> 1 <EFBFBD><EFBFBD> 7 <EFBFBD><EFBFBD><EFBFBD>. Таким образом, длина команды лежит в пределах от 1 до 7 байтов.
*/ */
}; };

138
Labv3.cpp
View File

@ -1,69 +1,69 @@
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> LAB3 // Работа LAB3
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ணࠬ<E0AEA3><E0A0AC> // Шаблон программы
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> ᯮᮡ<E1AFAE> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> // Массивы и способы адресации
// <EFBFBD><EFBFBD>४⨢<EFBFBD> <20><EFBFBD><E0A5AF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> // Директивы Препроцессора
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><><E4A0A9><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>-権 // Включение файлов в которых описаны прототипы ф-ций
// <EFBFBD><><E6A5AB><><EFBFBD><E9A5AD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <><E2A8AF> <20>-権 <20> <20><> <20><><EFBFBD><EFBFBD><E3ACA5><EFBFBD><EFBFBD> // с целью сообщения компилятору о типах ф-ций и их аргументах
#include <dos.h> #include <dos.h>
#include <bios.h> #include <bios.h>
#include <stdio.h> #include <stdio.h>
#include <conio.h> #include <conio.h>
// #pragma inline // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><E0AEA5><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><E1A5AC><EFBFBD><EFBFBD><EFBFBD> // #pragma inline // Подключение встроенного Ассемблера
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><E0A5AC><EFBFBD><EFBFBD><EFBFBD> // Объявление переменных
int iB=0x1234; int iB=0x1234;
int A[90]={0,1,2,3,4,5,6,7,8,9}; int A[90]={0,1,2,3,4,5,6,7,8,9};
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ணࠬ<E0AEA3><E0A0AC> - <20><EFBFBD><E3ADAA><EFBFBD> // Основная программа - функция
// void - <EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><E7A5AD> // void - она не возвращ значений
void main(void) void main(void)
{ {
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><E0A5AC><EFBFBD><EFBFBD><EFBFBD> // Объявление переменных
int iA=0x5678; int iA=0x5678;
clrscr(); clrscr();
printf ("\n <EFBFBD>ணࠬ<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> \n"); printf ("\n Программа заполнения массива \n");
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><20><><EFBFBD><20><> <20><EFBFBD><E0AEA2> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> // Заполняем массив на уровне команд Си
for (int i=0; i<10; i++) for (int i=0; i<10; i++)
{ {
// ??????? <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> // ??????? Вставте команды
printf (" \n %d ", A[i]); printf (" \n %d ", A[i]);
} }
getch(); getch();
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><20><><EFBFBD><20><> <20><><EFBFBD><E1A5AC><EFBFBD><EFBFBD><EFBFBD> // Заполняем массив из ассемблера
asm mov si,0 asm mov si,0
e2: e2:
asm { asm {
lea bx,A lea bx,A
mov cx,10 mov cx,10
mov ax,0 mov ax,0
}; };
e1: asm mov [bx],ax // ???? <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ᯮᮡ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> e1: asm mov [bx],ax // ???? Выберите способ адресации
asm add bx,2 asm add bx,2
asm loop e1 asm loop e1
// ??? <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> // ??? Выведите одном массив
asm add si,10 // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><20><><EFBFBD><EFBFBD> asm add si,10 // Задается шаг массива
asm mov ax,100 asm mov ax,100
asm cmp ax,si asm cmp ax,si
asm ja e2 asm ja e2
// ??? <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><E3ACA5><EFBFBD><EFBFBD> <20><><EFBFBD> // ??? Выведите двумерный массив
for (i=0; i<20; i=i+4) for (i=0; i<20; i=i+4)
{ printf (" \n "); { printf (" \n ");
for (int j=0; j<4; j++) for (int j=0; j<4; j++)
{ printf (" "); // ???? <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> { printf (" "); // ???? Вставте команду
} }
} }
getch(); getch();
} }
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> // Задания
// 1. <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20>ணࠬ<E0AEA3><E0A0AC> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E0ADAE> <20><><EFBFBD><EFBFBD> <20><> <20><> <20> <20><><EFBFBD> // 1. Напишите две программы заполнения одномерного массива на Си и Асс
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><20><><EFBFBD><EFBFBD><E7A5AD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><20><><EFBFBD><EFBFBD> // выведите на экран значения элементов массива
// 2. <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><20><><EFBFBD><E3ACA5><EFBFBD><EFBFBD>. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>, // 2. Считайте массив двумерным. Заполните его четные строки любым числом,
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><><E0A0A7><EFBFBD> ᯮᮡ<E1AFAE> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> // используя разные способы адресации
// - <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>-ॣ<><E0A5A3><EFBFBD><EFBFBD><E0AEA2> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> // - косвенно-регистровая адресация
// - <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>-<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> // - базово-индексная адресация
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD> ᯮᮡ<E1AFAE><E1AEA1> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>. // Сравните количество команд при двух способах адресации.
// 3. <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><E1A5A3><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><EFBFBD><EFBFBD>. TD // 3. Определите место массива в сегменте данных с использов. TD
// 4. <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ணࠬ<E0AEA3><E0A0AC>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><><E0A0A7><EFBFBD><><E0A5A7><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><E0A0A7><EFBFBD> // 4. Напишите программу, которая дает разный результат в разных
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>. // моделях памяти.

280
Labv4.cpp
View File

@ -1,141 +1,141 @@
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Lab 4 // Лабораторная Работа Lab 4
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>. <20><><EFBFBD><EFBFBD><EFBFBD><E0A5AD> <20><EFBFBD><E0A5AC><EFBFBD>. <20><><EFBFBD><EFBFBD> // ТАЙМЕР. Измерение времени. Мышь
// //
#include<iostream.h> #include<iostream.h>
#include<conio.h> #include<conio.h>
#include<stdio.h> #include<stdio.h>
void main() void main()
{ {
long int cl2,cl1,c1,c2; long int cl2,cl1,c1,c2;
unsigned long int t1,t2,t3; unsigned long int t1,t2,t3;
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><E2A0AD> <20><><EFBFBD><EFBFBD><EFBFBD> // Изменение константы счетчика
/* asm{ /* asm{
mov ax,00110110B // 00 11 011 0 mov ax,00110110B // 00 11 011 0
out 43h,ax out 43h,ax
mov ax,0000000000000000B mov ax,0000000000000000B
out 40h,al out 40h,al
mov al,ah mov al,ah
out 40h,al out 40h,al
} }
*/ */
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><EFBFBD><E0A5AC><EFBFBD> <20><EFBFBD><EBAFAE><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><E2AEA2> <20>ணࠬ<E0AEA3><E0A0AC> 1 // Измерение времени выполнения тестовой программы 1
// <EFBFBD><><E2A8AA> (<28> <20><><EFBFBD><EFBFBD><EFBFBD><EBA2A0><EFBFBD><EFBFBD> <20><> 0-<2D><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><><E2A0A9><EFBFBD><EFBFBD>) // в тиках (в прерываниях от 0-го канала таймера)
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD>稪 ⨪<><E2A8AA> <20><EFBFBD><E7A5A9> 46<EFBFBD> - <EFBFBD><EFBFBD><EFBFBD><EFBFBD><20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> // Счетчик тиков ячейка 46С - младший байт первый
asm{ asm{
mov ax,0x46 mov ax,0x46
mov es,ax mov es,ax
mov bx,0xC mov bx,0xC
mov ax,[es:bx] mov ax,[es:bx]
mov cx,[es:(bx+2)] mov cx,[es:(bx+2)]
} }
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>砫쭮<E7A0AB> <20><><EFBFBD><EFBFBD><E7A5AD> <20><><EFBFBD><EFBFBD><20> <20><><EFBFBD><EFBFBD> ??? // Запомните начальное значение младшее и старшее ???
// cl2= ; cl1= ; // cl2= ; cl1= ;
c1=cl2+cl1*0x10000; c1=cl2+cl1*0x10000;
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ணࠬ<E0AEA3><E0A0AC> 1 //Тестовая программа 1
asm mov cx,1000 asm mov cx,1000
met1: asm { met1: asm {
push cx push cx
mov cx,1000 mov cx,1000
} }
met2: asm { met2: asm {
loop met2 loop met2
pop cx pop cx
loop met1 loop met1
} }
// //
asm{ asm{
mov ax,0x46 mov ax,0x46
mov es,ax mov es,ax
mov bx,0xC mov bx,0xC
mov ax,[es:bx] mov ax,[es:bx]
mov cx,[es:(bx+2)] mov cx,[es:(bx+2)]
} }
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><E7A5AD> ??? // Запомните конечное значение ???
// cl2=_AX; cl1= ; // cl2=_AX; cl1= ;
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><><E6A5AB> - // Длинное целое -
c2=cl2+cl1*0x10000; c2=cl2+cl1*0x10000;
// clrscr(); // clrscr();
// printf("\n<EFBFBD><EFBFBD><EFBFBD> - %d\n",c1); // printf("\nПервое - %d\n",c1);
// printf("<EFBFBD><EFBFBD><EFBFBD> - %d\n",c2); // printf("Второе - %d\n",c2);
cout<<"\n<EFBFBD><EFBFBD> <20><EFBFBD><EBAFAE><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><E2AEA2> <20>ணࠬ<E0AEA3><E0A0AC> 1\n"; cout<<"\nВремя выполнения тестовой программы 1\n";
cout<<"COUNTs: "<<c2-c1<<"\n"; cout<<"COUNTs: "<<c2-c1<<"\n";
printf("\n <EFBFBD><EFBFBD><EFBFBD><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD>ᥪ㭤 ??"); printf("\n Сколько миллисекунд ??");
getch(); getch();
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><EFBFBD><E0A5AC><EFBFBD> <20><EFBFBD><EBAFAE><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><E2AEA2> <20>ணࠬ<E0AEA3><E0A0AC> // Измерение времени выполнения тестовой программы
// <EFBFBD><EFBFBD><><EFBFBD><E0A6A8><EFBFBD><EFBFBD><><E0A5A3><EFBFBD><EFBFBD><EFBFBD><><E2A0A9><EFBFBD><EFBFBD> // по содержимому регистра таймера
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD> 43h - <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><E0A0A2><EFBFBD><EFBFBD><EFBFBD><><E2A0A9> // Порт 43h - порт управления таймером
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD> 40h - <EFBFBD><EFBFBD><EFBFBD><EFBFBD><><E2A0A9><EFBFBD><EFBFBD> // Порт 40h - порт таймера
asm{ asm{
mov ax,00000110B // 00 00 011 0 mov ax,00000110B // 00 00 011 0
out 43h,ax // <EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>訩, <20><><20><><EFBFBD><EFBFBD> out 43h,ax // Читаем младший, потом старший
in al,40h in al,40h
// mov bl,al // mov bl,al
in al,40h in al,40h
// mov ah,al // mov ah,al
// mov al,bl // mov al,bl
} }
t1=_AX; t1=_AX;
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ணࠬ<E0AEA3><E0A0AC> 2 //Тестовая программа 2
asm mov cx,1 asm mov cx,1
met11: asm { met11: asm {
push cx push cx
mov cx,1000 mov cx,1000
} }
met22: asm { met22: asm {
loop met22 loop met22
pop cx pop cx
loop met11 loop met11
} }
asm{ asm{
mov ax,00000110B // 00 00 011 0 mov ax,00000110B // 00 00 011 0
out 43h,ax // <EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>訩, <20><><20><><EFBFBD><EFBFBD> out 43h,ax // Читаем младший, потом старший
in al,40h in al,40h
// mov bl,al // mov bl,al
in al,40h in al,40h
// mov ah,al // mov ah,al
// mov al,bl // mov al,bl
} }
t2=_AX; t2=_AX;
t3=t1; // ???? t3=t1; // ????
clrscr(); clrscr();
printf("\n<EFBFBD><EFBFBD><EFBFBD> - %d \n",t1); printf("\nПервое - %d \n",t1);
printf("<EFBFBD><EFBFBD><EFBFBD> - %d\n",t2); printf("Второе - %d\n",t2);
cout<<"\n<EFBFBD><EFBFBD> <20><EFBFBD><EBAFAE><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><E2AEA2> <20>ணࠬ<E0AEA3><E0A0AC> 2\n"; cout<<"\nВремя выполнения тестовой программы 2\n";
printf("%x\n",t3); printf("%x\n",t3);
cout<<"CLOCKs: "<<t3<<"\n"; cout<<"CLOCKs: "<<t3<<"\n";
printf("\n <EFBFBD><EFBFBD><EFBFBD><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD>ᥪ㭤 ??"); printf("\n Сколько микросекунд ??");
getch(); getch();
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> // Задания
// 1 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><EFBFBD><E0A5AC><EFBFBD><><E0A0A1><EFBFBD> <20><><EFBFBD><EFBFBD><E2AEA2> <20>ணࠬ<E0AEA3> 1 <EFBFBD> 2 // 1 Определите времена работы тестовых программ 1 и 2
// 2 <EFBFBD><EFBFBD>९ணࠬ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><><E2A0A9><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><EFBFBD><20>ண1 <20><><EFBFBD><EFBFBD><EFBFBD> <20><> // 2 Перепрограммируйте таймер и измерьте время раб прог1 более точно
// 3 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> (<28><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>) // 3 Определите время между двумя нажатиями на кнопку мыши (или клавиатуры)
//<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><E6A5A4><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EBA2A0> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20> <20><EFBFBD><E0A8A7><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> //Эта процедура считывает положение курсора мыши и признак нажатия
//<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E2A0A9> <20><><EFBFBD><EFBFBD><E1A0AD> <20><EFBFBD><E0A0A9><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20> <20>ணࠬ<E0AEA3><E0A0AC> Asmous.cpp. //на клавишу. Прочитайте описание драйвера мыши и программу Asmous.cpp.
void ReadMouse () void ReadMouse ()
{ {
asm mov ax, 0x3 asm mov ax, 0x3
asm int 0x33 asm int 0x33
asm mov MouseB, bx asm mov MouseB, bx
asm mov MouseX, cx asm mov MouseX, cx
asm mov MouseY, dx asm mov MouseY, dx
} }
} }

136
Labv8.cpp
View File

@ -1,68 +1,68 @@
/* Labv8: Ass, and Ci functions /* Labv8: Ass, and Ci functions
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ணࠬ<E0AEA3><E0A0AC> <20><><EFBFBD><><E0A0A1><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E2A5AC> Шаблон программы для работы с видеосистемой
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <><E0A5A6> Текстовый режим
*/ */
#include <dos.h> #include <dos.h>
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <conio.h> #include <conio.h>
#include <iostream.h> #include <iostream.h>
void page(char a) // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><E2A8A2><EFBFBD> <20><><EFBFBD><E1AFAB><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>. void page(char a) // Установка номера активной дисплейной стр.
{ {
asm { asm {
mov ah,0x05 mov ah,0x05
mov al,a mov al,a
int 0x10 int 0x10
} }
} }
void main() void main()
{ {
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E0A5A6><EFBFBD> // установка видеорежима
asm{ asm{
mov al,02h mov al,02h
mov ah,00h mov ah,00h
int 10h int 10h
} page(0); } page(0);
clrscr(); clrscr();
// <EFBFBD><EFBFBD><><E2A5AA><EFBFBD> <20><EFBFBD><EFBFBD><E2A2A0> <20><> // Вывод текста средствами Си
for(char n = 1; n <= 100; n++) for(char n = 1; n <= 100; n++)
// -- <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><20><EFBFBD> - // -- здесь сам вывод -
// <EFBFBD>뮤 ⥪<><E2A5AA><EFBFBD> <20> <><E0A5A6><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E0A5A4><EFBFBD><><E0A0A1><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> // Выод текста в режиме непосредств работы с видеопамятью
page(0); page(0);
asm mov cx,1000 // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>⢮ ᨬ<><E1A8AC><EFBFBD><EFBFBD><EFBFBD> asm mov cx,1000 // Задаем количество символов
asm mov di,0 // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> asm mov di,0 // Обнуляем индекс
e1: asm { add di, 2 e1: asm { add di, 2
mov ax, 0xb800 // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><20><><EFBFBD><E7A0AB><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> mov ax, 0xb800 // Определяем начальный адрес
mov es, ax mov es, ax
mov al, cl mov al, cl
mov es: [di],al // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> mov es: [di],al // Пересылаем четный первый байт в видеопамять
mov al, 4 mov al, 4
mov es: [di+1],al // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><20><><EFBFBD><EFBFBD> mov es: [di+1],al // Пересылаем нечетный второй байт
}; };
asm loop e1 asm loop e1
getch(); getch();
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> // Задания
// 1 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><><E2A5AA> <20> <20><EFBFBD><E1AFAE><EFBFBD> <20><>. // 1 Выведите текст с использ Си.
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 梥⮬ <20> <20><EFBFBD><EFBFBD><ECA7AE><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>. // Раскрасте его зеленым цветом с использованием Асс.
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><EFBFBD> <20><EFBFBD><EBA2AE> <20> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> // Определите время вывода в обоих случаях
// 2 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><><E0A0A7><EFBFBD><><EFBFBD><E2AEA2> <20><><EFBFBD><E1AFAB><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><E0A0AD><EFBFBD>.(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> // 2 Протестируйте размер текстовой дисплейной страницы.(Напишите
// <EFBFBD>ணࠬ<EFBFBD><EFBFBD> <20><> <20><><EFBFBD> <20><EFBFBD><EBA2AE><><E1A8AC><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD> <20> <20> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><E1AFAB><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><E0A0AD><EFBFBD>) // программу на Асс вывода символов в начале и в конце дисплейной страницы)
// 3 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><><E2A5AA> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><E0A0AD><EFBFBD> // 3 Выведите текст на вторую дисп страницу
// 4 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><E0A5AA><EFBFBD><E7A5AD> <20><><EFBFBD><E0A0AD> // 4 Организуйте переключение страниц
/* while (bioskey(1) == 0) /* while (bioskey(1) == 0)
{ {
page(0); delay(1000); page(0); delay(1000);
} */ } */
return; return;
} }

330
MTASK.CPP
View File

@ -1,166 +1,166 @@
#include <stdio.h> #include <stdio.h>
#include <dos.h> #include <dos.h>
#include <mem.h> #include <mem.h>
#include <conio.h> #include <conio.h>
struct ProcStats //struktura soderjashaya kontext zadachi struct ProcStats //struktura soderjashaya kontext zadachi
{ {
unsigned int rax, rbx, rcx, rdx; // 0 2 4 6 unsigned int rax, rbx, rcx, rdx; // 0 2 4 6
unsigned int rsi, rdi, rbp, rsp; // 8 10 12 14 unsigned int rsi, rdi, rbp, rsp; // 8 10 12 14
unsigned int rcs, rds, res, rss; //16 18 20 22 unsigned int rcs, rds, res, rss; //16 18 20 22
unsigned int rip, rflags, a, b; //24 26 28 30 unsigned int rip, rflags, a, b; //24 26 28 30
} Stats[3]; //massiv iz treh takih struktur } Stats[3]; //massiv iz treh takih struktur
unsigned int current_proc; //nomer tekushey zadachi unsigned int current_proc; //nomer tekushey zadachi
unsigned int stats_offset; //adres konteksta zadachi unsigned int stats_offset; //adres konteksta zadachi
void interrupt (*oldHandler)(...); //ukazatel na staryi obrabotchik preryvaniya void interrupt (*oldHandler)(...); //ukazatel na staryi obrabotchik preryvaniya
void interrupt IntHandler(...) //svoy obrabotchik void interrupt IntHandler(...) //svoy obrabotchik
{ {
asm { asm {
mov si, [current_proc]; //nomer procedury mov si, [current_proc]; //nomer procedury
mov cl, 5 //umnojaem nar 32 (razmer struktury) mov cl, 5 //umnojaem nar 32 (razmer struktury)
shl si, cl shl si, cl
//mov ax, offset Stats //mov ax, offset Stats
mov ax, [stats_offset] //pribavlyaem adres nachala massiva struktur mov ax, [stats_offset] //pribavlyaem adres nachala massiva struktur
add si, ax //poluchaem adres nujnogo konteksta add si, ax //poluchaem adres nujnogo konteksta
pop ax //zapisyvaem v nego registry pop ax //zapisyvaem v nego registry
mov [si+12], ax //bp mov [si+12], ax //bp
pop ax pop ax
mov [si+10], ax //di mov [si+10], ax //di
pop ax pop ax
mov [si+ 8], ax //si mov [si+ 8], ax //si
pop ax pop ax
mov [si+18], ax //ds mov [si+18], ax //ds
pop ax pop ax
mov [si+20], ax //es mov [si+20], ax //es
pop ax pop ax
mov [si+ 6], ax //dx mov [si+ 6], ax //dx
pop ax pop ax
mov [si+ 4], ax //cx mov [si+ 4], ax //cx
pop ax pop ax
mov [si+ 2], ax //bx mov [si+ 2], ax //bx
pop ax pop ax
mov [si+ 0], ax //ax mov [si+ 0], ax //ax
pop ax pop ax
mov [si+24], ax //ip mov [si+24], ax //ip
pop ax pop ax
mov [si+16], ax //cs mov [si+16], ax //cs
pop ax pop ax
mov [si+26], ax //flags mov [si+26], ax //flags
mov ax, sp mov ax, sp
mov [si+14], ax //sp mov [si+14], ax //sp
mov ax, ss mov ax, ss
mov [si+22], ax //ss mov [si+22], ax //ss
mov ax, [current_proc] //perehodim k sleduyushey zadache mov ax, [current_proc] //perehodim k sleduyushey zadache
inc ax inc ax
cmp ax, 3 cmp ax, 3
jb label1 jb label1
mov ax, 0 mov ax, 0
} }
label1: label1:
asm { asm {
mov [current_proc], ax //vychislyaem adres eyo konteksta mov [current_proc], ax //vychislyaem adres eyo konteksta
mov si, ax mov si, ax
mov cl, 5 mov cl, 5
shl si, cl shl si, cl
//mov ax, offset Stats //mov ax, offset Stats
mov ax, [stats_offset] mov ax, [stats_offset]
add si, ax //zagrujaem registry add si, ax //zagrujaem registry
mov ax, [si+22] //ss mov ax, [si+22] //ss
mov ss, ax mov ss, ax
mov ax, [si+14] //sp mov ax, [si+14] //sp
mov sp, ax mov sp, ax
mov ax, [si+26] //flags mov ax, [si+26] //flags
push ax push ax
mov ax, [si+16] //cs mov ax, [si+16] //cs
push ax push ax
mov ax, [si+24] //ip mov ax, [si+24] //ip
push ax push ax
mov ax, [si+ 0] //ax mov ax, [si+ 0] //ax
push ax push ax
mov ax, [si+ 2] //bx mov ax, [si+ 2] //bx
push ax push ax
mov ax, [si+ 4] //cx mov ax, [si+ 4] //cx
push ax push ax
mov ax, [si+ 6] //dx mov ax, [si+ 6] //dx
push ax push ax
mov ax, [si+20] //es mov ax, [si+20] //es
push ax push ax
mov ax, [si+18] //ds mov ax, [si+18] //ds
push ax push ax
mov ax, [si+ 8] //si mov ax, [si+ 8] //si
push ax push ax
mov ax, [si+10] //di mov ax, [si+10] //di
push ax push ax
mov ax, [si+12] //bp mov ax, [si+12] //bp
push ax push ax
} }
oldHandler(); //vyzyvaem staryi obrabotchik oldHandler(); //vyzyvaem staryi obrabotchik
} }
void Proc1(void); void Proc1(void);
void Proc2(void); void Proc2(void);
void Proc3(void); void Proc3(void);
int main(void) int main(void)
{ {
unsigned int i, rd, rc, re, rs, ri0, ri1, ri2, f; unsigned int i, rd, rc, re, rs, ri0, ri1, ri2, f;
for(i=0;i<3;i++) for(i=0;i<3;i++)
memset(&Stats[i],0,sizeof(ProcStats)); memset(&Stats[i],0,sizeof(ProcStats));
asm { //zapisyvaem registry vo vremennye peremennye asm { //zapisyvaem registry vo vremennye peremennye
mov ax, cs mov ax, cs
mov [rc], ax mov [rc], ax
mov ax, ds mov ax, ds
mov [rd], ax mov [rd], ax
mov ax, es mov ax, es
mov [re], ax mov [re], ax
mov ax, ss mov ax, ss
mov [rs], ax mov [rs], ax
mov [ri0], offset Proc1 //adresa nachala procedur mov [ri0], offset Proc1 //adresa nachala procedur
mov [ri1], offset Proc2 mov [ri1], offset Proc2
mov [ri2], offset Proc3 mov [ri2], offset Proc3
pushf pushf
pop ax pop ax
mov [f], ax mov [f], ax
} }
for(i=0;i<3;i++) //zapisyvaem znacheniya segmentnyh registrov, for(i=0;i<3;i++) //zapisyvaem znacheniya segmentnyh registrov,
{ //flagov { //flagov
Stats[i].rcs = rc; //i adresa nacha procedur Stats[i].rcs = rc; //i adresa nacha procedur
Stats[i].rds = rd; //v sootvetstvuyushye konteksty Stats[i].rds = rd; //v sootvetstvuyushye konteksty
Stats[i].res = re; Stats[i].res = re;
Stats[i].rss = rs; Stats[i].rss = rs;
Stats[i].rflags = f; Stats[i].rflags = f;
} }
Stats[0].rip = ri0; Stats[0].rip = ri0;
Stats[1].rip = ri1; Stats[1].rip = ri1;
Stats[2].rip = ri2; Stats[2].rip = ri2;
current_proc = 0; //tekushaya procedura - pervaya current_proc = 0; //tekushaya procedura - pervaya
stats_offset = (unsigned)&Stats; //adres nachala massiva stats_offset = (unsigned)&Stats; //adres nachala massiva
oldHandler = getvect(0x9); //perekluchaemsya po najatiyu klavishy oldHandler = getvect(0x9); //perekluchaemsya po najatiyu klavishy
setvect(0x9,IntHandler); setvect(0x9,IntHandler);
Proc1(); Proc1();
setvect(0x9,oldHandler); setvect(0x9,oldHandler);
return 0; return 0;
} }
void Proc1(void) void Proc1(void)
{ {
while(1) while(1)
printf("Proc1 is working %d\n",current_proc); printf("Proc1 is working %d\n",current_proc);
} }
void Proc2(void) void Proc2(void)
{ {
while(1) while(1)
printf("Proc2 is working %d\n",current_proc); printf("Proc2 is working %d\n",current_proc);
} }
void Proc3(void) void Proc3(void)
{ {
while(1) while(1)
printf("Proc3 is working %d\n",current_proc); printf("Proc3 is working %d\n",current_proc);
} }

View File

@ -14,27 +14,27 @@ main:
mov ax,@data mov ax,@data
mov ds,ax mov ds,ax
mov es,0b:8000h mov es,0b:8000h
;------------------<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>------------- ;------------------Открываем файл-------------
mov di,30h mov di,30h
xor cx,cx ;<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> xor cx,cx ;атрибуты файла - обычный файл
mov bx,2 ;<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>-<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> mov bx,2 ;режим доступа обычный - доступ для чтения-записи
mov dx,1 ;<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>. <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> mov dx,1 ;если файл существует, то открыть его. в обратной случае вернуть ошибку
mov dx,offset filename ;<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> mov dx,offset filename ;формируем указатель на имя файла
mov ah,3dh ;<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> DOS mov ah,3dh ;номер функции DOS
int 21h ;<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> int 21h ;открываем файл
mov [Handle], ax ;<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> mov [Handle], ax ;сохраним дескриптор файла
mov bx,ax mov bx,ax
jnc read ;<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> jnc read ;если файл существовал, то переход
jc ex ;<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> jc ex ;переход в случае ошибки
read: mov ah, 3Fh read: mov ah, 3Fh
mov cx,1 mov cx,1
mov dx, buffer mov dx, buffer
int 21h int 21h
cmp ax, cx ; <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> EOF cmp ax, cx ; Проверка EOF
jne eof ; <EFBFBD><EFBFBD><EFBFBD><EFBFBD> EOF, <EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> jne eof ; Если EOF, то выходим
push ax push ax
push bx push bx
@ -45,12 +45,12 @@ read: mov ah, 3Fh
pop ax pop ax
inc di inc di
; cmp [buffer], 13 ; <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 13-<2D><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ; cmp [buffer], 13 ; Пропускаем 13-ый символ
; je read ; je read
; cmp [buffer], 10 ; <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ; cmp [buffer], 10 ; Проверка конца строки
; je exit ; je exit
jmp read jmp read
eof: mov bx, Handle ; <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> eof: mov bx, Handle ; закрываем файл
mov ah, 3Eh mov ah, 3Eh
int 21h int 21h
@ -89,28 +89,28 @@ found2:
mov di,bx mov di,bx
jmp found jmp found
write: ; xor cx,cx ;<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> write: ; xor cx,cx ;атрибуты файла - обычный файл
; mov bx,1 ;<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>-<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ; mov bx,1 ;режим доступа обычный - доступ для чтения-записи
; mov dx,1 ; mov dx,1
; mov dx,offset filename2 ;<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> ; mov dx,offset filename2 ;формируем указатель на имя файла
; mov cx,5 ; mov cx,5
; mov ah,5bh ;<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> DOS ; mov ah,5bh ;номер функции DOS
; int 21h ;<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> ; int 21h ;создаём и открываем файл
; mov [Handle2], ax ;<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> ; mov [Handle2], ax ;сохраним дескриптор файла
; mov bx,ax ; mov bx,ax
xor cx,cx ;<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> xor cx,cx ;атрибуты файла - обычный файл
mov bx,0002h ;<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>-<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> mov bx,0002h ;режим доступа обычный - доступ для чтения-записи
mov dx,1 ;<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>. <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> mov dx,1 ;если файл существует, то открыть его. в обратной случае вернуть ошибку
mov dx,offset filename2 ;<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> mov dx,offset filename2 ;формируем указатель на имя файла
mov al,0001h mov al,0001h
mov ah,3dh ;<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> DOS mov ah,3dh ;номер функции DOS
int 21h ;<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> int 21h ;открываем файл
mov [Handle2], ax ;<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> mov [Handle2], ax ;сохраним дескриптор файла
mov bx,ax mov bx,ax
@ -126,12 +126,12 @@ xor ax,ax
mov ah,0dh mov ah,0dh
int 21h int 21h
cmp ax, cx ; <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> EOF cmp ax, cx ; Проверка EOF
mov bx, Handle2 ; <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> mov bx, Handle2 ; закрываем файл
mov ah, 3Eh mov ah, 3Eh
int 21h int 21h
jc exit ;<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> jc exit ;переход в случае ошибки
exit: exit:
mov ax,4c00h mov ax,4c00h