Вивчення принципів керування програмами в MS_DOS, страница 2

  textcolor(12);

  cprintf("%Fp\n\n\r",p_psp->stack_ptr);

  textcolor(14);

  cprintf("\n\rРодитель: ");

  textcolor(12);

  cprintf("%04X  ",p_psp->father_psp);

  textcolor(0x8b);

  cprintf("\n\n\rНажмите любую клавишу ...\n\r\7");

  getch();

  clrscr();

  textattr(0x0a);

  cprintf("▓▓▓▓▓▒▒▒▒▒░░░░░");

  cprintf("             Лабораторная  работа N11             ");

  cprintf("░░░░░▒▒▒▒▒▓▓▓▓▓");

  cprintf("▓▓▓▓▓▒▒▒▒▒░░░░░");

  cprintf("              Управление программами              ");

  cprintf("░░░░░▒▒▒▒▒▓▓▓▓▓");

  /* Распечатка таблицы файлов */

  s=p_psp->JFT_ptr;

  textcolor(10);

  cprintf("\n\n\rТаблица файлов: ");

  textcolor(12);

  cprintf("%Fp (%d) ",s,p_psp->JFT_size);

  textcolor(11);

  if (s==(byte *)p_psp+0x18)

    cprintf(" -  в этом же PSP");

  cprintf("\n\r");

  for (i=0; ++i<=p_psp->JFT_size; cprintf("%d ",*(s++)));

  textcolor(10);

  cprintf("\n\n\rОкружение DOS: ");

  textcolor(12);

  cprintf("%04X\n\r",p_psp->env_seg);

  s=(char *)MK_FP(p_psp->env_seg,0);

  textcolor(11);

  while(l=strlen(s))

  {

    cprintf("      %s\n\r",s);

    s+=l+1;

  }

  if (dos_ver>2)

  {

    /* для DOS 3.0 и дальше можно получить строку вызова */

    s++;

    l=*((int *)s);

    textcolor(10);

    cprintf("\n\rЧисло строк вызова: ");

    textcolor(12);

    cprintf("%d\n\r",l);

    s+=2;

    textcolor(11);

    for(i=0; i<l; i++)

    {

      cprintf("%s\n\r",s);

      s+=strlen(s)+1;

    }  }

  textattr(0x8b);

  cprintf("\n\n\n\n\rНажмите любую клавишу ...\7");

  textattr(0x07);

  cprintf("\n\r");

  getch();

  clrscr(); }

/* Определение версии DOS */

void get_DOS_version_h(void)

{

  rr.h.ah=0x30;

  intdos(&rr,&rr);

  dos_ver=rr.h.al; }

/* Получение адреса PSP */

void addr_PSP (void)

{

  rr.h.ah=0x62;

  intdos(&rr,&rr);

  pid=rr.x.bx;

}


#include "stdafx.h"

#include <windows.h>

int main(int argc, char* argv[])

{

      STARTUPINFO StartUpInfo;

      PROCESS_INFORMATION ProcessInfo;

      memset(&StartUpInfo,0,sizeof(STARTUPINFO));

      StartUpInfo.cb=sizeof(STARTUPINFO);

      if (CreateProcess(NULL,"c:\\windows\\system32\\calc.exe",NULL,NULL,FALSE,

            NORMAL_PRIORITY_CLASS,NULL,NULL,&StartUpInfo,&ProcessInfo))

            {

            Sleep(15000);

            TerminateProcess(ProcessInfo.hProcess, 0);

            }

      ExitProcess(0);

}

#include <windows.h>

#include <process.h>

unsigned ThreadFunc( void * arg)

{

     char ** str = (char**)arg;

     MessageBox(0,str[0],str[1],0);

     ExitThread( 0 );

     return 0;

}

int main(int argc, char* argv[])

{

     char * InitStr1[2] = {"First thread running!","11111"};// строка для первой нити

     char * InitStr2[2] = {"Second thread running!","22222"};// строка для второй нити

     unsigned long uThreadIDs[2];

     HANDLE hThreads[2];

     hThreads[0] = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)ThreadFunc,

           InitStr1, 0,&uThreadIDs[0]);

     hThreads[1] = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)ThreadFunc,

           InitStr2, 0,&uThreadIDs[1]);

     // Ждем, пока нити не завершат свою работу

     WaitForMultipleObjects(2, hThreads, TRUE, INFINITE );

     // Закрываем дескрипторы

     CloseHandle( hThreads[0] );

     CloseHandle( hThreads[1] );

     return 0;

}


6. Результати роботи програми

 У процесі роботи програми на екран була виведена наступна

інформація:

-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і

-і-і-і-і-і-і-і- Лабораторна робота N11 -і-і-і-і-і-і-і-

-і-і-і-і-і-і-і- Керування програмами -і-і-і-і-і-і-і-

 Адреса PID = 0BA0

Команди:

-і-і-і-і

 Завершення - int 20h: CD 20

 Старий виклик DOS: 9A F0 FE 1D F0

 Новий виклик DOS: CD 21 CB

Адреси:

-і-і-і-

 Кінець пам'яті: 9FC0:0000

 Оброблювач завершення: 0AFA:02B1

 Оброблювач Ctrl+Break: 0AFA:014A

 Оброблювач критич.помилки: 0AFA:0155

 Стік: 0E04:0F94

Батько: 0AFA

Таблиця файлів: 0BA0:0018 (20) - у цьому ж PSP

1 1 1 0 2 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1

Оточення DOS: 0A1E

 CONFIG=STD

 COMSPEC=C:\DOS\COMMAND.COM

 PROMPT=$p$g

 PATH=D:\WIN;C:\;C:\DOS;C:\ARH;C:\NC;C:\BAT;D:\TP;D:\TP7;D:\BC\BIN

 TEMP=d:\~TMP

Число рядків виклику: 1

D:\TC\TC_LAB11.EXE

-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і

7. Висновки:

 У ході даної роботи вивчили принципи керування програмами в MS_DOS і придбали практичні навички роботи із префіксом програмбагато сегмента і його полів.