Практика программирования (Бейсик, Си, Паскаль)



         

Глава 10. - часть 4


AL — день недели (0 — воскресенье, 1 — понедельник, ..., 6 — суббота); DL — день месяца; он — номер месяца; сх — год.

Программа 10_2.с

/*0прос текущей даты через прерывание, функция 33:42*/

#include <dos.h>

#include <stdio.h>

#include <conio.h>

void DatePrint(void);

void main() (

DatePrint(); getch();

}

/ *----------------------------------* /

void DatePrint(void)

{

char *WeekDays[7]={"воскресенье","понедельник",

"вторник","среда","четверг","пятница","суббота"};

union REGS r;

r.h.ah=0x2A;

/*Номер подфункции опроса текущей даты*/

intdos(&r,&r);

/*DL-день, DH-месяц, СХ-год, AL-день недели*/

printf("\n Сегодня %d/%d/%d - %s",r.h.dl,r.h.dh,r.x.ex,

WeekDays[r.h.al]); }

Программа 10_2.pas

program intl; uses Dos;

procedure DatePrint; const

WeekDays:array [0..6] of string=('воскресенье','понедельник1,

'среда','четверг','пятница','суббота'); var

r:Registers;

begin

with r do begin

AH:=$2A; {Номер подфункции опроса текущей даты}

MSDOS(r); {DL-день, DH-месяц, СХ-год, AL-день недели}

write('Сегодня ',DL,':',DH:2,':',СХ,' - ');

writeln(WeekDays[AL]);

end;

end;

begin

DatePrint;

readln;

end.

К сожалению, система программирования QBasic не содержит в своем составе функции, аналогичной вышеописанным. Однако реализовать нечто подобное можно с помощью подпрограммы в машинных кодах, встраиваемой в текст на Бейсике операторами DATA, пересылаемой в оперативную память на место с известным адресом и вызываемой с помощью оператора CALL ABSOLUTE. Одна из таких подпрофамм описана в книге [7] и содержит всего 38 байт. Мы приводим полный текст аналогичного, но более экономного (32 байта), варианта на языке ассемблера для того, чтобы желающие могли расширить область сохраняемых данных и, при необходимости, подменить байт с номером прерывания.

Приведенный ниже текст представляет собой так называемый билистинг, получающийся в результате трансляции исходной программы в язык машинных команд. В левой колонке находятся адреса команд, справа от которых размещаются числовые коды операций и адреса операндов (некоторые машинные команды в явном виде не содержат адреса операндов). В средней колонке команды записаны на языке ассемблера. Каждая строка соответствует отдельной машинной команде или управляющему оператору языка ассемблера. Перед мнемоническим кодом команды может находиться метка, на которую могут ссылаться другие команды (в нашем примере такими метками являются символьные обозначения двухбайтовых слов RegAX, RegBx, RegCx, RegDx, предназначенных для хранения,содержимого машинных регистров). Команды пересылки (код операции mov) перемещают значение второго операнда по первому адресу. Команды записи в стек (коды операции push, pusha) производят пересылку содержимого одного или нескольких машинных регистров в стек. Команды выборки из стека (коды операций pop, рора) осуществляют обратную пересылку из стека значения одного или нескольких регистров. Команда ret возвращает управление вызывающей программе.




Содержание  Назад  Вперед