<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title>Программирование от Turbokherson</title>
		<link>http://programmist-bav.at.ua/</link>
		<description></description>
		<lastBuildDate>Mon, 14 May 2012 06:02:59 GMT</lastBuildDate>
		<generator>uCoz Web-Service</generator>
		<atom:link href="https://programmist-bav.at.ua/news/rss" rel="self" type="application/rss+xml" />
		
		<item>
			<title>Мой Курсовая Работа</title>
			<description>&lt;a href=&quot;https://programmist-bav.at.ua/filesmou/Badus-KR.ada&quot;&gt;/filesmou/Badus-KR.ada&lt;/a&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ADA&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;a href=&quot;https://programmist-bav.at.ua/filesmou/CiKursSasha.txt&quot;&gt;/filesmou/CiKursSasha.txt&lt;/a&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; C#&lt;br&gt;&lt;/div&gt;</description>
			<content:encoded>&lt;a href=&quot;https://programmist-bav.at.ua/filesmou/Badus-KR.ada&quot;&gt;/filesmou/Badus-KR.ada&lt;/a&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ADA&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;a href=&quot;https://programmist-bav.at.ua/filesmou/CiKursSasha.txt&quot;&gt;/filesmou/CiKursSasha.txt&lt;/a&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; C#&lt;br&gt;&lt;/div&gt;</content:encoded>
			<link>https://programmist-bav.at.ua/news/2012-05-14-56</link>
			<dc:creator>Turbokherson</dc:creator>
			<guid>https://programmist-bav.at.ua/news/2012-05-14-56</guid>
			<pubDate>Mon, 14 May 2012 06:02:59 GMT</pubDate>
		</item>
		<item>
			<title>Небольшой DHCP сервер</title>
			<description>&lt;a href=&quot;http://sources.ru/csharp/Small-DHCP-Server.html&quot;&gt;http://sources.ru/csharp/Small-DHCP-Server.html&lt;/a&gt;
&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;p style=&quot;font-family: Arial, Verdana, Tahoma, sans-serif; font-size: 12px; background-color: rgb(255, 255, 255); &quot;&gt;&lt;img src=&quot;http://sources.ru/csharp/Small-DHCP-Server.jpg&quot;&gt;&lt;/p&gt;&lt;p style=&quot;font-family: Arial, Verdana, Tahoma, sans-serif; font-size: 12px; background-color: rgb(255, 255, 255); &quot;&gt;Иногда, нужен исходник простой DHCP-службы, чтобы добавить её функциональность к себе в проект, а не использовать для этого полноценный DHCP сервер. Например, в локальной сети, есть главный сервер DHCP, который выделяет компьютерам IP-адреса, и есть также небольшой сервер DHCP, который выделяет определённый IP-адрес только конкретному устройству. Так как DHCP-протокол работает через UPD, то данные можно посылать широковещательно (а не точка-точка), соответственно и подхватить их в сети можно легко. Для этого мы будем воспольльзуемся простым алгоритмом фильтрации, которы...</description>
			<content:encoded>&lt;a href=&quot;http://sources.ru/csharp/Small-DHCP-Server.html&quot;&gt;http://sources.ru/csharp/Small-DHCP-Server.html&lt;/a&gt;
&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;p style=&quot;font-family: Arial, Verdana, Tahoma, sans-serif; font-size: 12px; background-color: rgb(255, 255, 255); &quot;&gt;&lt;img src=&quot;http://sources.ru/csharp/Small-DHCP-Server.jpg&quot;&gt;&lt;/p&gt;&lt;p style=&quot;font-family: Arial, Verdana, Tahoma, sans-serif; font-size: 12px; background-color: rgb(255, 255, 255); &quot;&gt;Иногда, нужен исходник простой DHCP-службы, чтобы добавить её функциональность к себе в проект, а не использовать для этого полноценный DHCP сервер. Например, в локальной сети, есть главный сервер DHCP, который выделяет компьютерам IP-адреса, и есть также небольшой сервер DHCP, который выделяет определённый IP-адрес только конкретному устройству. Так как DHCP-протокол работает через UPD, то данные можно посылать широковещательно (а не точка-точка), соответственно и подхватить их в сети можно легко. Для этого мы будем воспольльзуемся простым алгоритмом фильтрации, который будет фильтровать запросы и выдавать IP-адреса только разрешенным MAC-адресам.&lt;/p&gt;&lt;h3 style=&quot;color: rgb(102, 102, 102); font-family: Arial, Verdana, Tahoma, sans-serif; background-color: rgb(255, 255, 255); &quot;&gt;Определение DHCP&lt;/h3&gt;&lt;p style=&quot;font-family: Arial, Verdana, Tahoma, sans-serif; font-size: 12px; background-color: rgb(255, 255, 255); &quot;&gt;DHCP расшифровывается как Dynamic Host Configuration Protocol и состоит из двух компонент: клиент DHCP (сетевое устройство запрашивающее IP-настройки), и DHCP-сервер (Интернет-узел, который возвращает параметры конфигурации запросившему клиенту).&lt;/p&gt;&lt;h3 style=&quot;color: rgb(102, 102, 102); font-family: Arial, Verdana, Tahoma, sans-serif; background-color: rgb(255, 255, 255); &quot;&gt;Краткое описание того, как работает небольшой DHCP-сервер&lt;/h3&gt;&lt;p style=&quot;font-family: Arial, Verdana, Tahoma, sans-serif; font-size: 12px; background-color: rgb(255, 255, 255); &quot;&gt;DHCP-сервер обычно устанавливается в локальной сети, и используется для централизованного выделения конфигураций TCP-IP сетевым устройствам или компьютерам с установкой автоматического получения айпишника. DHCP-сервер ожидает запросы на UDP-порте номер 67 и отправляет данные клиентам так же на UDP-порт 67. Служба UDP использует асинхронный метод с использованием функции обратного вызова:&lt;/p&gt;&lt;p style=&quot;font-family: Arial, Verdana, Tahoma, sans-serif; font-size: 12px; background-color: rgb(255, 255, 255); &quot;&gt;&lt;/p&gt;&lt;pre style=&quot;background-color: rgb(238, 238, 238); border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(204, 204, 204); border-right-color: rgb(204, 204, 204); border-bottom-color: rgb(204, 204, 204); border-left-color: rgb(204, 204, 204); border-image: initial; padding-top: 4px; padding-right: 4px; padding-bottom: 4px; padding-left: 4px; width: 800px; overflow-x: auto; overflow-y: auto; font-size: 12px; &quot;&gt;//эта функция запускает слушающий UDP-сервис
 
private void IniListnerCallBack()
{
 try
 {
 // start teh recieve call back method
 s.u.BeginReceive(new AsyncCallback(OnDataRecieved), s);
 }
 catch (Exception ex)
 {
 if (IsListening == true)
 Console.WriteLine(ex.Message);
 }
}
 
// Это коллбэк функция, которая вызывает в момент приёма данных.
// переменная asyn должна содержать экземпляр UPD-структуры (UDPstate)
 
public void OnDataRecieved(IAsyncResult asyn)
{ 
 Byte[] receiveBytes;
 UdpClient u;
 IPEndPoint e;
 
 try
 {
 //получаем udp-пакет клиента
 
 u = (UdpClient)((UdpState)(asyn.AsyncState)).u; 
 //get the endpoint (shall contain refernce about the client)
 
 e = (IPEndPoint)((UdpState)(asyn.AsyncState)).e; 
 //останавливаем коллбэк и получаем количество принятых байт
 
 receiveBytes = u.EndReceive(asyn, ref e);
 //генерируем событие с полученными данными в DHCP-класс
 
 DataRcvd(receiveBytes, e);
 } 
 catch (Exception ex)
 {
 if (IsListening == true)
 Console.WriteLine(ex.Message);
 }
 finally
 {
 u = null;
 e = null;
 receiveBytes = null;
 // Заново запускаем слушающий сервис
 
 IniListnerCallBack();
 } 
}&lt;/pre&gt;&lt;p style=&quot;font-family: Arial, Verdana, Tahoma, sans-serif; font-size: 12px; background-color: rgb(255, 255, 255); &quot;&gt;&lt;/p&gt;&lt;p style=&quot;font-family: Arial, Verdana, Tahoma, sans-serif; font-size: 12px; background-color: rgb(255, 255, 255); &quot;&gt;UDP-клиент должен быть запущен и слушать в сети входящие запросы. Каждое сообщение должно идентифицироваться уникальным МАС-адресом и номером транзакции (Transaction ID (D_xid) - это случайное число, сгенерированное клиентом). При обмене данные передаются как поток байтов и формат должен соответствовать следующей RFC-структуре:&lt;/p&gt;&lt;p style=&quot;font-family: Arial, Verdana, Tahoma, sans-serif; font-size: 12px; background-color: rgb(255, 255, 255); &quot;&gt;&lt;/p&gt;&lt;pre style=&quot;background-color: rgb(238, 238, 238); border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(204, 204, 204); border-right-color: rgb(204, 204, 204); border-bottom-color: rgb(204, 204, 204); border-left-color: rgb(204, 204, 204); border-image: initial; padding-top: 4px; padding-right: 4px; padding-bottom: 4px; padding-left: 4px; width: 800px; overflow-x: auto; overflow-y: auto; font-size: 12px; &quot;&gt;public struct DHCPstruct 
{
 public byte D_op; //Op код: 1 = bootRequest, 2 = BootReply
 
 public byte D_htype; //Тип физического адреса: 1 = 10MB эзернет
 
 public byte D_hlen; //длина физического адреса: длина MACID
 
 public byte D_hops; //физические опции
 
 public byte[] D_xid; //transaction id (5), 
 
 public byte[] D_secs; //elapsed time from trying to boot (3)
 
 public byte[] D_flags; //флаги (3)
 
 public byte[] D_ciaddr; // IP клиента (5)
 
 public byte[] D_yiaddr; // IP вашего клиента (5)
 
 public byte[] D_siaddr; // IP сервера (5)
 
 public byte[] D_giaddr; // relay agent IP (5)
 
 public byte[] D_chaddr; // физический адрес клиента (16)
 
 public byte[] D_sname; // Необязательное имя сервера (64)
 
 public byte[] D_file; // имя бут-файла (128)
 
 public byte[] M_Cookie; // Магические кукисы (4)
 
 public byte[] D_options; //опции (rest)
 
}&lt;/pre&gt;&lt;p style=&quot;font-family: Arial, Verdana, Tahoma, sans-serif; font-size: 12px; background-color: rgb(255, 255, 255); &quot;&gt;&lt;/p&gt;&lt;p style=&quot;font-family: Arial, Verdana, Tahoma, sans-serif; font-size: 12px; background-color: rgb(255, 255, 255); &quot;&gt;Таким образом, данные передаются в DHCP-класс через событие как поток байтов. Для этого воспользуемся .NET-классом BinaryReader, чтобы помещать байты в соответствующем порядке. OPTION_OFFSET - константа, определяющая место, с которого начинаются данные DHCP-структуры:&lt;/p&gt;&lt;p style=&quot;font-family: Arial, Verdana, Tahoma, sans-serif; font-size: 12px; background-color: rgb(255, 255, 255); &quot;&gt;&lt;/p&gt;&lt;pre style=&quot;background-color: rgb(238, 238, 238); border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(204, 204, 204); border-right-color: rgb(204, 204, 204); border-bottom-color: rgb(204, 204, 204); border-left-color: rgb(204, 204, 204); border-image: initial; padding-top: 4px; padding-right: 4px; padding-bottom: 4px; padding-left: 4px; width: 800px; overflow-x: auto; overflow-y: auto; font-size: 12px; &quot;&gt;//pass over a byte as convert it
//using the predefined stream reader function
 
//Data is an array containing the udp data sent.
 
public cDHCPStruct(byte[] Data)
{
 System.IO.BinaryReader rdr;
 System.IO.MemoryStream stm = 
 new System.IO.MemoryStream(Data, 0, Data.Length);
 try
 { //читаем данные
 
 dStruct.D_op = rdr.ReadByte();
 dStruct.D_htype = rdr.ReadByte();
 dStruct.D_hlen = rdr.ReadByte();
 dStruct.D_hops = rdr.ReadByte();
 dStruct.D_xid = rdr.ReadBytes(4);
 dStruct.D_secs = rdr.ReadBytes(2);
 dStruct.D_flags = rdr.ReadBytes(2);
 dStruct.D_ciaddr = rdr.ReadBytes(4);
 dStruct.D_yiaddr = rdr.ReadBytes(4);
 dStruct.D_siaddr = rdr.ReadBytes(4);
 dStruct.D_giaddr = rdr.ReadBytes(4);
 dStruct.D_chaddr = rdr.ReadBytes(16);
 dStruct.D_sname = rdr.ReadBytes(64);
 dStruct.D_file = rdr.ReadBytes(128);
 dStruct.M_Cookie = rdr.ReadBytes(4);
 //читаем остальные данные

 dStruct.D_options = rdr.ReadBytes(Data.Length - OPTION_OFFSET);
 }
 catch(Exception ex) 
 {
 Console.WriteLine (ex.Message);
 }
}&lt;/pre&gt;&lt;p style=&quot;font-family: Arial, Verdana, Tahoma, sans-serif; font-size: 12px; background-color: rgb(255, 255, 255); &quot;&gt;&lt;/p&gt;&lt;p style=&quot;font-family: Arial, Verdana, Tahoma, sans-serif; font-size: 12px; background-color: rgb(255, 255, 255); &quot;&gt;Клиент, запрашивающий адрес IP также должен передать серверу список опций, которые сервер должен заполнить и передать обратно клиенту. Опции, которые можно передать в списке определены в RFC и могут содержать следующие значения:&lt;/p&gt;&lt;p style=&quot;font-family: Arial, Verdana, Tahoma, sans-serif; font-size: 12px; background-color: rgb(255, 255, 255); &quot;&gt;&lt;/p&gt;&lt;pre style=&quot;background-color: rgb(238, 238, 238); border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(204, 204, 204); border-right-color: rgb(204, 204, 204); border-bottom-color: rgb(204, 204, 204); border-left-color: rgb(204, 204, 204); border-image: initial; padding-top: 4px; padding-right: 4px; padding-bottom: 4px; padding-left: 4px; width: 800px; overflow-x: auto; overflow-y: auto; font-size: 12px; &quot;&gt;public enum DHCPOptionEnum 
{
 SubnetMask = 1,
 TimeOffset = 2,
 Router = 3,
 TimeServer = 4,
 NameServer = 5,
 DomainNameServer = 6,
 LogServer = 7,
 CookieServer = 8,
 LPRServer = 9,
 ImpressServer = 10,
 ResourceLocServer = 11,
 HostName = 12,
 BootFileSize = 13,
 MeritDump = 14,
 DomainName = 15,
 SwapServer = 16,
 RootPath = 17,
 ExtensionsPath = 18,
 IpForwarding = 19,
 NonLocalSourceRouting = 20,
 PolicyFilter = 21,
 MaximumDatagramReAssemblySize = 22,
 DefaultIPTimeToLive = 23,
 PathMTUAgingTimeout = 24,
 PathMTUPlateauTable = 25,
 InterfaceMTU = 26,
 AllSubnetsAreLocal = 27,
 BroadcastAddress = 28,
 PerformMaskDiscovery = 29,
 MaskSupplier = 30,
 PerformRouterDiscovery = 31,
 RouterSolicitationAddress = 32,
 StaticRoute = 33,
 TrailerEncapsulation = 34,
 ARPCacheTimeout = 35,
 EthernetEncapsulation = 36,
 TCPDefaultTTL = 37,
 TCPKeepaliveInterval = 38,
 TCPKeepaliveGarbage = 39,
 NetworkInformationServiceDomain = 40,
 NetworkInformationServers = 41,
 NetworkTimeProtocolServers = 42,
 VendorSpecificInformation = 43,
 NetBIOSoverTCPIPNameServer = 44,
 NetBIOSoverTCPIPDatagramDistributionServer = 45,
 NetBIOSoverTCPIPNodeType = 46,
 NetBIOSoverTCPIPScope = 47,
 XWindowSystemFontServer = 48,
 XWindowSystemDisplayManager = 49,
 RequestedIPAddress = 50,
 IPAddressLeaseTime = 51,
 OptionOverload = 52,
 DHCPMessageTYPE = 53,
 ServerIdentifier = 54,
 ParameterRequestList = 55,
 Message = 56,
 MaximumDHCPMessageSize = 57,
 RenewalTimeValue_T1 = 58,
 RebindingTimeValue_T2 = 59,
 Vendorclassidentifier = 60,
 ClientIdentifier = 61,
 NetworkInformationServicePlusDomain = 64,
 NetworkInformationServicePlusServers = 65,
 TFTPServerName = 66,
 BootfileName = 67,
 MobileIPHomeAgent = 68,
 SMTPServer = 69,
 POP3Server = 70,
 NNTPServer = 71,
 DefaultWWWServer = 72,
 DefaultFingerServer = 73,
 DefaultIRCServer = 74,
 StreetTalkServer = 75,
 STDAServer = 76,
 END_Option = 255
}&lt;/pre&gt;&lt;p style=&quot;font-family: Arial, Verdana, Tahoma, sans-serif; font-size: 12px; background-color: rgb(255, 255, 255); &quot;&gt;&lt;/p&gt;&lt;p style=&quot;font-family: Arial, Verdana, Tahoma, sans-serif; font-size: 12px; background-color: rgb(255, 255, 255); &quot;&gt;В массиве байтов список опций будет выглядеть следующим образом:&lt;/p&gt;&lt;p style=&quot;font-family: Arial, Verdana, Tahoma, sans-serif; font-size: 12px; background-color: rgb(255, 255, 255); &quot;&gt;&lt;/p&gt;&lt;pre style=&quot;background-color: rgb(238, 238, 238); border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(204, 204, 204); border-right-color: rgb(204, 204, 204); border-bottom-color: rgb(204, 204, 204); border-left-color: rgb(204, 204, 204); border-image: initial; padding-top: 4px; padding-right: 4px; padding-bottom: 4px; padding-left: 4px; width: 800px; overflow-x: auto; overflow-y: auto; font-size: 12px; &quot;&gt;-------------------------------------------------
|a|len|Message|a|len|Message|........|END_OPTION|
-------------------------------------------------&lt;/pre&gt;&lt;p style=&quot;font-family: Arial, Verdana, Tahoma, sans-serif; font-size: 12px; background-color: rgb(255, 255, 255); &quot;&gt;&lt;/p&gt;&lt;p style=&quot;font-family: Arial, Verdana, Tahoma, sans-serif; font-size: 12px; background-color: rgb(255, 255, 255); &quot;&gt;где:&lt;br&gt;&lt;br&gt;•&quot;а&quot; означает начало кода опции, как показано выше •len - длина сообщения в байтах •Message - передаваемое сообщение, длина которого определена в len •END_OPTION - означает конец сообщения с настройками&lt;/p&gt;&lt;h3 style=&quot;color: rgb(102, 102, 102); font-family: Arial, Verdana, Tahoma, sans-serif; background-color: rgb(255, 255, 255); &quot;&gt;Тип сообщения (message type)&lt;/h3&gt;&lt;span style=&quot;font-family: Arial, Verdana, Tahoma, sans-serif; font-size: 12px; background-color: rgb(255, 255, 255); &quot;&gt;Тип сообщения находится в списке опций под номером 53 и определяет текущее соостояние переговоров клиента и сервера:&lt;/span&gt;&lt;p style=&quot;font-family: Arial, Verdana, Tahoma, sans-serif; font-size: 12px; background-color: rgb(255, 255, 255); &quot;&gt;&lt;/p&gt;&lt;p style=&quot;font-family: Arial, Verdana, Tahoma, sans-serif; font-size: 12px; background-color: rgb(255, 255, 255); &quot;&gt;&lt;/p&gt;&lt;pre style=&quot;background-color: rgb(238, 238, 238); border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(204, 204, 204); border-right-color: rgb(204, 204, 204); border-bottom-color: rgb(204, 204, 204); border-left-color: rgb(204, 204, 204); border-image: initial; padding-top: 4px; padding-right: 4px; padding-bottom: 4px; padding-left: 4px; width: 800px; overflow-x: auto; overflow-y: auto; font-size: 12px; &quot;&gt;public enum DHCPMsgType //Типы сообщений, описанные в RFC
 
{
 DHCPDISCOVER = 1, //клиент пытается найти dhcp-сервера
 
 DHCPOFFER = 2, //сервер предлагает IP-адреса устройству
 
 DHCPREQUEST = 3, //клиент согласен принять айпишник от DHCP-сервера
 
 DHCPDECLINE = 4, //клиент отверг предложенный адрес
 
 DHCPACK = 5, //server to client + committed IP address
 
 DHCPNAK = 6, //server to client to state net address incorrect
 
 DHCPRELEASE = 7, //graceful shutdown from client to Server
 
 DHCPINFORM = 8 //клиент запрашивает локальную информацию
 
}&lt;/pre&gt;&lt;p style=&quot;font-family: Arial, Verdana, Tahoma, sans-serif; font-size: 12px; background-color: rgb(255, 255, 255); &quot;&gt;&lt;/p&gt;&lt;p style=&quot;font-family: Arial, Verdana, Tahoma, sans-serif; font-size: 12px; background-color: rgb(255, 255, 255); &quot;&gt;В коде, это должно быть реализовано как сообщение из DHCP-класса в главную форму:&lt;/p&gt;&lt;p style=&quot;font-family: Arial, Verdana, Tahoma, sans-serif; font-size: 12px; background-color: rgb(255, 255, 255); &quot;&gt;&lt;/p&gt;&lt;pre style=&quot;background-color: rgb(238, 238, 238); border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(204, 204, 204); border-right-color: rgb(204, 204, 204); border-bottom-color: rgb(204, 204, 204); border-left-color: rgb(204, 204, 204); border-image: initial; padding-top: 4px; padding-right: 4px; padding-bottom: 4px; padding-left: 4px; width: 800px; overflow-x: auto; overflow-y: auto; font-size: 12px; &quot;&gt;//an event has to call a delegate (function pointer)
 
#region &quot;event Delegates&quot; 
 public delegate void AnnouncedEventHandler(cDHCPStruct d_DHCP,string MacId);
 public delegate void ReleasedEventHandler();//(cDHCPStruct d_DHCP);
 
 public delegate void RequestEventHandler(cDHCPStruct d_DHCP, string MacId);
 public delegate void AssignedEventHandler(string IPAdd,string MacID );
#endregion
 public event AnnouncedEventHandler Announced;
 public event RequestEventHandler Request;&lt;/pre&gt;&lt;p style=&quot;font-family: Arial, Verdana, Tahoma, sans-serif; font-size: 12px; background-color: rgb(255, 255, 255); &quot;&gt;&lt;/p&gt;&lt;p style=&quot;font-family: Arial, Verdana, Tahoma, sans-serif; font-size: 12px; background-color: rgb(255, 255, 255); &quot;&gt;Перед тем как назначить IP-адресс, необходимо воспользоваться фреймфорковский классом Ping, чтобы проверить, не используется ли уже это айпишник.&lt;/p&gt;&lt;p style=&quot;font-family: Arial, Verdana, Tahoma, sans-serif; font-size: 12px; background-color: rgb(255, 255, 255); &quot;&gt;&lt;/p&gt;&lt;pre style=&quot;background-color: rgb(238, 238, 238); border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(204, 204, 204); border-right-color: rgb(204, 204, 204); border-bottom-color: rgb(204, 204, 204); border-left-color: rgb(204, 204, 204); border-image: initial; padding-top: 4px; padding-right: 4px; padding-bottom: 4px; padding-left: 4px; width: 800px; overflow-x: auto; overflow-y: auto; font-size: 12px; &quot;&gt;public static bool CheckAlive(string IpAdd)
{
 Ping pingSender = new Ping();
 IPAddress address;
 PingReply reply;
 
 try
 {
 address = IPAddress.Parse(IpAdd);//IPAddress.Loopback;
 
 reply = pingSender.Send(address,100);
 if (reply.Status == IPStatus.Success)
 {
 Console.WriteLine(&quot;Address: {0}&quot;, 
 reply.Address.ToString());
 Console.WriteLine(&quot;RoundTrip time: {0}&quot;, 
 reply.RoundtripTime);
 Console.WriteLine(&quot;Time to live: {0}&quot;, 
 reply.Options.Ttl);
 Console.WriteLine(&quot;Don&apos;t fragment: {0}&quot;,
 reply.Options.DontFragment);
 Console.WriteLine(&quot;Buffer size: {0}&quot;, 
 reply.Buffer.Length);
 return true;
 }
 else
 {
 Console.WriteLine(reply.Status);
 return false;
 }
 }
 catch (Exception ex)
 {
 MessageBox.Show(ex.Message);
 return false;
 }
 finally
 {
 if (pingSender != null) pingSender.Dispose();
 pingSender = null;
 address = null;
 reply = null;
 }
}&lt;/pre&gt;&lt;p style=&quot;font-family: Arial, Verdana, Tahoma, sans-serif; font-size: 12px; background-color: rgb(255, 255, 255); &quot;&gt;&lt;/p&gt;&lt;p style=&quot;font-family: Arial, Verdana, Tahoma, sans-serif; font-size: 12px; background-color: rgb(255, 255, 255); &quot;&gt;Затем наше приложение должно конвертировать данные из структуры в поток байтов, используя для этого класс Array:&lt;/p&gt;&lt;p style=&quot;font-family: Arial, Verdana, Tahoma, sans-serif; font-size: 12px; background-color: rgb(255, 255, 255); &quot;&gt;&lt;/p&gt;&lt;pre style=&quot;background-color: rgb(238, 238, 238); border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(204, 204, 204); border-right-color: rgb(204, 204, 204); border-bottom-color: rgb(204, 204, 204); border-left-color: rgb(204, 204, 204); border-image: initial; padding-top: 4px; padding-right: 4px; padding-bottom: 4px; padding-left: 4px; width: 800px; overflow-x: auto; overflow-y: auto; font-size: 12px; &quot;&gt;//функция для преобразования структуры данных в массив байт
 
private byte[] BuildDataStructure(cDHCPStruct.DHCPstruct ddHcpS) 
{ 
 byte[] mArray; 
 try
 { 
 mArray = new byte[0];
 AddOptionElement(new byte[] { ddHcpS.D_op }, ref mArray);
 AddOptionElement(new byte[] { ddHcpS.D_htype }, ref mArray);
 AddOptionElement(new byte[] { ddHcpS.D_hlen }, ref mArray);
 AddOptionElement(new byte[] { ddHcpS.D_hops }, ref mArray);
 AddOptionElement(ddHcpS.D_xid, ref mArray);
 AddOptionElement(ddHcpS.D_secs, ref mArray);
 AddOptionElement(ddHcpS.D_flags, ref mArray);
 AddOptionElement(ddHcpS.D_ciaddr, ref mArray);
 AddOptionElement(ddHcpS.D_yiaddr, ref mArray);
 AddOptionElement(ddHcpS.D_siaddr, ref mArray);
 AddOptionElement(ddHcpS.D_giaddr, ref mArray);
 AddOptionElement(ddHcpS.D_chaddr, ref mArray);
 AddOptionElement(ddHcpS.D_sname, ref mArray);
 AddOptionElement(ddHcpS.D_file, ref mArray);
 AddOptionElement(ddHcpS.M_Cookie, ref mArray);
 AddOptionElement(ddHcpS.D_options, ref mArray);
 return mArray;
 }
 catch (Exception ex)
 {
 MessageBox.Show(ex.Message);
 return false;
 }
 finally 
 {
 marray = null;
 }
}
 
//function to grow an array, we shall pass
//the array back by using references
 
private void AddOptionElement(byte[] FromValue, ref byte[] TargetArray) 
{
 try
 {
 //меняем размер массива соответственно
 
 if (TargetArray != null)
 Array.Resize(ref TargetArray, 
 TargetArray.Length + FromValue.Length );
 else
 Array.Resize(ref TargetArray, FromValue.Length );
 //копируем данные
 
 Array.Copy(FromValue, 0, TargetArray, 
 TargetArray.Length - FromValue.Length,
 FromValue.Length);
 }
 catch (Exception ex)
 {
 Console.WriteLine(ex.Message);
 }
}&lt;/pre&gt;&lt;p style=&quot;font-family: Arial, Verdana, Tahoma, sans-serif; font-size: 12px; background-color: rgb(255, 255, 255); &quot;&gt;&lt;/p&gt;&lt;h3 style=&quot;color: rgb(102, 102, 102); font-family: Arial, Verdana, Tahoma, sans-serif; background-color: rgb(255, 255, 255); &quot;&gt;Заключение&lt;/h3&gt;&lt;p style=&quot;font-family: Arial, Verdana, Tahoma, sans-serif; font-size: 12px; background-color: rgb(255, 255, 255); &quot;&gt;Приведённый в этой статье код делится на три основных класса: асинхронный UDP сервис, конвертор DHCP-структуры и главная форма. Общаются они между собой при помощи событий, однако, можно использовать и обратные вызовы (колбэки). Важно отметить, что при вызове управления из события, события должны быть мультикастовыми и необходимо использовать Invoke.&lt;/p&gt;&lt;p style=&quot;font-family: Arial, Verdana, Tahoma, sans-serif; font-size: 12px; background-color: rgb(255, 255, 255); &quot;&gt;&lt;a href=&quot;http://sources.ru/csharp/smallDHCPServer.zip&quot; style=&quot;color: rgb(4, 65, 166); text-decoration: none; &quot;&gt;Скачать исходник - 167 кб&lt;/a&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;a href=&quot;https://programmist-bav.at.ua/filesmou/smallDHCPServer.zip&quot;&gt;/filesmou/smallDHCPServer.zip&lt;/a&gt;&lt;/p&gt;&lt;p style=&quot;font-family: Arial, Verdana, Tahoma, sans-serif; font-size: 12px; background-color: rgb(255, 255, 255); &quot;&gt;&lt;a href=&quot;http://sources.ru/csharp/ApplicationDHCPserver.zip&quot; style=&quot;color: rgb(4, 65, 166); text-decoration: none; &quot;&gt;Скачать приложение - 85 кб&lt;/a&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;a href=&quot;https://programmist-bav.at.ua/filesmou/ApplicationDHCPserver.zip&quot;&gt;/filesmou/ApplicationDHCPserver.zip&lt;/a&gt;&amp;nbsp;&lt;/p&gt;&lt;br class=&quot;Apple-interchange-newline&quot;&gt;&lt;/div&gt;</content:encoded>
			<link>https://programmist-bav.at.ua/news/2012-05-14-55</link>
			<dc:creator>Turbokherson</dc:creator>
			<guid>https://programmist-bav.at.ua/news/2012-05-14-55</guid>
			<pubDate>Mon, 14 May 2012 05:21:54 GMT</pubDate>
		</item>
		<item>
			<title>Основы работы с Таймером Отображение Даты и Времени в C#</title>
			<description>&lt;p style=&quot;font-family: Arial, Verdana, Tahoma, sans-serif; font-size: 12px; background-color: rgb(255, 255, 255); &quot;&gt;&lt;a href=&quot;http://sources.ru/csharp/Working-with-Timer-Basics.html&quot;&gt;http://sources.ru/csharp/Working-with-Timer-Basics.html&lt;/a&gt;
&lt;/p&gt;&lt;p style=&quot;font-family: Arial, Verdana, Tahoma, sans-serif; font-size: 12px; background-color: rgb(255, 255, 255); &quot;&gt;Давайте, для начала, рассмотрим простой пример программы выводящей текущее время в консоль! :)&lt;/p&gt;&lt;p style=&quot;font-family: Arial, Verdana, Tahoma, sans-serif; font-size: 12px; background-color: rgb(255, 255, 255); &quot;&gt;Листинг 1. timer.cs - Отображение времени.&lt;/p&gt;&lt;p style=&quot;font-family: Arial, Verdana, Tahoma, sans-serif; font-size: 12px; background-color: rgb(255, 255, 255); &quot;&gt;&lt;/p&gt;&lt;pre style=&quot;background-color: rgb(238, 238, 238); border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; bord...</description>
			<content:encoded>&lt;p style=&quot;font-family: Arial, Verdana, Tahoma, sans-serif; font-size: 12px; background-color: rgb(255, 255, 255); &quot;&gt;&lt;a href=&quot;http://sources.ru/csharp/Working-with-Timer-Basics.html&quot;&gt;http://sources.ru/csharp/Working-with-Timer-Basics.html&lt;/a&gt;
&lt;/p&gt;&lt;p style=&quot;font-family: Arial, Verdana, Tahoma, sans-serif; font-size: 12px; background-color: rgb(255, 255, 255); &quot;&gt;Давайте, для начала, рассмотрим простой пример программы выводящей текущее время в консоль! :)&lt;/p&gt;&lt;p style=&quot;font-family: Arial, Verdana, Tahoma, sans-serif; font-size: 12px; background-color: rgb(255, 255, 255); &quot;&gt;Листинг 1. timer.cs - Отображение времени.&lt;/p&gt;&lt;p style=&quot;font-family: Arial, Verdana, Tahoma, sans-serif; font-size: 12px; background-color: rgb(255, 255, 255); &quot;&gt;&lt;/p&gt;&lt;pre style=&quot;background-color: rgb(238, 238, 238); border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(204, 204, 204); border-right-color: rgb(204, 204, 204); border-bottom-color: rgb(204, 204, 204); border-left-color: rgb(204, 204, 204); border-image: initial; padding-top: 4px; padding-right: 4px; padding-bottom: 4px; padding-left: 4px; width: 800px; overflow-x: auto; overflow-y: auto; font-size: 12px; &quot;&gt; 1: // Timer01.cs - Отображение Даты и Времени
 2: // 
 3: // Для завершения программы нажмите Ctrl+C.
 4: //------------------------------------------
 5: using System;
 6: 
 7: class myApp 
 8: {
 9: public static void Main()
10: {
11: while (true)
12: {
13: Console.Write(&quot;&amp;#92;r{0}&quot;, DateTime.Now);
14: }
15: }
16: }&lt;/pre&gt;&lt;p style=&quot;font-family: Arial, Verdana, Tahoma, sans-serif; font-size: 12px; background-color: rgb(255, 255, 255); &quot;&gt;&lt;/p&gt;&lt;p style=&quot;font-family: Arial, Verdana, Tahoma, sans-serif; font-size: 12px; background-color: rgb(255, 255, 255); &quot;&gt;*** Результат ***&lt;/p&gt;&lt;p style=&quot;font-family: Arial, Verdana, Tahoma, sans-serif; font-size: 12px; background-color: rgb(255, 255, 255); &quot;&gt;5/26/2003 9:34:19 PM&lt;/p&gt;&lt;p style=&quot;font-family: Arial, Verdana, Tahoma, sans-serif; font-size: 12px; background-color: rgb(255, 255, 255); &quot;&gt;*** Анализ ***&lt;/p&gt;&lt;p style=&quot;font-family: Arial, Verdana, Tahoma, sans-serif; font-size: 12px; background-color: rgb(255, 255, 255); &quot;&gt;Этот пример выводит бесконечное число раз текущую дату и время. Прервать выполнение кода можно нажатием Ctrl+C. Текущую дату и время можно получить при помощи метода Now() класса DateTime (объявленный в пространстве имён System), который вызывается в 13 строке.&lt;/p&gt;&lt;p style=&quot;font-family: Arial, Verdana, Tahoma, sans-serif; font-size: 12px; background-color: rgb(255, 255, 255); &quot;&gt;Теперь рассмотрим способ отображения времени с помощью таймера. Таймер позволяет через определённый промежуток времени передать управление другой процедуре. Во фреймворке таймер объявлен в пространстве имён System.Timers. Этот класс обычно и называют таймером. Давайте изменим первый пример следующим образом:&lt;/p&gt;&lt;p style=&quot;font-family: Arial, Verdana, Tahoma, sans-serif; font-size: 12px; background-color: rgb(255, 255, 255); &quot;&gt;Листинг 2. Timer02.cs - Использование таймера с DateTime.&lt;/p&gt;&lt;p style=&quot;font-family: Arial, Verdana, Tahoma, sans-serif; font-size: 12px; background-color: rgb(255, 255, 255); &quot;&gt;&lt;/p&gt;&lt;pre style=&quot;background-color: rgb(238, 238, 238); border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(204, 204, 204); border-right-color: rgb(204, 204, 204); border-bottom-color: rgb(204, 204, 204); border-left-color: rgb(204, 204, 204); border-image: initial; padding-top: 4px; padding-right: 4px; padding-bottom: 4px; padding-left: 4px; width: 800px; overflow-x: auto; overflow-y: auto; font-size: 12px; &quot;&gt; 1: // Timer02.cs - Отображение Даты и Времени
 2: // С использованием класса Timer. 
 3: // Для завершения программы нажмите Ctrl+C. 
 4: //------------------------------------------
 5: using System;
 6: using System.Timers;
 7: 
 8: class myApp
 9: {
10: public static void Main()
11: {
12: Timer myTimer = new Timer();
13: myTimer.Elapsed += new ElapsedEventHandler( DisplayTimeEvent );
14: myTimer.Interval = 1000;
15: myTimer.Start();
16: 
17: while ( Console.Read() != &apos;q&apos; )
18: {
19: ; // do nothing...
20: }
21: }
22:
23: public static void DisplayTimeEvent( object source, ElapsedEventArgs e )
24: {
25: Console.Write(&quot;&amp;#92;r{0}&quot;, DateTime.Now);
26: }
27: }
&lt;/pre&gt;&lt;p style=&quot;font-family: Arial, Verdana, Tahoma, sans-serif; font-size: 12px; background-color: rgb(255, 255, 255); &quot;&gt;&lt;/p&gt;&lt;p style=&quot;font-family: Arial, Verdana, Tahoma, sans-serif; font-size: 12px; background-color: rgb(255, 255, 255); &quot;&gt;*** Результат ***&lt;/p&gt;&lt;p style=&quot;font-family: Arial, Verdana, Tahoma, sans-serif; font-size: 12px; background-color: rgb(255, 255, 255); &quot;&gt;5/26/2003 10:04:13 PM&lt;/p&gt;&lt;p style=&quot;font-family: Arial, Verdana, Tahoma, sans-serif; font-size: 12px; background-color: rgb(255, 255, 255); &quot;&gt;*** Анализ ***&lt;/p&gt;&lt;p style=&quot;font-family: Arial, Verdana, Tahoma, sans-serif; font-size: 12px; background-color: rgb(255, 255, 255); &quot;&gt;Результат получился таким же, однако, вместо непрерывного обновления, дата и время обновляются каждые 1000 тиков, что эквивалентно одной секунде.&lt;/p&gt;&lt;p style=&quot;font-family: Arial, Verdana, Tahoma, sans-serif; font-size: 12px; background-color: rgb(255, 255, 255); &quot;&gt;Теперь по-порядку: в 12-ой строке содаётся новый экземпляр таймера; в строке 14 задаётся интервал, через который будет срабатывать таймер; в 13ой строке указывается название функции, которой будет передано управление при срабатывании таймера (в данном случае это DisplayTimeEvent, который содержится в строках с 23 по 26). В классе Timer есть свойство AutoReset, которое по умолчанию имеет значение true. Если это значение поменять на false, то таймер будет срабатывать только один раз. Если свойство AutoReset не менять, то таймер будет срабатывать каждый раз по истечению заданного интервала. В строках с 17 по 20 содержится цикл, который повторяется, пока не будет нажата клавиша &apos;q&apos;, а затем Enter.&lt;/p&gt;&lt;p style=&quot;font-family: Arial, Verdana, Tahoma, sans-serif; font-size: 12px; background-color: rgb(255, 255, 255); &quot;&gt;&lt;a href=&quot;http://sources.ru/csharp/Timer02.zip&quot; style=&quot;color: rgb(4, 65, 166); text-decoration: none; &quot;&gt;Скачать исходник - 1 кб&lt;/a&gt;&lt;/p&gt;&lt;br class=&quot;Apple-interchange-newline&quot;&gt;</content:encoded>
			<link>https://programmist-bav.at.ua/news/2012-05-14-52</link>
			<dc:creator>Turbokherson</dc:creator>
			<guid>https://programmist-bav.at.ua/news/2012-05-14-52</guid>
			<pubDate>Mon, 14 May 2012 05:19:07 GMT</pubDate>
		</item>
		<item>
			<title>Программы на ассемблере (под x86) для ДОС</title>
			<description>&lt;a href=&quot;http://azzaqua.narod.ru/asm.htm&quot;&gt;http://azzaqua.narod.ru/asm.htm&lt;/a&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;font color=&quot;#DAAAAA&quot; style=&quot;font-family: &apos;Times New Roman&apos;; text-align: justify; background-color: rgb(97, 67, 73); font-size: medium; &quot;&gt;Заметьте, что большую часть текстов программ вы спокойно можете копировать в буфер обмена, а затем в отдельный файл и компилировать. Но такая операция может быть проделана не со всеми файлами, некоторые из них содержат специальные символы, и для корректной компиляции вам потребуется взять текст программы из&amp;nbsp;&lt;a href=&quot;http://azzaqua.narod.ru/Arch/ASMPRGS.RAR&quot;&gt;архива {15 Kb}&lt;/a&gt;. Все, кому необходимы комментарии к текстам программ, пишите на мыло.&lt;/font&gt;&lt;hr style=&quot;color: rgb(159, 159, 159); font-family: &apos;Times New Roman&apos;; text-align: justify; background-color: rgb(97, 67, 73); font-size: medium; &quot;&gt;&lt;a href=&quot;http://azzaqua.narod.ru/pascal.htm&quot; style=&quot;font-family: &apos;Times New Roman&apos;; text-align: justify; background-color: rgb(97, 67, 73); font-size: medium;...</description>
			<content:encoded>&lt;a href=&quot;http://azzaqua.narod.ru/asm.htm&quot;&gt;http://azzaqua.narod.ru/asm.htm&lt;/a&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;font color=&quot;#DAAAAA&quot; style=&quot;font-family: &apos;Times New Roman&apos;; text-align: justify; background-color: rgb(97, 67, 73); font-size: medium; &quot;&gt;Заметьте, что большую часть текстов программ вы спокойно можете копировать в буфер обмена, а затем в отдельный файл и компилировать. Но такая операция может быть проделана не со всеми файлами, некоторые из них содержат специальные символы, и для корректной компиляции вам потребуется взять текст программы из&amp;nbsp;&lt;a href=&quot;http://azzaqua.narod.ru/Arch/ASMPRGS.RAR&quot;&gt;архива {15 Kb}&lt;/a&gt;. Все, кому необходимы комментарии к текстам программ, пишите на мыло.&lt;/font&gt;&lt;hr style=&quot;color: rgb(159, 159, 159); font-family: &apos;Times New Roman&apos;; text-align: justify; background-color: rgb(97, 67, 73); font-size: medium; &quot;&gt;&lt;a href=&quot;http://azzaqua.narod.ru/pascal.htm&quot; style=&quot;font-family: &apos;Times New Roman&apos;; text-align: justify; background-color: rgb(97, 67, 73); font-size: medium; &quot;&gt;Тексты программ на Паскале (BP 7.0 for DOS)&lt;/a&gt;&lt;hr style=&quot;color: rgb(159, 159, 159); font-family: &apos;Times New Roman&apos;; text-align: justify; background-color: rgb(97, 67, 73); font-size: medium; &quot;&gt;&lt;a href=&quot;http://azzaqua.narod.ru/asm/CURFNTSV.HTM&quot; style=&quot;font-family: &apos;Times New Roman&apos;; text-align: justify; background-color: rgb(97, 67, 73); font-size: medium; &quot;&gt;&lt;font color=&quot;#DADADA&quot;&gt;cusfntsv.asm&lt;/font&gt;&lt;/a&gt;&lt;span style=&quot;color: rgb(159, 159, 159); font-family: &apos;Times New Roman&apos;; text-align: justify; background-color: rgb(97, 67, 73); font-size: medium; &quot;&gt;&amp;nbsp;- Сохраняет текущий шрифт в файле.&amp;nbsp;&lt;/span&gt;&lt;br style=&quot;color: rgb(159, 159, 159); font-family: &apos;Times New Roman&apos;; text-align: justify; background-color: rgb(97, 67, 73); font-size: medium; &quot;&gt;&lt;a href=&quot;http://azzaqua.narod.ru/asm/fadeout.htm&quot; style=&quot;font-family: &apos;Times New Roman&apos;; text-align: justify; background-color: rgb(97, 67, 73); font-size: medium; &quot;&gt;&lt;font color=&quot;#DADADA&quot;&gt;fadeout.asm&lt;/font&gt;&lt;/a&gt;&lt;span style=&quot;color: rgb(159, 159, 159); font-family: &apos;Times New Roman&apos;; text-align: justify; background-color: rgb(97, 67, 73); font-size: medium; &quot;&gt;&amp;nbsp;- Выполнфет плавное гашение экрана.&amp;nbsp;&lt;/span&gt;&lt;br style=&quot;color: rgb(159, 159, 159); font-family: &apos;Times New Roman&apos;; text-align: justify; background-color: rgb(97, 67, 73); font-size: medium; &quot;&gt;&lt;a href=&quot;http://azzaqua.narod.ru/asm/FCHS.HTM&quot; style=&quot;font-family: &apos;Times New Roman&apos;; text-align: justify; background-color: rgb(97, 67, 73); font-size: medium; &quot;&gt;&lt;font color=&quot;#DADADA&quot;&gt;fchs.asm&lt;/font&gt;&lt;/a&gt;&lt;span style=&quot;color: rgb(159, 159, 159); font-family: &apos;Times New Roman&apos;; text-align: justify; background-color: rgb(97, 67, 73); font-size: medium; &quot;&gt;&amp;nbsp;- Заменяет в файле строку на строку из такого же количества символов.&amp;nbsp;&lt;/span&gt;&lt;br style=&quot;color: rgb(159, 159, 159); font-family: &apos;Times New Roman&apos;; text-align: justify; background-color: rgb(97, 67, 73); font-size: medium; &quot;&gt;&lt;a href=&quot;http://azzaqua.narod.ru/asm/FUNKEYB.HTM&quot; style=&quot;font-family: &apos;Times New Roman&apos;; text-align: justify; background-color: rgb(97, 67, 73); font-size: medium; &quot;&gt;&lt;font color=&quot;#DADADA&quot;&gt;funkeyb.asm&lt;/font&gt;&lt;/a&gt;&lt;span style=&quot;color: rgb(159, 159, 159); font-family: &apos;Times New Roman&apos;; text-align: justify; background-color: rgb(97, 67, 73); font-size: medium; &quot;&gt;&amp;nbsp;- Устанавливает обработчик прерывания клавиатуры вместо прерывания системного таймера.&amp;nbsp;&lt;/span&gt;&lt;br style=&quot;color: rgb(159, 159, 159); font-family: &apos;Times New Roman&apos;; text-align: justify; background-color: rgb(97, 67, 73); font-size: medium; &quot;&gt;&lt;a href=&quot;http://azzaqua.narod.ru/asm/LIFEBIOS.HTM&quot; style=&quot;font-family: &apos;Times New Roman&apos;; text-align: justify; background-color: rgb(97, 67, 73); font-size: medium; &quot;&gt;&lt;font color=&quot;#DADADA&quot;&gt;lifebios.asm&lt;/font&gt;&lt;/a&gt;&lt;span style=&quot;color: rgb(159, 159, 159); font-family: &apos;Times New Roman&apos;; text-align: justify; background-color: rgb(97, 67, 73); font-size: medium; &quot;&gt;&amp;nbsp;- &quot;Игра&quot; &quot;Жизнь&quot;.&amp;nbsp;&lt;/span&gt;&lt;br style=&quot;color: rgb(159, 159, 159); font-family: &apos;Times New Roman&apos;; text-align: justify; background-color: rgb(97, 67, 73); font-size: medium; &quot;&gt;&lt;a href=&quot;http://azzaqua.narod.ru/asm/liss.htm&quot; style=&quot;font-family: &apos;Times New Roman&apos;; text-align: justify; background-color: rgb(97, 67, 73); font-size: medium; &quot;&gt;&lt;font color=&quot;#DADADA&quot;&gt;liss.asm&lt;/font&gt;&lt;/a&gt;&lt;span style=&quot;color: rgb(159, 159, 159); font-family: &apos;Times New Roman&apos;; text-align: justify; background-color: rgb(97, 67, 73); font-size: medium; &quot;&gt;&amp;nbsp;- Рисует фигуры Лиссажу.&amp;nbsp;&lt;/span&gt;&lt;br style=&quot;color: rgb(159, 159, 159); font-family: &apos;Times New Roman&apos;; text-align: justify; background-color: rgb(97, 67, 73); font-size: medium; &quot;&gt;&lt;a href=&quot;http://azzaqua.narod.ru/asm/MOUSEDR.HTM&quot; style=&quot;font-family: &apos;Times New Roman&apos;; text-align: justify; background-color: rgb(97, 67, 73); font-size: medium; &quot;&gt;&lt;font color=&quot;#DADADA&quot;&gt;mousedr.asm&lt;/font&gt;&lt;/a&gt;&lt;span style=&quot;color: rgb(159, 159, 159); font-family: &apos;Times New Roman&apos;; text-align: justify; background-color: rgb(97, 67, 73); font-size: medium; &quot;&gt;&amp;nbsp;- Простейшая программа, рисует линии на экране с помощью мыши.&amp;nbsp;&lt;/span&gt;&lt;br style=&quot;color: rgb(159, 159, 159); font-family: &apos;Times New Roman&apos;; text-align: justify; background-color: rgb(97, 67, 73); font-size: medium; &quot;&gt;&lt;a href=&quot;http://azzaqua.narod.ru/asm/MUSUNIT.HTM&quot; style=&quot;font-family: &apos;Times New Roman&apos;; text-align: justify; background-color: rgb(97, 67, 73); font-size: medium; &quot;&gt;&lt;font color=&quot;#DADADA&quot;&gt;musunit.asm&lt;/font&gt;&lt;/a&gt;&lt;span style=&quot;color: rgb(159, 159, 159); font-family: &apos;Times New Roman&apos;; text-align: justify; background-color: rgb(97, 67, 73); font-size: medium; &quot;&gt;&amp;nbsp;- Модуль к программе mymusic.exe. Необходим для создания программок, проигрывающих музыку. Не работает без включения в состав программы.&amp;nbsp;&lt;/span&gt;&lt;br style=&quot;color: rgb(159, 159, 159); font-family: &apos;Times New Roman&apos;; text-align: justify; background-color: rgb(97, 67, 73); font-size: medium; &quot;&gt;&lt;a href=&quot;http://azzaqua.narod.ru/asm/MUSUNITA.HTM&quot; style=&quot;font-family: &apos;Times New Roman&apos;; text-align: justify; background-color: rgb(97, 67, 73); font-size: medium; &quot;&gt;&lt;font color=&quot;#DADADA&quot;&gt;musunit_.asm&lt;/font&gt;&lt;/a&gt;&lt;span style=&quot;color: rgb(159, 159, 159); font-family: &apos;Times New Roman&apos;; text-align: justify; background-color: rgb(97, 67, 73); font-size: medium; &quot;&gt;&amp;nbsp;- Одна из вариаций модуля.&amp;nbsp;&lt;/span&gt;&lt;br style=&quot;color: rgb(159, 159, 159); font-family: &apos;Times New Roman&apos;; text-align: justify; background-color: rgb(97, 67, 73); font-size: medium; &quot;&gt;&lt;a href=&quot;http://azzaqua.narod.ru/asm/MUSUNT.HTM&quot; style=&quot;font-family: &apos;Times New Roman&apos;; text-align: justify; background-color: rgb(97, 67, 73); font-size: medium; &quot;&gt;&lt;font color=&quot;#DADADA&quot;&gt;musunt.asm&lt;/font&gt;&lt;/a&gt;&lt;span style=&quot;color: rgb(159, 159, 159); font-family: &apos;Times New Roman&apos;; text-align: justify; background-color: rgb(97, 67, 73); font-size: medium; &quot;&gt;&amp;nbsp;- Ещё одна версия модуля.&amp;nbsp;&lt;/span&gt;&lt;br style=&quot;color: rgb(159, 159, 159); font-family: &apos;Times New Roman&apos;; text-align: justify; background-color: rgb(97, 67, 73); font-size: medium; &quot;&gt;&lt;a href=&quot;http://azzaqua.narod.ru/asm/PENTA.HTM&quot; style=&quot;font-family: &apos;Times New Roman&apos;; text-align: justify; background-color: rgb(97, 67, 73); font-size: medium; &quot;&gt;&lt;font color=&quot;#DADADA&quot;&gt;penta.asm&lt;/font&gt;&lt;/a&gt;&lt;span style=&quot;color: rgb(159, 159, 159); font-family: &apos;Times New Roman&apos;; text-align: justify; background-color: rgb(97, 67, 73); font-size: medium; &quot;&gt;&amp;nbsp;- Изображает пентамино F, которое можно перемещать по экрану и вращать.&amp;nbsp;&lt;/span&gt;&lt;br style=&quot;color: rgb(159, 159, 159); font-family: &apos;Times New Roman&apos;; text-align: justify; background-color: rgb(97, 67, 73); font-size: medium; &quot;&gt;&lt;a href=&quot;http://azzaqua.narod.ru/asm/pm0.htm&quot; style=&quot;font-family: &apos;Times New Roman&apos;; text-align: justify; background-color: rgb(97, 67, 73); font-size: medium; &quot;&gt;&lt;font color=&quot;#DADADA&quot;&gt;pm0.asm&lt;/font&gt;&lt;/a&gt;&lt;span style=&quot;color: rgb(159, 159, 159); font-family: &apos;Times New Roman&apos;; text-align: justify; background-color: rgb(97, 67, 73); font-size: medium; &quot;&gt;&amp;nbsp;- Переключает процессор в режим PM.&amp;nbsp;&lt;/span&gt;&lt;br style=&quot;color: rgb(159, 159, 159); font-family: &apos;Times New Roman&apos;; text-align: justify; background-color: rgb(97, 67, 73); font-size: medium; &quot;&gt;&lt;a href=&quot;http://azzaqua.narod.ru/asm/PYTHONCA.HTM&quot; style=&quot;font-family: &apos;Times New Roman&apos;; text-align: justify; background-color: rgb(97, 67, 73); font-size: medium; &quot;&gt;&lt;font color=&quot;#DADADA&quot;&gt;pythonica.asm&lt;/font&gt;&lt;/a&gt;&lt;span style=&quot;color: rgb(159, 159, 159); font-family: &apos;Times New Roman&apos;; text-align: justify; background-color: rgb(97, 67, 73); font-size: medium; &quot;&gt;&amp;nbsp;- В текстовом режиме передвигает символы в строках, наподобие движения &quot;змейкой&quot;.&amp;nbsp;&lt;/span&gt;&lt;br style=&quot;color: rgb(159, 159, 159); font-family: &apos;Times New Roman&apos;; text-align: justify; background-color: rgb(97, 67, 73); font-size: medium; &quot;&gt;&lt;a href=&quot;http://azzaqua.narod.ru/asm/rotoria.htm&quot; style=&quot;font-family: &apos;Times New Roman&apos;; text-align: justify; background-color: rgb(97, 67, 73); font-size: medium; &quot;&gt;&lt;font color=&quot;#DADADA&quot;&gt;Rotoria.asm&lt;/font&gt;&lt;/a&gt;&lt;span style=&quot;color: rgb(159, 159, 159); font-family: &apos;Times New Roman&apos;; text-align: justify; background-color: rgb(97, 67, 73); font-size: medium; &quot;&gt;&amp;nbsp;- В текстовом режиме, 80x25, перемещает символы так, чтобы они двигались, &quot;вращаясь&quot; в строках по горизонтали.&amp;nbsp;&lt;/span&gt;&lt;br style=&quot;color: rgb(159, 159, 159); font-family: &apos;Times New Roman&apos;; text-align: justify; background-color: rgb(97, 67, 73); font-size: medium; &quot;&gt;&lt;a href=&quot;http://azzaqua.narod.ru/asm/rotoriaa.htm&quot; style=&quot;font-family: &apos;Times New Roman&apos;; text-align: justify; background-color: rgb(97, 67, 73); font-size: medium; &quot;&gt;&lt;font color=&quot;#DADADA&quot;&gt;Rotoria!.asm&lt;/font&gt;&lt;/a&gt;&lt;span style=&quot;color: rgb(159, 159, 159); font-family: &apos;Times New Roman&apos;; text-align: justify; background-color: rgb(97, 67, 73); font-size: medium; &quot;&gt;&amp;nbsp;- Вариант предыдуще программы, но двигаются символы по вертикали.&amp;nbsp;&lt;/span&gt;&lt;br style=&quot;color: rgb(159, 159, 159); font-family: &apos;Times New Roman&apos;; text-align: justify; background-color: rgb(97, 67, 73); font-size: medium; &quot;&gt;&lt;a href=&quot;http://azzaqua.narod.ru/asm/rotoriab.htm&quot; style=&quot;font-family: &apos;Times New Roman&apos;; text-align: justify; background-color: rgb(97, 67, 73); font-size: medium; &quot;&gt;&lt;font color=&quot;#DADADA&quot;&gt;Rotoria#.asm&lt;/font&gt;&lt;/a&gt;&lt;span style=&quot;color: rgb(159, 159, 159); font-family: &apos;Times New Roman&apos;; text-align: justify; background-color: rgb(97, 67, 73); font-size: medium; &quot;&gt;&amp;nbsp;- Версия программы, соединение предыдущих двух.&amp;nbsp;&lt;/span&gt;&lt;br style=&quot;color: rgb(159, 159, 159); font-family: &apos;Times New Roman&apos;; text-align: justify; background-color: rgb(97, 67, 73); font-size: medium; &quot;&gt;&lt;a href=&quot;http://azzaqua.narod.ru/asm/rotoriac.htm&quot; style=&quot;font-family: &apos;Times New Roman&apos;; text-align: justify; background-color: rgb(97, 67, 73); font-size: medium; &quot;&gt;&lt;font color=&quot;#DADADA&quot;&gt;Rotoria$.asm&lt;/font&gt;&lt;/a&gt;&lt;span style=&quot;color: rgb(159, 159, 159); font-family: &apos;Times New Roman&apos;; text-align: justify; background-color: rgb(97, 67, 73); font-size: medium; &quot;&gt;&amp;nbsp;- Ещё один вариант.&amp;nbsp;&lt;/span&gt;&lt;br style=&quot;color: rgb(159, 159, 159); font-family: &apos;Times New Roman&apos;; text-align: justify; background-color: rgb(97, 67, 73); font-size: medium; &quot;&gt;&lt;a href=&quot;http://azzaqua.narod.ru/asm/rotoriad.htm&quot; style=&quot;font-family: &apos;Times New Roman&apos;; text-align: justify; background-color: rgb(97, 67, 73); font-size: medium; &quot;&gt;&lt;font color=&quot;#DADADA&quot;&gt;Rotoria_.asm&lt;/font&gt;&lt;/a&gt;&lt;span style=&quot;color: rgb(159, 159, 159); font-family: &apos;Times New Roman&apos;; text-align: justify; background-color: rgb(97, 67, 73); font-size: medium; &quot;&gt;&amp;nbsp;- И ещё один.&amp;nbsp;&lt;/span&gt;&lt;br style=&quot;color: rgb(159, 159, 159); font-family: &apos;Times New Roman&apos;; text-align: justify; background-color: rgb(97, 67, 73); font-size: medium; &quot;&gt;&lt;a href=&quot;http://azzaqua.narod.ru/asm/rotoriae.htm&quot; style=&quot;font-family: &apos;Times New Roman&apos;; text-align: justify; background-color: rgb(97, 67, 73); font-size: medium; &quot;&gt;&lt;font color=&quot;#DADADA&quot;&gt;Rotoria~.asm&lt;/font&gt;&lt;/a&gt;&lt;span style=&quot;color: rgb(159, 159, 159); font-family: &apos;Times New Roman&apos;; text-align: justify; background-color: rgb(97, 67, 73); font-size: medium; &quot;&gt;&amp;nbsp;- И снова одна из версий.&amp;nbsp;&lt;/span&gt;&lt;br style=&quot;color: rgb(159, 159, 159); font-family: &apos;Times New Roman&apos;; text-align: justify; background-color: rgb(97, 67, 73); font-size: medium; &quot;&gt;&lt;a href=&quot;http://azzaqua.narod.ru/asm/rotoria1.htm&quot; style=&quot;font-family: &apos;Times New Roman&apos;; text-align: justify; background-color: rgb(97, 67, 73); font-size: medium; &quot;&gt;&lt;font color=&quot;#DADADA&quot;&gt;Rotoria1.asm&lt;/font&gt;&lt;/a&gt;&lt;span style=&quot;color: rgb(159, 159, 159); font-family: &apos;Times New Roman&apos;; text-align: justify; background-color: rgb(97, 67, 73); font-size: medium; &quot;&gt;&amp;nbsp;- Опять же версия программы Rotoria.asm.&amp;nbsp;&lt;/span&gt;&lt;br style=&quot;color: rgb(159, 159, 159); font-family: &apos;Times New Roman&apos;; text-align: justify; background-color: rgb(97, 67, 73); font-size: medium; &quot;&gt;&lt;a href=&quot;http://azzaqua.narod.ru/asm/rusflag.htm&quot; style=&quot;font-family: &apos;Times New Roman&apos;; text-align: justify; background-color: rgb(97, 67, 73); font-size: medium; &quot;&gt;&lt;font color=&quot;#DADADA&quot;&gt;rusflag.asm&lt;/font&gt;&lt;/a&gt;&lt;span style=&quot;color: rgb(159, 159, 159); font-family: &apos;Times New Roman&apos;; text-align: justify; background-color: rgb(97, 67, 73); font-size: medium; &quot;&gt;&amp;nbsp;- Всего лишь рисует на экране в текстовом режиме флаг РФ.&amp;nbsp;&lt;/span&gt;&lt;br style=&quot;color: rgb(159, 159, 159); font-family: &apos;Times New Roman&apos;; text-align: justify; background-color: rgb(97, 67, 73); font-size: medium; &quot;&gt;&lt;a href=&quot;http://azzaqua.narod.ru/asm/rusflaga.htm&quot; style=&quot;font-family: &apos;Times New Roman&apos;; text-align: justify; background-color: rgb(97, 67, 73); font-size: medium; &quot;&gt;&lt;font color=&quot;#DADADA&quot;&gt;rusflag_.asm&lt;/font&gt;&lt;/a&gt;&lt;span style=&quot;color: rgb(159, 159, 159); font-family: &apos;Times New Roman&apos;; text-align: justify; background-color: rgb(97, 67, 73); font-size: medium; &quot;&gt;&amp;nbsp;- То же самое, но цвета флага несколько иных оттенков.&amp;nbsp;&lt;/span&gt;&lt;br style=&quot;color: rgb(159, 159, 159); font-family: &apos;Times New Roman&apos;; text-align: justify; background-color: rgb(97, 67, 73); font-size: medium; &quot;&gt;&lt;a href=&quot;http://azzaqua.narod.ru/asm/SCROLLS.HTM&quot; style=&quot;font-family: &apos;Times New Roman&apos;; text-align: justify; background-color: rgb(97, 67, 73); font-size: medium; &quot;&gt;&lt;font color=&quot;#DADADA&quot;&gt;scrolls.asm&lt;/font&gt;&lt;/a&gt;&lt;span style=&quot;color: rgb(159, 159, 159); font-family: &apos;Times New Roman&apos;; text-align: justify; background-color: rgb(97, 67, 73); font-size: medium; &quot;&gt;&amp;nbsp;- Должен рисоваться конус, который перемещающийся по экрану.&amp;nbsp;&lt;/span&gt;&lt;br style=&quot;color: rgb(159, 159, 159); font-family: &apos;Times New Roman&apos;; text-align: justify; background-color: rgb(97, 67, 73); font-size: medium; &quot;&gt;&lt;a href=&quot;http://azzaqua.narod.ru/asm/scrsavr.htm&quot; style=&quot;font-family: &apos;Times New Roman&apos;; text-align: justify; background-color: rgb(97, 67, 73); font-size: medium; &quot;&gt;&lt;font color=&quot;#DADADA&quot;&gt;scrsavr.asm&lt;/font&gt;&lt;/a&gt;&lt;span style=&quot;color: rgb(159, 159, 159); font-family: &apos;Times New Roman&apos;; text-align: justify; background-color: rgb(97, 67, 73); font-size: medium; &quot;&gt;&amp;nbsp;- В текстовом режиме перемещает символы по строке влево, затем вверх; самые верхние снова переходят на нижнюю строку.&amp;nbsp;&lt;/span&gt;&lt;br style=&quot;color: rgb(159, 159, 159); font-family: &apos;Times New Roman&apos;; text-align: justify; background-color: rgb(97, 67, 73); font-size: medium; &quot;&gt;&lt;a href=&quot;http://azzaqua.narod.ru/asm/scrsvr.htm&quot; style=&quot;font-family: &apos;Times New Roman&apos;; text-align: justify; background-color: rgb(97, 67, 73); font-size: medium; &quot;&gt;&lt;font color=&quot;#DADADA&quot;&gt;scrsvr.asm&lt;/font&gt;&lt;/a&gt;&lt;span style=&quot;color: rgb(159, 159, 159); font-family: &apos;Times New Roman&apos;; text-align: justify; background-color: rgb(97, 67, 73); font-size: medium; &quot;&gt;&amp;nbsp;- Пример простой задачи, реализующей нитевую многозадачность в DOS.&amp;nbsp;&lt;/span&gt;&lt;br style=&quot;color: rgb(159, 159, 159); font-family: &apos;Times New Roman&apos;; text-align: justify; background-color: rgb(97, 67, 73); font-size: medium; &quot;&gt;&lt;a href=&quot;http://azzaqua.narod.ru/asm/vdp.htm&quot; style=&quot;font-family: &apos;Times New Roman&apos;; text-align: justify; background-color: rgb(97, 67, 73); font-size: medium; &quot;&gt;&lt;font color=&quot;#DADADA&quot;&gt;vdp.asm&lt;/font&gt;&lt;/a&gt;&lt;span style=&quot;color: rgb(159, 159, 159); font-family: &apos;Times New Roman&apos;; text-align: justify; background-color: rgb(97, 67, 73); font-size: medium; &quot;&gt;&amp;nbsp;- Решение уравнения Ван-дер-Поля.&amp;nbsp;&lt;/span&gt;&lt;br style=&quot;color: rgb(159, 159, 159); font-family: &apos;Times New Roman&apos;; text-align: justify; background-color: rgb(97, 67, 73); font-size: medium; &quot;&gt;&lt;a href=&quot;http://azzaqua.narod.ru/asm/vortex1.htm&quot; style=&quot;font-family: &apos;Times New Roman&apos;; text-align: justify; background-color: rgb(97, 67, 73); font-size: medium; &quot;&gt;&lt;font color=&quot;#DADADA&quot;&gt;vortex1.asm&lt;/font&gt;&lt;/a&gt;&lt;span style=&quot;color: rgb(159, 159, 159); font-family: &apos;Times New Roman&apos;; text-align: justify; background-color: rgb(97, 67, 73); font-size: medium; &quot;&gt;&amp;nbsp;- Снова в текстовом режиме перемещает символы в определённом порядке.&amp;nbsp;&lt;/span&gt;&lt;br style=&quot;color: rgb(159, 159, 159); font-family: &apos;Times New Roman&apos;; text-align: justify; background-color: rgb(97, 67, 73); font-size: medium; &quot;&gt;&lt;a href=&quot;http://azzaqua.narod.ru/asm/VSCROLL.HTM&quot; style=&quot;font-family: &apos;Times New Roman&apos;; text-align: justify; background-color: rgb(97, 67, 73); font-size: medium; &quot;&gt;&lt;font color=&quot;#DADADA&quot;&gt;vscroll.asm&lt;/font&gt;&lt;/a&gt;&lt;span style=&quot;color: rgb(159, 159, 159); font-family: &apos;Times New Roman&apos;; text-align: justify; background-color: rgb(97, 67, 73); font-size: medium; &quot;&gt;&amp;nbsp;- Плавная прокрутка экрана по вертикали.&amp;nbsp;&lt;/span&gt;&lt;br style=&quot;color: rgb(159, 159, 159); font-family: &apos;Times New Roman&apos;; text-align: justify; background-color: rgb(97, 67, 73); font-size: medium; &quot;&gt;&lt;a href=&quot;http://azzaqua.narod.ru/asm/WAVDIR.HTM&quot; style=&quot;font-family: &apos;Times New Roman&apos;; text-align: justify; background-color: rgb(97, 67, 73); font-size: medium; &quot;&gt;&lt;font color=&quot;#DADADA&quot;&gt;wavdir.asm&lt;/font&gt;&lt;/a&gt;&lt;span style=&quot;color: rgb(159, 159, 159); font-family: &apos;Times New Roman&apos;; text-align: justify; background-color: rgb(97, 67, 73); font-size: medium; &quot;&gt;&amp;nbsp;- Программа должна проигрывать файл tada.wav из файлов Windows (Только версию файла из Win95!).&amp;nbsp;&lt;/span&gt;&lt;br style=&quot;color: rgb(159, 159, 159); font-family: &apos;Times New Roman&apos;; text-align: justify; background-color: rgb(97, 67, 73); font-size: medium; &quot;&gt;&lt;a href=&quot;http://azzaqua.narod.ru/asm/WAVDIR1.HTM&quot; style=&quot;font-family: &apos;Times New Roman&apos;; text-align: justify; background-color: rgb(97, 67, 73); font-size: medium; &quot;&gt;&lt;font color=&quot;#DADADA&quot;&gt;wavdir1.asm&lt;/font&gt;&lt;/a&gt;&lt;span style=&quot;color: rgb(159, 159, 159); font-family: &apos;Times New Roman&apos;; text-align: justify; background-color: rgb(97, 67, 73); font-size: medium; &quot;&gt;&amp;nbsp;- Должна играть файл comisex.dat (из архива, где собраны все файлы).&amp;nbsp;&lt;/span&gt;&lt;br style=&quot;color: rgb(159, 159, 159); font-family: &apos;Times New Roman&apos;; text-align: justify; background-color: rgb(97, 67, 73); font-size: medium; &quot;&gt;&lt;a href=&quot;http://azzaqua.narod.ru/asm/WORM.HTM&quot; style=&quot;font-family: &apos;Times New Roman&apos;; text-align: justify; background-color: rgb(97, 67, 73); font-size: medium; &quot;&gt;&lt;font color=&quot;#DADADA&quot;&gt;worm.asm&lt;/font&gt;&lt;/a&gt;&lt;span style=&quot;color: rgb(159, 159, 159); font-family: &apos;Times New Roman&apos;; text-align: justify; background-color: rgb(97, 67, 73); font-size: medium; &quot;&gt;&amp;nbsp;- Питон. Управляемый. Типа игра. ;)&amp;nbsp;&lt;/span&gt;&lt;br style=&quot;color: rgb(159, 159, 159); font-family: &apos;Times New Roman&apos;; text-align: justify; background-color: rgb(97, 67, 73); font-size: medium; &quot;&gt;&lt;a href=&quot;http://azzaqua.narod.ru/asm/80X30.HTM&quot; style=&quot;font-family: &apos;Times New Roman&apos;; text-align: justify; background-color: rgb(97, 67, 73); font-size: medium; &quot;&gt;&lt;font color=&quot;#DADADA&quot;&gt;80x30.ASM&lt;/font&gt;&lt;/a&gt;&lt;span style=&quot;color: rgb(159, 159, 159); font-family: &apos;Times New Roman&apos;; text-align: justify; background-color: rgb(97, 67, 73); font-size: medium; &quot;&gt;&amp;nbsp;- Переводит экран в текстовый режим 80x30 (шрифт 8x16).&amp;nbsp;&lt;/span&gt;&lt;br style=&quot;color: rgb(159, 159, 159); font-family: &apos;Times New Roman&apos;; text-align: justify; background-color: rgb(97, 67, 73); font-size: medium; &quot;&gt;&lt;a href=&quot;http://azzaqua.narod.ru/asm/apboot.htm&quot; style=&quot;font-family: &apos;Times New Roman&apos;; text-align: justify; background-color: rgb(97, 67, 73); font-size: medium; &quot;&gt;&lt;font color=&quot;#DADADA&quot;&gt;apboot.asm&lt;/font&gt;&lt;/a&gt;&lt;span style=&quot;color: rgb(159, 159, 159); font-family: &apos;Times New Roman&apos;; text-align: justify; background-color: rgb(97, 67, 73); font-size: medium; &quot;&gt;&amp;nbsp;- Программа может быть полезна для ведения логов. Может запускаться из файла autoexec.bat (добавление записи в лог: apboot.com &amp;gt;&amp;gt; logout.log). Может быть вызвана при начальной загрузке Windows через запись в реестре (например, так: [HKEY_LOCAL_MACHINE&amp;#92;Software&amp;#92;Microsoft&amp;#92;Windows&amp;#92;CurrentVersion&amp;#92;Run]&amp;#92;&quot;zBootLogs&quot;=&quot;command.com /C C:&amp;#92;&amp;#92;WINDOWS&amp;#92;&amp;#92;APBOOT.COM&amp;gt;&amp;gt;C:&amp;#92;&amp;#92;WINDOWS&amp;#92;&amp;#92;APPLOG&amp;#92;&amp;#92;abootsh.log). Должна запускаться в свёрнутом окне и быть невидимой.&lt;/span&gt;&lt;hr style=&quot;color: rgb(159, 159, 159); font-family: &apos;Times New Roman&apos;; text-align: justify; background-color: rgb(97, 67, 73); font-size: medium; &quot;&gt;&lt;span style=&quot;color: rgb(159, 159, 159); font-family: &apos;Times New Roman&apos;; text-align: justify; background-color: rgb(97, 67, 73); font-size: medium; &quot;&gt;Все эти файлы&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;http://azzaqua.narod.ru/Arch/ASMPRGS.RAR&quot; style=&quot;font-family: &apos;Times New Roman&apos;; text-align: justify; background-color: rgb(97, 67, 73); font-size: medium; &quot;&gt;в одном архиве {15 Kb}&lt;/a&gt;&lt;span style=&quot;color: rgb(159, 159, 159); font-family: &apos;Times New Roman&apos;; text-align: justify; background-color: rgb(97, 67, 73); font-size: medium; &quot;&gt;&lt;/span&gt;&lt;hr style=&quot;color: rgb(159, 159, 159); font-family: &apos;Times New Roman&apos;; text-align: justify; background-color: rgb(97, 67, 73); font-size: medium; &quot;&gt;&lt;font size=&quot;4&quot; style=&quot;color: rgb(159, 159, 159); font-family: &apos;Times New Roman&apos;; text-align: justify; background-color: rgb(97, 67, 73); &quot;&gt;О программах: часть из этих программ взята из книги Зубкова [] (&quot;Assembler для DOS, Windows, UNIX&quot;), часть немного изменена под свои нужды.&lt;/font&gt;
&lt;/div&gt;&lt;div&gt;&lt;font size=&quot;4&quot; style=&quot;color: rgb(159, 159, 159); font-family: &apos;Times New Roman&apos;; text-align: justify; background-color: rgb(97, 67, 73); &quot;&gt;&lt;br&gt;&lt;/font&gt;&lt;/div&gt;&lt;div&gt;&lt;font size=&quot;4&quot; style=&quot;color: rgb(159, 159, 159); font-family: &apos;Times New Roman&apos;; text-align: justify; background-color: rgb(97, 67, 73); &quot;&gt;&lt;br&gt;&lt;/font&gt;&lt;/div&gt;&lt;div&gt;&lt;font size=&quot;4&quot; style=&quot;color: rgb(159, 159, 159); font-family: &apos;Times New Roman&apos;; text-align: justify; background-color: rgb(97, 67, 73); &quot;&gt;&lt;br&gt;&lt;/font&gt;&lt;/div&gt;&lt;div&gt;&lt;font size=&quot;4&quot; style=&quot;color: rgb(159, 159, 159); font-family: &apos;Times New Roman&apos;; text-align: justify; background-color: rgb(97, 67, 73); &quot;&gt;&lt;a href=&quot;http://ru.wikipedia.org/wiki/%D0%AF%D0%B7%D1%8B%D0%BA_%D0%B0%D1%81%D1%81%D0%B5%D0%BC%D0%B1%D0%BB%D0%B5%D1%80%D0%B0&quot;&gt;http://ru.wikipedia.org/wiki/%D0%AF%D0%B7%D1%8B%D0%BA_%D0%B0%D1%81%D1%81%D0%B5%D0%BC%D0%B1%D0%BB%D0%B5%D1%80%D0%B0&lt;/a&gt;&lt;br&gt;&lt;/font&gt;&lt;/div&gt;</content:encoded>
			<link>https://programmist-bav.at.ua/news/2012-04-24-51</link>
			<dc:creator>Turbokherson</dc:creator>
			<guid>https://programmist-bav.at.ua/news/2012-04-24-51</guid>
			<pubDate>Tue, 24 Apr 2012 08:40:41 GMT</pubDate>
		</item>
		<item>
			<title>Подробнее об адресах CMOS ASSEMBLER</title>
			<description>&lt;div class=&quot;pagenavcounter&quot;&gt;&lt;b&gt;Страница 1 из 4&lt;/b&gt;&lt;/div&gt;&lt;hr&gt;В эпоху 
интенсивного развития высоких технологий и технологий Internet 
программирование для «железа» отошло на второй план. А между тем 
практически невозможно реализовать ничего стоящего без правильной 
конфигурации оборудования, в частности CMOS - энергонезависимой памяти 
компьютера. В данной статье мы рассмотрим устройство CMOS, его структуру
 и возможности программирования. Сразу оговорюсь, что программировать 
CMOS желательно из реального режима ОС; под ОС Windows это делается с 
помощью специальных драйверов VxD или SYS. В Сети существует достаточно 
источников документации по построению таковых, поэтому я на них 
останавливаться не буду. Естественно, что проводить все ниже 
перечисленные действия по записи значений в CMOS следует с особой 
осторожностью; иногда (!) можно потерять практически все значения 
конфигурации ПК. В таковом случае необходимо очистить CMOS; как это 
сделать - смотрите в документации к вашей ма...</description>
			<content:encoded>&lt;div class=&quot;pagenavcounter&quot;&gt;&lt;b&gt;Страница 1 из 4&lt;/b&gt;&lt;/div&gt;&lt;hr&gt;В эпоху 
интенсивного развития высоких технологий и технологий Internet 
программирование для «железа» отошло на второй план. А между тем 
практически невозможно реализовать ничего стоящего без правильной 
конфигурации оборудования, в частности CMOS - энергонезависимой памяти 
компьютера. В данной статье мы рассмотрим устройство CMOS, его структуру
 и возможности программирования. Сразу оговорюсь, что программировать 
CMOS желательно из реального режима ОС; под ОС Windows это делается с 
помощью специальных драйверов VxD или SYS. В Сети существует достаточно 
источников документации по построению таковых, поэтому я на них 
останавливаться не буду. Естественно, что проводить все ниже 
перечисленные действия по записи значений в CMOS следует с особой 
осторожностью; иногда (!) можно потерять практически все значения 
конфигурации ПК. В таковом случае необходимо очистить CMOS; как это 
сделать - смотрите в документации к вашей материнской плате. Также я 
буду использовать язык ассемблера для иллюстрации конкретных примеров, а
 так же широко распространенный отладчик DEBUG.EXE, который прилагается 
практически с каждой версией ОС Windows/DOS.&lt;br&gt;&lt;br&gt;&lt;div class=&quot;pagenavcounter&quot;&gt;&lt;b&gt;Страница 2 из 4&lt;/b&gt;&lt;/div&gt;&lt;hr&gt;&lt;h2&gt;Данные CMOS&amp;nbsp;&lt;/h2&gt; &lt;p&gt;
 CMOS является нечто вроде базы данных, которая предназначена для 
хранения информации о конфигурации ПК. Однако, в отличие от реальной БД,
 которая имеет реальный образ на магнитном носителе, CMOS хранит свои 
данные на микросхеме многократной записи (write many-read many). 
Программа установки BIOS SETUP при записи сохраняет в ней свою системную
 информацию, которую впоследствии сама же и считывает (при загрузке ПК).
 &lt;strong&gt;Каждая ячейка имеет размер в 1 байт.&lt;/strong&gt; &lt;/p&gt; &lt;p&gt; Таблица данных имеет следующий вид: &lt;/p&gt; &lt;table border=&quot;0&quot;&gt; &lt;tbody&gt;&lt;tr&gt; &lt;td&gt; &lt;strong&gt;Адрес&lt;/strong&gt; &lt;/td&gt;&lt;td&gt; &lt;strong&gt;Назначение&lt;/strong&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt; &lt;strong&gt;00H-0DH&lt;/strong&gt; &lt;/td&gt;&lt;td&gt; RTC (Real Time Clock) - часы реального времени (таймер) &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt; &lt;strong&gt;0EH&lt;/strong&gt; &lt;/td&gt;&lt;td&gt; Байт статуса процедуры POST (результат загрузки ПК) &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt; &lt;strong&gt;0FH&lt;/strong&gt; &lt;/td&gt;&lt;td&gt; Байт завершения работы ПК &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt; &lt;strong&gt;10Н&lt;/strong&gt; &lt;/td&gt;&lt;td&gt; Тип дисковода &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt; &lt;strong&gt;11Н&lt;/strong&gt; &lt;/td&gt;&lt;td&gt; Зарезервировано &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt; &lt;strong&gt;12Н&lt;/strong&gt; &lt;/td&gt;&lt;td&gt; Тип(ы) винчестера (если значение &lt; 15) &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt; &lt;strong&gt;13Н&lt;/strong&gt; &lt;/td&gt;&lt;td&gt; Зарезервировано &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt; &lt;strong&gt;14Н&lt;/strong&gt; &lt;/td&gt;&lt;td&gt; Байт конфигурации оборудования &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt; &lt;strong&gt;15Н-16Н&lt;/strong&gt; &lt;/td&gt;&lt;td&gt; Размр базовой памяти &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt; &lt;strong&gt;17Н-18Н&lt;/strong&gt; &lt;/td&gt;&lt;td&gt; Размер памяти за пределом 1 Мб &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt; &lt;strong&gt;19Н&lt;/strong&gt; &lt;/td&gt;&lt;td&gt; Тип винчестера С: (если значение &amp;gt; 15) &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt; &lt;strong&gt;1АН&lt;/strong&gt; &lt;/td&gt;&lt;td&gt; Тип винчестера D: (если значение &amp;gt; 15) &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt; &lt;strong&gt;1BH-20H&lt;/strong&gt; &lt;/td&gt;&lt;td&gt; Зарезервировано &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt; &lt;strong&gt;21H-2DH&lt;/strong&gt; &lt;/td&gt;&lt;td&gt; Зарезервировано &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt; &lt;strong&gt;2EH-2FH&lt;/strong&gt; &lt;/td&gt;&lt;td&gt; Контрольная сумма CMOS (от 10Н - 20Н) &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt; &lt;strong&gt;30Н-31Н&lt;/strong&gt; &lt;/td&gt;&lt;td&gt; Размер расширенной памяти за пределом 1 Мб &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt; &lt;strong&gt;32Н&lt;/strong&gt; &lt;/td&gt;&lt;td&gt; Номер текущего века в BCD нотации (например 17Н) &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt; &lt;strong&gt;33Н&lt;/strong&gt; &lt;/td&gt;&lt;td&gt; Другая информация &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt; &lt;strong&gt;34Н-3АН&lt;/strong&gt; &lt;/td&gt;&lt;td&gt; Зарезервировано &lt;/td&gt; &lt;/tr&gt; &lt;/tbody&gt;&lt;/table&gt; &lt;br&gt; &lt;p&gt; Ячейки таблицы, показанные &lt;strong&gt;красным&lt;/strong&gt;
 цветом, представляют собой адреса CMOS, защищенные контрольной суммой. 
То есть запись в диапазон адресов 10Н-20Н должен сопровождаться 
корректировкой значений в ячейках 2ЕН-2FH. Иначе можно получить 
сообщение о неправильной установке параметров или о «усохшей» батарее 
CMOS. Контрольная сумма представляет собой 16-битную сумму всех 
значений, записанных в ячейки CMOS с 10Н по 20Н. В ячейку 2ЕН пишется 
старший байт суммы, а в 2FH - младший. В любом случае, мой вам совет - 
сначала сохраните старое значение CMOS (да и вообще все значения CMOS)а 
потом просто вычитайте или складывайте нужные значения с полученной 
контрольной суммой. Так проще. &lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;pagenavcounter&quot;&gt;&lt;b&gt;Страница 3 из 4&lt;/b&gt;&lt;/div&gt;&lt;hr&gt;&amp;nbsp;&lt;h2&gt;Чтение и запись CMOS &lt;/h2&gt; &lt;blockquote&gt;&lt;div&gt; &lt;strong&gt;&lt;em&gt;Чтение&lt;/em&gt;:&lt;/strong&gt; &lt;br&gt;для
 чтения значения из ячейки, запишите значение в порт 70Н адрес 
интересующей вас ячейки, а затем считайте значение из порта 71Н - это и 
будет интересующие вас значение. Например получим номер текущего века 
(MS Debug):&lt;/div&gt;&lt;/blockquote&gt; &lt;p&gt; Нумерация веков идёт с 00Н (если так можно выразиться), поэтому значение 20Н вполне адекватно. &lt;/p&gt; &lt;blockquote&gt;&lt;div&gt; &lt;strong&gt;&lt;em&gt;Запись:&lt;/em&gt;&lt;/strong&gt; &lt;br&gt;
 для записи значения в CMOS запишите значение адреса в порт 70Н, а затем
 новое значение в порт 71Н. Установим для примера новое значение века 
(так сказать «машина времени» J):&lt;/div&gt;&lt;/blockquote&gt; &lt;p&gt; Теперь чтобы вернуть все как было, введем в порт 70Н значение 32Н, а в 71Н - 20Н: &lt;/p&gt; &lt;p&gt; Пусть вас не смущает отсутствие символа &quot;Н” после цифр - все значения в MS Debug идут только в шестнадцатеричном виде. &lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;pagenavcounter&quot;&gt;&lt;b&gt;Страница 4 из 4&lt;/b&gt;&lt;/div&gt;&lt;hr&gt;&amp;nbsp;&lt;h2&gt;Подробнее об адресах CMOS &lt;/h2&gt; &lt;p&gt; Итак, остановимся на подробном рассмотрении значений, хранящихся в CMOS. &lt;/p&gt; &lt;table border=&quot;0&quot;&gt; &lt;tbody&gt;&lt;tr&gt; &lt;td&gt; &lt;strong&gt;Адрес (HEX)&lt;/strong&gt; &lt;/td&gt;&lt;td&gt; &lt;strong&gt;Описание&lt;/strong&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt; &lt;strong&gt;00Н&lt;/strong&gt; &lt;/td&gt;&lt;td&gt; Текущая секунда &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt; &lt;strong&gt;01Н&lt;/strong&gt; &lt;/td&gt;&lt;td&gt; Сигнальная секунда &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt; &lt;strong&gt;02Н&lt;/strong&gt; &lt;/td&gt;&lt;td&gt; Текущая минута &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt; &lt;strong&gt;03Н&lt;/strong&gt; &lt;/td&gt;&lt;td&gt; Сигнальная минута &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt; &lt;strong&gt;04Н&lt;/strong&gt; &lt;/td&gt;&lt;td&gt; Текущий час &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt; &lt;strong&gt;05Н&lt;/strong&gt; &lt;/td&gt;&lt;td&gt; Сигнальный час &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt; &lt;strong&gt;06Н&lt;/strong&gt; &lt;/td&gt;&lt;td&gt; Текущий день недели (1 - Воскресенье) &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt; &lt;strong&gt;07Н&lt;/strong&gt; &lt;/td&gt;&lt;td&gt; Текущий день месяца &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt; &lt;strong&gt;08Н&lt;/strong&gt; &lt;/td&gt;&lt;td&gt; Текущий месяц &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt; &lt;strong&gt;09Н&lt;/strong&gt; &lt;/td&gt;&lt;td&gt; Текущий год (только 2 последние цифры, напр. 98) &lt;/td&gt; &lt;/tr&gt; &lt;/tbody&gt;&lt;/table&gt; &lt;br&gt; &lt;p&gt; Все значения RTC хранятся в BCD формате как 2 полубайта но в десятичном формате. Например 31 (dec) хранится как 31 (hex). &lt;/p&gt; &lt;table border=&quot;0&quot;&gt; &lt;tbody&gt;&lt;tr&gt; &lt;td&gt; &lt;strong&gt;Адрес (HEX)&lt;/strong&gt; &lt;/td&gt;&lt;td&gt; &lt;strong&gt;Описание&lt;/strong&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt; &lt;strong&gt;0AH&lt;/strong&gt; &lt;/td&gt;&lt;td&gt; Регистр статуса RTC (# A): &lt;strong&gt;Биты 0-3 - &lt;/strong&gt;Селектор уровня (установлены в 0110) &lt;strong&gt;Биты 4-6 - &lt;/strong&gt;22-уровневый делитель (установлен в 010) &lt;strong&gt;Бит 7 - &lt;/strong&gt;В данный момент производится обновление (если == 0 то разрешено чтение) &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt; &lt;strong&gt;0BH&lt;/strong&gt; &lt;/td&gt;&lt;td&gt; Регистр статуса RTC (# B): &lt;strong&gt;Бит 0 - &lt;/strong&gt;Включен режим экономии времени (летнее); (0 = стандартное время; по умолч. = 0) &lt;strong&gt;Бит 1 - &lt;/strong&gt;12 или 24 часовой режим времени (если 0 то 12 часовой; по умолч. = 1) &lt;strong&gt;Бит 2 - &lt;/strong&gt;Режим BCD даты (1=двоичный, 0 =BCD, по умолч. = 0) &lt;strong&gt;Бит 3&lt;/strong&gt; - Включить Square Wave (1=включить; по умолч. = 0) &lt;strong&gt;Бит 4 - &lt;/strong&gt;Включить прерывание обновления (0=отключить, по умолч. = 0) &lt;strong&gt;Бит 5 - &lt;/strong&gt;Включить сигнальное прерывание (0=отключить, по умолч = 0) &lt;strong&gt;Бит 6 - &lt;/strong&gt;Включить периодическое прерывание (0=отключить, по умолч. = 0) &lt;strong&gt;Бит 7 - &lt;/strong&gt;UIP флаг (Update In Progress), 0 - можно читать CMOS &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt; &lt;strong&gt;0CH&lt;/strong&gt; &lt;/td&gt;&lt;td&gt; Регистр статуса RTC (# С):в основном не используется &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt; &lt;strong&gt;0DH&lt;/strong&gt; &lt;/td&gt;&lt;td&gt; Регистр статуса RTC (# D):если бит 7=1, то питание CMOS включено, если бит 7=0 - то батарея разряжена. &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt; &lt;strong&gt;0EH&lt;/strong&gt; &lt;/td&gt;&lt;td&gt; Байт диагностики загрузки (POST Byte): &lt;strong&gt;Биты 0 и 1 всегда равны 0. Бит 2 - &lt;/strong&gt;Время правильное (1=верно, что сегодня не 30 февраля) &lt;strong&gt;Бит 3 - &lt;/strong&gt;Неверный загрузочный жесткий диск (1=нельзя загрузиться с винчестера) &lt;strong&gt;Бит 4 - &lt;/strong&gt;Ошибка размера RAM (1=POST нашла неверный размер RAM) &lt;strong&gt;Бит 5&lt;/strong&gt; - Неверная запись об оборудовании (1=неверное оборудование) &lt;strong&gt;Бит 6 - &lt;/strong&gt;Неверная контрольная сумма (1=неверная сумма CMOS) &lt;strong&gt;Бит 7 - &lt;/strong&gt;Утеря питания батареи CMOS (1=утеря питания) &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt; &lt;strong&gt;0FH&lt;/strong&gt; &lt;/td&gt;&lt;td&gt;
 Байт статуса завершения работы ПК.Применяется чаще всего после 
перезагрузки ПК процедурой SETUP. Значения могут быть следующие: &lt;strong&gt;0 &lt;/strong&gt;, если была перезагр. по нажатии Ctrl-Alt-Del или неожиданный перезапуск. В любом случае - процедура POST &lt;strong&gt;НЕ &lt;/strong&gt;выполняется &lt;strong&gt;1 &lt;/strong&gt;перезапуск после определения размера памяти &lt;strong&gt;2 &lt;/strong&gt;перезапускпосле теста памяти&lt;strong&gt; 3 &lt;/strong&gt;перезапуск после обнаружения ошибки памяти &lt;strong&gt;4 &lt;/strong&gt;перезапуск по запросу загрузчика ОС &lt;strong&gt;5 &lt;/strong&gt;перезапуск вследствие дальнего перехода (FAR JMP) на адрес 0:0467Н &lt;strong&gt;6,7,8 &lt;/strong&gt;перезапуск после проверки защищ. режима 80286 &lt;strong&gt;9 &lt;/strong&gt;перезапуск после переназначения блока памяти (ф-я 0х87 прерыв. 0х15) &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt; &lt;strong&gt;10Н&lt;/strong&gt; &lt;/td&gt;&lt;td&gt; Байт типа дисковода: &lt;strong&gt;Биты 0-3: &lt;/strong&gt;первый дисковод&lt;strong&gt;Биты 4&lt;/strong&gt;-&lt;strong&gt;7: &lt;/strong&gt;второй дисковод В любом случае, значения битов могут быть следующими: &lt;strong&gt;0000
 = 0 = дисковод не установлен 0001 = 1 = 360К 0010 = 2 = 1,2 Мб 0011 = 3
 = 720К 0100 = 4 = 1,44 Мб Например: 24Н - это диск А: размером 1,2М и 
диск В: размером 1,44М&lt;/strong&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt; &lt;strong&gt;11Н&lt;/strong&gt; &lt;/td&gt;&lt;td&gt; РЕЗЕРВ &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt; &lt;strong&gt;12Н&lt;/strong&gt; &lt;/td&gt;&lt;td&gt; Тип винчестера (для дисков С: и D:, когда байт наход. В промежутке от 1 до 14).&lt;strong&gt;Биты 0-3: &lt;/strong&gt;первый винчестер&lt;strong&gt;Биты 4&lt;/strong&gt;-&lt;strong&gt;7: &lt;/strong&gt;второй винчестер В любом случае, значения битов могут быть следующими: &lt;strong&gt;0000 = 0 = диск не установлен другое_значение = тип диска 1111 = см. адреса 19Н и 1АН&lt;/strong&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt; &lt;strong&gt;13Н&lt;/strong&gt; &lt;/td&gt;&lt;td&gt; РЕЗЕРВ &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt; &lt;strong&gt;14Н&lt;/strong&gt; &lt;/td&gt;&lt;td&gt; Байт оборудования: &lt;strong&gt;Бит 0 = 1&lt;/strong&gt;, если присутствует дисковод(ы) &lt;strong&gt;Бит 1 = 1&lt;/strong&gt;, если присутствует матем. сопроцессор &lt;strong&gt;Биты 2, 3&lt;/strong&gt;не используются и равны 0 &lt;strong&gt;Биты 5, 4&lt;/strong&gt; - основной видеоадаптер: · 00 - нет или EGA · 01 - 40*25 EGA, CGA, VGA · 10 - 80*25 EGA, CGA, VGA · 11 - монохромный (ч/б)&lt;strong&gt;Биты 6, 7&lt;/strong&gt; - количество дисководов - 1 (00=1, 01=2, 10=3, 11=4) &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt; &lt;strong&gt;15Н, 16Н&lt;/strong&gt; &lt;/td&gt;&lt;td&gt; Базовая память 15Н - младший байт 16Н - старший байт Могут быть равны: · 0100Н = 256К · 0200Н = 512К · 0280Н = 640К &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt; &lt;strong&gt;17Н, 18Н&lt;/strong&gt; &lt;/td&gt;&lt;td&gt; Дополнительная память свыше 1 Мб 17Н - младший байт 18Н - старший байт &lt;em&gt;&lt;strong&gt;Размер записан в Кб.&lt;/strong&gt;&lt;/em&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt; &lt;strong&gt;19Н&lt;/strong&gt; &lt;/td&gt;&lt;td&gt; Тип диска № 0 (С:), если значение адреса (12Н &amp;amp; 0FH) = 0FH &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt; &lt;strong&gt;20Н&lt;/strong&gt; &lt;/td&gt;&lt;td&gt; Тип диска № 1 (D:), если значение адреса (12Н &amp;amp; F0H) = F0H &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt; &lt;strong&gt;1BH-2DH&lt;/strong&gt; &lt;/td&gt;&lt;td&gt; РЕЗЕРВ &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt; &lt;strong&gt;2ЕН, 2FH&lt;/strong&gt; &lt;/td&gt;&lt;td&gt; Контрольная сумма значений адресов от 10Н по 20Н · 2ЕН - старший байт · 2FH - младший байт &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt; &lt;strong&gt;30Н-31Н&lt;/strong&gt; &lt;/td&gt;&lt;td&gt; РЕЗЕРВ &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt; &lt;strong&gt;32Н&lt;/strong&gt; &lt;/td&gt;&lt;td&gt; Век в формате BCD &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt; &lt;strong&gt;33H&lt;/strong&gt; &lt;/td&gt;&lt;td&gt; Другая информация (специфич. для машин AT/PS-2 класса) &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt; &lt;strong&gt;34Н-3FH&lt;/strong&gt; &lt;/td&gt;&lt;td&gt; РЕЗЕРВ. Как показывает практика, эта область чаще всего свободна от системных данных &lt;strong&gt;(но не всегда!), &lt;/strong&gt;поэтому можете записывать сюда свои личные данные (но не много J) для сохранения между перезагрузками) &lt;/td&gt; &lt;/tr&gt; &lt;/tbody&gt;&lt;/table&gt; &lt;br&gt; &lt;p&gt;
 Итак, мы рассмотрели CMOS, его логическое строение и структуру. 
Конечно, в таблице приведены лишь общие для всех машин значения 
параметров CMOS, но тем не менее даже с этим «набором» можно сделать 
много «чего», например подключить отключенный администратором дисковод 
(см. адреса 14Н, 10Н, 2ЕН, 2АР) и т.д. В любом случае: будьте &lt;em&gt;&lt;strong&gt;крайне&lt;/strong&gt;&lt;/em&gt; осторожны&lt;strong&gt;, не делайте ничего такого, чего потом вы не сможете вернуть обратно&lt;/strong&gt;. Всё же буду надеяться, что данная статья принесёт вам пользу. &lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://www.tdoc.ru/c/programming/assembler/cmos-programming-page4.html&quot;&gt;http://www.tdoc.ru/c/programming/assembler/cmos-programming-page4.html&lt;/a&gt;&lt;br&gt;&lt;/p&gt;&lt;br&gt;</content:encoded>
			<link>https://programmist-bav.at.ua/news/2012-03-30-50</link>
			<dc:creator>Turbokherson</dc:creator>
			<guid>https://programmist-bav.at.ua/news/2012-03-30-50</guid>
			<pubDate>Fri, 30 Mar 2012 07:19:32 GMT</pubDate>
		</item>
		<item>
			<title>MBR своими руками в Ассемблере</title>
			<description>&lt;a href=&quot;http://www.insidepro.com/kk/065/065r.shtml&quot;&gt;http://www.insidepro.com/kk/065/065r.shtml&lt;/a&gt;&lt;br&gt;&lt;br&gt;&lt;blockquote&gt;&lt;i&gt;Сегодня мы
напишем свой менеджер мультизагрузки. Это такая штука, что сидит в загрузочном
секторе и грузит любую из нескольких установленных операционных систем по
нашему выбору. Статья познакомит нас с прерыванием INT&amp;nbsp;13h,
таблицей разделов и кое-чем еще.&lt;/i&gt;&lt;/blockquote&gt;

&lt;h4&gt;Введение&lt;/h4&gt;

&lt;p&gt;Стандартный
загрузчик, устанавливаемый большинством осей по умолчанию, слишком примитивен,
чтобы его воспринимать всерьез, а нестандартные загрузчики от независимых
разработчиков обычно слишком неповоротливы, монструозны и ненадежны. Вот и
давайте напишем свой! Пока мы будет его писать, мы познаем дао и дзен
ассемблера, научимся отлаживать программы без отладчика, и попробуем
низкоуровневое железо винчестера на вкус.&lt;/p&gt;

&lt;h4&gt;Начальная теоретическая подготовка&lt;/h4&gt;

&lt;p&gt;Загрузка
системы начинается с того, что BIOS
считывает первый сектор жесткого диска, размещает его в п...</description>
			<content:encoded>&lt;a href=&quot;http://www.insidepro.com/kk/065/065r.shtml&quot;&gt;http://www.insidepro.com/kk/065/065r.shtml&lt;/a&gt;&lt;br&gt;&lt;br&gt;&lt;blockquote&gt;&lt;i&gt;Сегодня мы
напишем свой менеджер мультизагрузки. Это такая штука, что сидит в загрузочном
секторе и грузит любую из нескольких установленных операционных систем по
нашему выбору. Статья познакомит нас с прерыванием INT&amp;nbsp;13h,
таблицей разделов и кое-чем еще.&lt;/i&gt;&lt;/blockquote&gt;

&lt;h4&gt;Введение&lt;/h4&gt;

&lt;p&gt;Стандартный
загрузчик, устанавливаемый большинством осей по умолчанию, слишком примитивен,
чтобы его воспринимать всерьез, а нестандартные загрузчики от независимых
разработчиков обычно слишком неповоротливы, монструозны и ненадежны. Вот и
давайте напишем свой! Пока мы будет его писать, мы познаем дао и дзен
ассемблера, научимся отлаживать программы без отладчика, и попробуем
низкоуровневое железо винчестера на вкус.&lt;/p&gt;

&lt;h4&gt;Начальная теоретическая подготовка&lt;/h4&gt;

&lt;p&gt;Загрузка
системы начинается с того, что BIOS
считывает первый сектор жесткого диска, размещает его в памяти по адресу
0000:7С00h и передает сюда управление. Программисты называют его Главным
Загрузочным Сектором (Master Boot Record),
или, сокращенно, MBR. В
начале MBR расположен
машинный код загрузчика, за ним идет Таблица Разделов (Partition Table), описывающая схему
разбиения логических дисков. В конце загрузочного сектора находится сигнатура
55h&amp;nbsp;AAh, говорящая
BIOS&apos;у о том, что это
действительно MBR, а не
что-то еще.&lt;/p&gt;

&lt;p&gt;Загрузчик
должен проанализировать Таблицу Разделов, найти предпочтительный логический
диск, считать его первый сектор (он называется загрузочным&amp;nbsp;- boot) и передать ему бразды
правления. Вот минимум требований, предъявляемых к стандартному загрузчику,
главный недостаток которого заключается в том, что на каждом логическом диске
может быть установлена только одна операционная система, причем она должна быть
установлена непременно на Primary Master&apos;е,
в противном случае загрузчик ее просто &quot;не увидит&quot; и нам придется
менять порядок загрузки в BIOS&amp;nbsp;Setup,
а это слишком хлопотно и утомительно. Наш загрузчик будет свободен от всех этих
глупых ограничений, но прежде чем зарываться вглубь, окинем MBR беглым взглядом.&lt;/p&gt;

&lt;p&gt;Воспользовавшись
любым редактором диска (например, Microsoft Disk Probe из комплекта Resource Kit, прилагаемого к
лицензионной Windows),
считаем первый сектор физического диска. Он должен выглядеть приблизительно
так:&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
&lt;img src=&quot;http://www.insidepro.com/kk/065/065_1.gif&quot; alt=&quot;Внешний вид MBR&quot; height=&quot;398&quot; width=&quot;553&quot; border=&quot;0&quot;&gt;
&lt;/p&gt;

&lt;p class=&quot;small&quot; align=&quot;center&quot;&gt;&lt;b&gt;Рисунок&amp;nbsp;1.&amp;nbsp;&lt;/b&gt;Внешний вид MBR - очень похоже на Матрицу, не правда
ли?&lt;/p&gt;

&lt;p&gt;Первые 1BBh байт занимают код и
данные загрузчика, среди которых отчетливо выделяются текстовые строки (кстати
говоря, русифицировав сообщения загрузчика, Microsoft допустила грубейшую стратегическую ошибку, ведь
никакого кириллического фонта в BIOS&apos;е
нет и русские символы выглядят бессмысленной абракадаброй).&lt;/p&gt;

&lt;p&gt;По смещению 1BBh расположен
четырехбайтовый идентификатор диска, принудительно назначаемый Windows 
при запуске Disk&amp;nbsp;Manager&apos;а.
Коварство Microsoft не
знает границ! Еще со времен первых IBM&amp;nbsp;PC (тогда они назывались XT), 
загрузчик владел первыми 1BEh байтами MBR-сектора, и достаточно многие
загрузчики (и вирусы!) использовали эти байты на всю катушку. Нетрудно
сообразить, что произойдет, если внутрь загрузчика вдруг запишется
идентификатор. Это убьет его! Поэтому, байты 1BBh&amp;nbsp;- 1BEh лучше не 
трогать.&lt;/p&gt;

&lt;p&gt;Со смещения 1BEh начинается Таблица
Разделов, представляющая собой массив из четырех записей типа partition.
Каждая partition описывает свой логический
диск, что позволяет нам создавать до четырех разделов на каждом HDD. Динамические диски,
впервые появившиеся в W2K, хранятся в Базе Менеджера
Логических Дисков (Logical Disk Manager Database) и в таблице разделов
присутствовать не обязаны.&lt;/p&gt;

&lt;p&gt;В общем,
устройство Главного Загрузочного Сектора выглядит так:&lt;/p&gt;

&lt;center&gt;
&lt;table border=&quot;1&quot; cellpadding=&quot;4&quot; cellspacing=&quot;0&quot;&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td align=&quot;center&quot;&gt;&lt;b&gt;Смещение&lt;/b&gt;&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;&lt;b&gt;Размер&lt;/b&gt;&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;&lt;b&gt;Назначение&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;000h&lt;/td&gt;
&lt;td&gt;Переменный&lt;/td&gt;
&lt;td&gt;Код загрузчика&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1BBh&lt;/td&gt;
&lt;td&gt;4h&lt;/td&gt;
&lt;td&gt;Идентификатор диска&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1BEh&lt;/td&gt;
&lt;td&gt;10h&lt;/td&gt;
&lt;td&gt;partition 1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1CEh&lt;/td&gt;
&lt;td&gt;10h&lt;/td&gt;
&lt;td&gt;partition 2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1DEh&lt;/td&gt;
&lt;td&gt;10h&lt;/td&gt;
&lt;td&gt;partition 3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1EEh&lt;/td&gt;
&lt;td&gt;10h&lt;/td&gt;
&lt;td&gt;partition 4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1FEh&lt;/td&gt;
&lt;td&gt;0x2&lt;/td&gt;
&lt;td&gt;Признак таблицы разделов, сигнатура 55h AAh&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;/center&gt;


&lt;p class=&quot;small&quot; align=&quot;center&quot;&gt;&lt;b&gt;Таблица&amp;nbsp;1.&amp;nbsp;&lt;/b&gt;Устройство
MBR.&lt;/p&gt;

&lt;p&gt;Таблица
Разделов&amp;nbsp;- это святая святых операционной системы. Каждая запись partition состоит из: &lt;b&gt;&lt;i&gt;адресов&lt;/i&gt;&lt;/b&gt;
начала и конца раздела, &lt;b&gt;&lt;i&gt;типа&lt;/i&gt;&lt;/b&gt; раздела (NTFS, FAT16, FAT32...),
количество секторов в разделе и флага &quot;загруженности&quot; раздела.&lt;/p&gt;

&lt;p&gt;Все адреса
задаются либо CHS (Cylinder-Head-Sector&amp;nbsp;- Цилиндр-Головка-Сектор), либо LBA (Logical Block Address&amp;nbsp;- Логический
Адрес Блока) формате. Конкретный формат определяется типом раздела (Boot ID), записанным в 04h&amp;nbsp;байте. Количество
существующих типов огромно и было бы слишком утомительно перечислять их здесь.
В таблице&amp;nbsp;3 приведены лишь самые популярные из них.&lt;/p&gt;

&lt;p&gt;В CHS-формате, 01h и 05h байты partition&apos;а хранят номер первой и
последней головки раздела (см. таблицу&amp;nbsp;2). Байты 02h и 06h хранят 5 младших бит начального/конечного сектора и по два
старших бита номера цилиндра, а оставшиеся биты лежат в следующем байте.
Получается довольно запутанная схема, да к тому же адресующая только первые
8&amp;nbsp;Гбайт дискового пространства (CHS адрес занимает три байта или 24&amp;nbsp;бита, что при длине
сектора в 512&amp;nbsp;байт дает 512 * 2&lt;sup&gt;24&lt;/sup&gt;&amp;nbsp;=&amp;nbsp;8.388.608&amp;nbsp;байт).
Ха! Да жесткие диски преодолели этот барьер еще в прошлом веке! Это было
достигнуто за счет введения LBA-адресации,
последовательно нумерующей все сектора от 0 до многодетной матери. Начало
раздела хранится в 32-битном поле relative offset (относительное смещение),
содержащим смещение первого сектора раздела от начала partition или, попросту говоря,
расстояние между концом partition
и началом раздела. Конец раздела в явном нигде не хранится, вместо этого в
специальном 32-битном поле partition size
записывается количество секторов в разделе. Как нетрудно подсчитать, предельно
допустимый размер одного раздела составляет (512 * 2&lt;sup&gt;32&lt;/sup&gt;&amp;nbsp;=&amp;nbsp;2.199.023.255.552&amp;nbsp;байт
или 2.048&amp;nbsp;Гбайт), а совокупный объем всего диска вообще неограничен! Так
что, для сегодняшних нужд LBA-адресации
вполне достаточно, а там уж мы что-нибудь придумаем.&lt;/p&gt;

&lt;center&gt;
&lt;table border=&quot;1&quot; cellpadding=&quot;4&quot; cellspacing=&quot;0&quot;&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td colspan=&quot;5&quot; align=&quot;center&quot;&gt;&lt;b&gt;Смещение&lt;/b&gt;&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;&lt;b&gt;Разм.&lt;/b&gt;&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;&lt;b&gt;Назначение&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;000&lt;/td&gt;
&lt;td&gt;1BE&lt;/td&gt;
&lt;td&gt;1CE&lt;/td&gt;
&lt;td&gt;1DE&lt;/td&gt;
&lt;td&gt;1EE&lt;/td&gt;
&lt;td&gt;BYTE&lt;/td&gt;
&lt;td&gt;Флаг активного загрузочного раздела. (Boot Indicator)80h - загрузочный раздел, 00h - не загрузочный&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;001&lt;/td&gt;
&lt;td&gt;1BF&lt;/td&gt;
&lt;td&gt;1CF&lt;/td&gt;
&lt;td&gt;1DF&lt;/td&gt;
&lt;td&gt;1EF&lt;/td&gt;
&lt;td&gt;BYTE&lt;/td&gt;
&lt;td&gt;Стартовая головка раздела&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;002&lt;/td&gt;
&lt;td&gt;1C0&lt;/td&gt;
&lt;td&gt;1D0&lt;/td&gt;
&lt;td&gt;1E0&lt;/td&gt;
&lt;td&gt;1F0&lt;/td&gt;
&lt;td&gt;BYTE&lt;/td&gt;
&lt;td&gt;Стартовый сектор раздела (биты 0-5), старшие биты стартового цилиндра (биты 6-7)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;003&lt;/td&gt;
&lt;td&gt;1C1&lt;/td&gt;
&lt;td&gt;1D1&lt;/td&gt;
&lt;td&gt;1E1&lt;/td&gt;
&lt;td&gt;1F1&lt;/td&gt;
&lt;td&gt;BYTE&lt;/td&gt;
&lt;td&gt;Младшие биты стартового цилиндра (биты 0-7)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;004&lt;/td&gt;
&lt;td&gt;1C2&lt;/td&gt;
&lt;td&gt;1D2&lt;/td&gt;
&lt;td&gt;1E2&lt;/td&gt;
&lt;td&gt;1F2&lt;/td&gt;
&lt;td&gt;BYTE&lt;/td&gt;
&lt;td&gt;Идентификатор системы (Boot ID), см. таблицу.3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;005&lt;/td&gt;
&lt;td&gt;1C3&lt;/td&gt;
&lt;td&gt;1D3&lt;/td&gt;
&lt;td&gt;1E3&lt;/td&gt;
&lt;td&gt;1F3&lt;/td&gt;
&lt;td&gt;BYTE&lt;/td&gt;
&lt;td&gt;Конечная головка раздела&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;006&lt;/td&gt;
&lt;td&gt;1C4&lt;/td&gt;
&lt;td&gt;1D4&lt;/td&gt;
&lt;td&gt;1E4&lt;/td&gt;
&lt;td&gt;1F4&lt;/td&gt;
&lt;td&gt;BYTE&lt;/td&gt;
&lt;td&gt;Конечный сектор раздела (биты 0-5), старшие биты конечного цилиндра (биты 6-7)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;007&lt;/td&gt;
&lt;td&gt;1C5&lt;/td&gt;
&lt;td&gt;1D5&lt;/td&gt;
&lt;td&gt;1E5&lt;/td&gt;
&lt;td&gt;1F5&lt;/td&gt;
&lt;td&gt;BYTE&lt;/td&gt;
&lt;td&gt;Младшие биты конечного цилиндра (биты 0-7)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;008&lt;/td&gt;
&lt;td&gt;1C6&lt;/td&gt;
&lt;td&gt;1D6&lt;/td&gt;
&lt;td&gt;1E6&lt;/td&gt;
&lt;td&gt;1F6&lt;/td&gt;
&lt;td&gt;DWORD&lt;/td&gt;
&lt;td&gt;Смещение раздела относительно начала таблицы разделов в секторах&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;00С&lt;/td&gt;
&lt;td&gt;1CA&lt;/td&gt;
&lt;td&gt;1DA&lt;/td&gt;
&lt;td&gt;1EA&lt;/td&gt;
&lt;td&gt;1FA&lt;/td&gt;
&lt;td&gt;DWORD&lt;/td&gt;
&lt;td&gt;Кол-во секторов раздела&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;/center&gt;

&lt;p class=&quot;small&quot; align=&quot;center&quot;&gt;&lt;b&gt;Таблица&amp;nbsp;2.&amp;nbsp;&lt;/b&gt;Формат partition.&lt;/p&gt;

&lt;center&gt;
&lt;table border=&quot;1&quot; cellpadding=&quot;4&quot; cellspacing=&quot;0&quot;&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td align=&quot;center&quot;&gt;&lt;b&gt;Boot ID&lt;/b&gt;&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;&lt;b&gt;Тип раздела&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;00h&lt;/td&gt;
&lt;td&gt;Раздел свободен&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0x01&lt;/td&gt;
&lt;td&gt;FAT12 (менее чем 32.680 секторов в томе или 16 Мбайт), CHS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0x04&lt;/td&gt;
&lt;td&gt;FAT16 (32.680...65.535 секторов или 16-33 Мбайт), CHS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;0x05&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;Расширенный раздел (extended partition), CHS&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0x06&lt;/td&gt;
&lt;td&gt;BIGDOS FAT16 раздел (33 Мбайт - 4 Гбайт), CHS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0x07&lt;/td&gt;
&lt;td&gt;NTFS-раздел, CHS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0x0B&lt;/td&gt;
&lt;td&gt;FAT32 раздел, CHS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0x0C&lt;/td&gt;
&lt;td&gt;FAT32 раздел с поддержкой расширенной BIOS INT 13h, LBA&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0x0E&lt;/td&gt;
&lt;td&gt;BIGDOS FAT16 раздел с поддержкой расширенной BIOS INT 13h, LBA&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;0x0F&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;Расширенный раздел с поддержкой расширенной BIOS int 13h, LBA&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0x42&lt;/td&gt;
&lt;td&gt;Динамический диск, LBA&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0x86&lt;/td&gt;
&lt;td&gt;Legacy FT FAT16 раздел, CHS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0x87&lt;/td&gt;
&lt;td&gt;Legacy FT NTFS раздел, CHS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0x8B&lt;/td&gt;
&lt;td&gt;Legacy FT volume formatted with FAT32, CHS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0x8C&lt;/td&gt;
&lt;td&gt;Legacy FT volume using BIOS INT 13h extensions formatted with FAT32, LBA&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;/center&gt;


&lt;p class=&quot;small&quot; align=&quot;center&quot;&gt;&lt;b&gt;Таблица&amp;nbsp;3.&amp;nbsp;&lt;/b&gt;Возможные
значения Boot&amp;nbsp;ID.&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
&lt;img src=&quot;http://www.insidepro.com/kk/065/065_2.gif&quot; alt=&quot;Основная Таблица Разделов&quot; height=&quot;124&quot; width=&quot;553&quot; border=&quot;0&quot;&gt;
&lt;/p&gt;

&lt;p class=&quot;small&quot; align=&quot;center&quot;&gt;&lt;b&gt;Рисунок&amp;nbsp;2.&amp;nbsp;&lt;/b&gt;Основная Таблица Разделов, разбивающая винчестер на четыре логических диска.&lt;/p&gt;

&lt;p&gt;Четыре раздела
partition обслуживают
до четырех логических дисков, а больше уже никак. На большее в MBR-секторе просто не хватает
места! Но ведь хорошо известно, что FDISK может разбивать винчестер хоть на 26&amp;nbsp;разделов. Как же
ему это удается? А вот как! Поимо Основной Таблицы Разделом, хранящейся в MBR, мы можем создавать любое
количество Расширенных Таблиц Разделов (Extended Partition Table), разбросанных по всему
диску (см. рис.&amp;nbsp;3):&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
&lt;img src=&quot;http://www.insidepro.com/kk/065/065_3.gif&quot; alt=&quot;Несколько Расширенных Таблиц Разделов&quot; height=&quot;67&quot; width=&quot;553&quot; border=&quot;0&quot;&gt;
&lt;/p&gt;

&lt;p class=&quot;small&quot; align=&quot;center&quot;&gt;&lt;b&gt;Рисунок&amp;nbsp;3.&lt;/b&gt;&amp;nbsp;Несколько Расширенных Таблиц Разделов, объединенных в одну цепочку, и разбивающих
винчестер на любое количество логических дисков.&lt;/p&gt;

&lt;p&gt;Если partition имеет тип 05h или 0Fh, то она указывает совсем не на начало
раздела, а на следующий MBR.
Точнее, не совсем MBR,
но нечто очень на него похожее. В нем присутствует полноценная Таблица Разделов
с четырьмя входами: partition&amp;nbsp;1,
partition&amp;nbsp;2, partition&amp;nbsp;3 и partition&amp;nbsp;4, каждая из
которых указывает либо на логический диск, либо на новый MBR. Длина такой цепочки практически
неограниченна и может превышать 26. Однако назначить буквы всем последующим
разделам уже не удаться и под Windows&amp;nbsp;9x они будут просто не видны. Windows&amp;nbsp;NT поддерживает
гибридный механизм наименования разделов&amp;nbsp;- по буквам и по именам, поэтому
ей эти ограничения не страшны.&lt;/p&gt;

&lt;p&gt;Стандартный
загрузчик позволяет запускать системы только из Основной Таблицы Разделов.
Цепочку MBR&apos;ов он не
анализирует. В своем загрузчике мы исправим этот недостаток.&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
&lt;img src=&quot;http://www.insidepro.com/kk/065/065_4.gif&quot; alt=&quot;Структурная схема типичной Расширенной Таблицы Разделов&quot; height=&quot;580&quot; width=&quot;495&quot; border=&quot;0&quot;&gt;
&lt;/p&gt;

&lt;p class=&quot;small&quot; align=&quot;center&quot;&gt;&lt;b&gt;Рисунок&amp;nbsp;4.&amp;nbsp;&lt;/b&gt;Структурная схема типичной Расширенной Таблицы Разделов.&lt;/p&gt;

&lt;h4&gt;Интерфейс INT 13h&lt;/h4&gt;

&lt;p&gt;Управлять
дисками можно как через порты ввода/вывода, так и через BIOS. Порты намного более могущественны
и интересны, однако BIOS
программируется намного проще, к тому же она поддерживает большое количество
разнокалиберных накопителей, абстрагируя нас от конструктивных особенностей
каждой конкретной модели. Поэтому мы будем действовать через нее, а точнее
через интерфейс прерывания INT&amp;nbsp;13h.&lt;/p&gt;

&lt;p&gt;Попробуем
прочитать сектор с диска в CHS-mode. Естественно,
действовать нужно из самого MBR
или из &quot;голой&quot; MS-DOS, иначе у нас ничего не
получится, ведь Windows&amp;nbsp;NT блокирует прямой доступ к
диску даже из режима &quot;Эмуляции MS-DOS&quot;!&lt;/p&gt;

&lt;p&gt;Номер функции
заносится в регистр AH.
В случае чтения он равен двум. Регистр AL отвечает за количество
обрабатываемых секторов. Поскольку мы
собираемся читать по одному сектору за раз, занесем сюда единицу. 
Регистр DH хранит номер головки, а DL&amp;nbsp;- номер привода (80h&amp;nbsp;- первый 
жесткий диск,
81h&amp;nbsp;- второй и так
далее). Пять младших битов регистра CL задают номер сектора, оставшиеся 
биты регистра CL и восемь битов регистра CH определяют номер цилиндра,
который мы хотим прочитать. Регистровая пара ES:BX
указывает на адрес буфера-приемника. Вот, собственно говоря, и все. 
После
выполнения команды INT&amp;nbsp;13h считываемые данные окажутся
в буфере, а если произойдет ошибка (например, головка споткнется о 
BAD-сектор) BIOS установит флаг переноса (carry flag) и мы будем 
вынуждены
либо повторить попытку, либо вывести грустное сообщение на экран.&lt;/p&gt;

&lt;p&gt;На
ассемблерном языке это звучит так:&lt;/p&gt;

&lt;pre class=&quot;code&quot;&gt;MOV SI, 1BEh ; на первый partition
MOV AX, CS ; настраиваем ES
MOV ES, AX
MOV BX, buf ; смещение буфера
...
read_all_partitions:
 MOV AX, 0201h ; читать 1 сектор с диска
 MOV DL, 80h ; читать с первого диска
 MOV DH, [SI+1] ; стартовый номер головки
 MOV CX, [SI+2] ; стартовый сектор с цилиндром
 INT 13h
 JC error ; ошибка чтения

 ; обрабатываем считанный boot-сектор или extended partitions
 ; ==========================================================
 ;
 CMP byte [SI], 80h
 JZ LOAD_BOOT ; это загрузочный раздел
 ; передаем на него управление

 CMP byte [SI+4], 05h
 JZ LOAD_CHS_EXT ; это Расширенная Таблица Разделов в CHS-формате

 CMP byte [SI+4], 0Fh
 JZ LOAD_LBA_EXT ; это Расширенная Таблица Разделов в LBA-формате

 ADD SI, 10h ; переходим на следующую partition
 CMP SI, 1EEh
 JNA read_all_partitions ; читаем все партиции одну за другой
...
buf rb 512 ; буфер на 512 байт
&lt;/pre&gt;
&lt;p class=&quot;small&quot; align=&quot;center&quot;&gt;&lt;b&gt;Листинг&amp;nbsp;1.&amp;nbsp;&lt;/b&gt;Код,
считывающий загрузочный сектор или Расширенную Таблицу Разделов.&lt;/p&gt;

&lt;p&gt;Запись сектора
в CHS-режиме происходит
практически точно также, только регистр AH равен не 02h,
а 03h. С LBA-режимом разобраться
намного сложнее, но мы, как настоящие хакеры, его обязательно осилим. Вот
только пива хлебнем.&lt;/p&gt;

&lt;p&gt;Чтение сектора
осуществляется функцией 42h
(AH = 42h). В регистр DL, как и прежде, заносится
номер привода, а вот регистровая пара DS:SI
указывает на адресный пакет (disk address packet),
представляющий собой продвинутую структуру следующего формата:&lt;/p&gt;

&lt;center&gt;
&lt;table border=&quot;1&quot; cellpadding=&quot;4&quot; cellspacing=&quot;0&quot;&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td align=&quot;center&quot;&gt;&lt;b&gt;Смещение&lt;/b&gt;&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;&lt;b&gt;Тип&lt;/b&gt;&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;&lt;b&gt;Назначение&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;00h&lt;/td&gt;
&lt;td&gt;BYTE&lt;/td&gt;
&lt;td&gt;Размер пакета 10h или 18h&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;01h&lt;/td&gt;
&lt;td&gt;BYTE&lt;/td&gt;
&lt;td&gt;Зарезервировано и должно быть равно нулю&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;02h&lt;/td&gt;
&lt;td&gt;WORD&lt;/td&gt;
&lt;td&gt;Сколько секторов читать&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;04h&lt;/td&gt;
&lt;td&gt;DWORD&lt;/td&gt;
&lt;td&gt;32-разрядный адрес буфера-приемника в формате seg:offs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;08h&lt;/td&gt;
&lt;td&gt;QWORD&lt;/td&gt;
&lt;td&gt;Стартовый номер сектора для чтения&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10h&lt;/td&gt;
&lt;td&gt;QWORD&lt;/td&gt;
&lt;td&gt;64-разряный плоский адрес буфера приемника (используется, только если 32-разряный адрес равен FFFF:FFFF)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;/center&gt;
&lt;p class=&quot;small&quot; align=&quot;center&quot;&gt;&lt;b&gt;Таблица&amp;nbsp;4.&amp;nbsp;&lt;/b&gt;Адресный
пакет, используемый для чтения/записи секторов в режиме LBA.&lt;/p&gt;

&lt;p class=&quot;MsoNormal&quot; style=&quot;text-indent:36.0pt&quot;&gt;Код, читающий сектор в LBA-режиме, в общем случае
выглядит так:&lt;/p&gt;

&lt;pre class=&quot;code&quot;&gt;MOV DI, 1BEh ; на первый partition
MOV AX, CS ; настраиваем...
MOV buf_seg ; ...сегмент
MOV EAX, [DI+08h] ; смещение partition относительно начала раздела
ADD EAX, EDI ; EDI должен содержать номер сектора текущего MBR
MOV [X_SEC]
...
read_all_partitions:
 MOV AH, 42h ; читать сектор в LBA-режиме
 MOV DL, 80h ; читать с первого диска
 MOV SI, dap ; смещение адресного пакета
 INT 13h
 JC error ; ошибка чтения

...
dap:
packet_size db 10h ; размер пакета 10h байт
reserved db 00h ; заначка для будущих расширений
N_SEC dw 01h ; читаем один сектор
buf_seg dw 00h ; сюда будет занесен сегмент буфера-приемника
buf_off dw buf ; смещение буфера-приемника
X_SEC dd 0 ; сюда будет занесен номер сектора для чтения
 dd 0 ; реально неиспользуемый хвост 64-битного адреса

buf rb 512 ; буфер на 512 байт
&lt;/pre&gt;

&lt;p class=&quot;small&quot; align=&quot;center&quot;&gt;&lt;b&gt;Листинг&amp;nbsp;2.&amp;nbsp;&lt;/b&gt;Чтение
сектора с диска в LBA-режиме.&lt;/p&gt;

&lt;p&gt;Запись
осуществляется аналогично, только регистр AH содержит не 42h,
а 43h. Регистр AL определяет режим: если
бит&amp;nbsp;0 равен 1, BIOS
выполняет не запись, а ее эмуляцию. Бит&amp;nbsp;2, будучи взведенным, задействует
запись с проверкой. Если AL
равен 0, выполняется обыкновенная запись по умолчанию.&lt;/p&gt;

&lt;p&gt;Теперь,
освоившись с дисковыми прерываниями, перейдем к обсуждению остальных аспектов
программирования.&lt;/p&gt;

&lt;h4&gt;Как программируют загрузчики&lt;/h4&gt;

&lt;p&gt;Лучше всего
загрузчики программируются на FASM.
С точки зрения ассемблера загрузчик представляет собой обыкновенный двоичный
файл, предельно допустимый объем которого составляет 1BBh (443) байт. Немного? Но не будет
спешить с выводами. Всякий раздел всегда начинается с начала цилиндра, а это
значит, что между концом MBR
и началом раздела имеется, по меньшей мере, sector per track свободных секторов. Практически все современные винчестеры
имеют по 64&amp;nbsp;секторов в треке, что дает нам: 443&amp;nbsp;+&amp;nbsp;63 * 512&amp;nbsp;=&amp;nbsp;32.699&amp;nbsp;байт или ~32&amp;nbsp;Кбайт. Да в этот объем
даже графический интерфейс с мышью и голой красавицей на обоях уместить можно.
Но мы не будем! Настоящие хакеры работают в текстовом режиме с командной
строкой, а красавиц лучше иметь, чем смотреть.&lt;/p&gt;

&lt;p&gt;Как уже
говорилось, BIOS
загружает MBR по адресу
7C00h, поэтому в начале ассемблерного кода
должна стоять директива ORG&amp;nbsp;7C00h, а еще USE16&amp;nbsp;- ведь загрузчик выполняется
в 16-разряном реальном режиме. Позже, при желании он может перейти в защищенный
режим, но это будет уже потом. Не будет лезть в такие дебри.&lt;/p&gt;

&lt;p&gt;Обнаружив
загрузочный раздел (а обнаружить это можно по флагу 80h, находящемуся по
 смещению от начала partition), загрузчик должен
считать первый сектор этого раздела, разместив его в памяти по адресу 
0000:7C000h, то есть аккурат поверх своего тела. А
вот это уже нехорошо! И чтобы не вызвать крах системы, загрузчик должен
заблаговременно перенести свою тушу в другое место, что обычно 
осуществляется
командой MOVSB.
Копироваться можно в любое место памяти&amp;nbsp;- от 0080:0067h до 9FE00h. 
Память, расположенную ниже 0080:0067h лучше не трогать, т.к.
здесь находятся вектора прерываний и системные переменные BIOS&apos;а, а от 
A000h и выше начинается область отображения ПЗУ, так что предельно
доступный адрес равен A000h&amp;nbsp;-&amp;nbsp;200h&amp;nbsp;(размер
сектора)&amp;nbsp;=&amp;nbsp;9FE00h.&lt;/p&gt;

&lt;p&gt;Что еще? Ах
да! Трогать DL-регистр
ни в коем случае нельзя, поскольку в нем передается номер загрузочного привода.
Некоторые загрузчики содержат ошибку, всегда загружаясь с первого жесткого
диска. Стыдно не знать, что BIOS
уже лет десять как позволяют менять порядок загрузки и потому загрузочным может
быть любой привод.&lt;/p&gt;

&lt;p&gt;Кстати говоря,
FASM&amp;nbsp;-
единственный известный мне ассемблер, &quot;переваривающий&quot; команду
дальнего вызова JMP&amp;nbsp;0000:7C000h напрямую. Все остальные ассемблеры
заставляют извращаться приблизительно так: PUSH&amp;nbsp;offset_of_target/PUSH&amp;nbsp;segment_of_target/RETF.
Здесь мы заталкиваем в стек сегмент и смещение целевого адреса и выполняем
далекий RETF,
переносящий нас на нужное место. Еще можно воспользоваться самомодифицирующимся
кодом, собрав команду JMP&amp;nbsp;FAR
&quot;вручную&quot; или просто расположить целевой адрес в одном сегменте с
исходным адресом (например, 0000:7C000h
-&amp;gt; 0000:7E000h), но это все муторно и
утомительно.&lt;/p&gt;

&lt;p&gt;В общем,
скелет нашего загрузчика будет выглядеть так:&lt;/p&gt;

&lt;pre class=&quot;code&quot;&gt;use16
ORG 7С00h
CLD ; копируем слева направо (в сторону увеличения адресов)
MOV SI,7C00h ; откуда копировать
MOV DI,7E00h ; куда копировать
MOV CX,200h ; длина сектора
REP MOVSB ; копируем

; выбираем раздел, который мы хотим загрузить,
; считываем его в память по адресу 0000:7C000h
; см. листинги 1, 2

JMP 0000:7C000h ; передаем управление на boot-сектор
&lt;/pre&gt;
&lt;p class=&quot;small&quot; align=&quot;center&quot;&gt;&lt;b&gt;Листинг&amp;nbsp;3.&amp;nbsp;&lt;/b&gt;Скелет
простейшего загрузчика на FASM&apos;е.&lt;/p&gt;

&lt;h4&gt;Инсталляция нашего загрузчика в MBR&lt;/h4&gt;

&lt;p&gt;Под старушкой MS-DOS записать свой загрузчик в MBR было просто&amp;nbsp;-
достаточно дернуть прерывание INT&amp;nbsp;13h, функцию 03h (запись сектора). Но под Windows&amp;nbsp;NT этот прием
уже не работает и приходится прибегать к услугам функции CreateFile. Если вместо имени
открываемого фала указать название устройства, например,
&quot;&amp;#92;&amp;#92;.&amp;#92;PHYSICALDRIVE0&quot; (первый физический диск), мы сможем свободно
читать и записывать его сектора вызовами ReadFile и WriteFile,
соответственно. При этом флаг dwCreationDisposition
должен быть установлен в значение OPEN_EXISTING, а dwShareMode&amp;nbsp;- в
значение FILE_SHARE_WRITE. Еще потребуются права root&apos;а или в терминологии Windows&amp;nbsp;-
администратора, иначе ничего не получится.&lt;/p&gt;

&lt;p&gt;Законченный
пример вызова CreateFile
выглядит так:&lt;/p&gt;

&lt;pre class=&quot;code&quot;&gt;XOR EAX,EAX
PUSH EAX ; hTemplateFile
PUSH dword FILE_ATTRIBUTE_NORMAL ; dwFlagsAndAttributes
PUSH dword OPEN_EXISTING ; dwCreationDisposition
PUSH EAX ; lpSecurityAttributes
PUSH dword FILE_SHARE_WRITE ; dwShareMode
PUSH dword (GENERIC_WRITE OR GENERIC_READ) ; dwDesiredAccess
PUSH DEVICE_NAME ; имя устройства
CALL CreateFile ; открываем устройство
INC EAX
TEST EAX,EAX
JZ error
DEC EAX
...
DEVICE_NAME DB &quot;&amp;#92;&amp;#92;.&amp;#92;PHYSICALDRIVE0&quot;,0
BUF RB 512 ; буфер
&lt;/pre&gt;
&lt;p class=&quot;small&quot; align=&quot;center&quot;&gt;&lt;b&gt;Листинг&amp;nbsp;4.&amp;nbsp;&lt;/b&gt;Открытие
непосредственного доступа к жесткому диску под Windows&amp;nbsp;NT.&lt;/p&gt;

&lt;p&gt;Открыв
физический диск и убедившись в успешности этой операции, мы должны прочитать
оригинальный MBR-сектор
в буфер, перезаписать первые 1BBh
байт, ни в коем случае не трогая Таблицу Разделов и сигнатуру 55h&amp;nbsp;AAh (мы ведь не хотим,
чтобы диск перестал загружаться, верно?). Остается записать обновленный MBR на место и закрыть
дескриптор устройства. Все! После перезагрузки все изменения вступят в силу, а
может быть и не вступят... Загрузчик жестоко мстит за малейшие ошибки
проектирования и чтобы не потерять содержимое своих разделов, для начала лучше
попрактиковаться на VM&amp;nbsp;Ware
или любом другом эмуляторе PC.&lt;/p&gt;

&lt;p&gt;Под Windows&amp;nbsp;9x, кстати говоря, трюк с CreateFile не работает. Но там
можно воспользоваться симуляцией прерываний из DMPI или обратится к ASPI-драйверу. Оба способа подробно
описаны в моей книге &quot;Техника защиты компакт-дисков от копирования&quot;.
И хотя в ней речь идет о CD,
а не о HDD, жесткие
диски программируются аналогичным способом.&lt;/p&gt;

&lt;h4&gt;Отладка загрузчика&lt;/h4&gt;

&lt;p&gt;Отлаживать код
загрузчиков невероятно трудно. Загрузчик получает управление задолго до запуска
операционной системы, когда никакие отладчики еще не работают. Несколько лет
назад это представляло огромную проблему и при разработке навороченных
загрузчиков приходилось либо встраивать в них интегрированный мини-отладчик,
либо выискивать ошибки руками, головой и карандашом. С появлением эмуляторов
все изменилось. Достаточно запустить BOCHS и отлаживать загрузчик, как и любую другую программу!&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
&lt;img src=&quot;http://www.insidepro.com/kk/065/065_5.gif&quot; alt=&quot;Внешний вид эмулятора BOCHS&quot; height=&quot;409&quot; width=&quot;554&quot; border=&quot;0&quot;&gt;
&lt;/p&gt;

&lt;p class=&quot;small&quot; align=&quot;center&quot;&gt;&lt;b&gt;Рисунок&amp;nbsp;5.&lt;/b&gt;&amp;nbsp;Внешний вид эмулятора BOCHS,
отлаживающего загрузочный сектор.&lt;/p&gt;

&lt;h4&gt;Заключение&lt;/h4&gt;

&lt;p&gt;Программирование
загрузчиков&amp;nbsp;- одна из тех немногих областей, в которых применение
ассемблера действительно оправдано. Языки высокого уровня для этого слишком
абстрагированы от оборудования и недостаточно гибки. Вот почему хакеры так
любят возиться с загрузчиками, добавляя сюда множество новых фич - таких,
например, как автоматическая загрузка с CD-ROM
или SCSI-винтов,
противодействие вирусам, парольная защита с шифрованием данных и т.д. Здесь
действительно есть, где развернуться и показать себя. Но читать о новых идеях
скучно и неинтересно. Намного приятнее генерировать их самостоятельно. Так чего
же мы сидим?!&lt;/p&gt;

&lt;h4&gt;Интересные ссылки&lt;/h4&gt;

&lt;ul&gt;&lt;li&gt;&lt;b&gt;MBR and OS Boot Records:&lt;/b&gt;
&lt;br&gt;Масса интересного материала по MBR (на английском языке): &lt;u&gt;http://thestarman.narod.ru/asm/mbr/MBR_in_detail.htm&lt;/u&gt;;
&lt;br&gt;&lt;br&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;BOCHS:&lt;/b&gt;
&lt;br&gt;Отличный эмулятор со встроенным отладчиком, значительно облегчающий 
процесс &quot;пуско-наладки&quot; загрузочных секторов, бесплатен, 
распространяется с исходными текстами: &lt;u&gt;http://bochs.sourceforge.net&lt;/u&gt;;
&lt;br&gt;&lt;br&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;www.koders.com:&lt;/b&gt;
&lt;br&gt;Отличный поисковик, нацеленный на поиск исходных кодов, по ключевому
 слову &quot;MBR&quot; выдает огромное количество загрузчиков на любой вкус;
&lt;br&gt;&lt;br&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;Ralf Brown Interrupt List:&lt;/b&gt;
&lt;br&gt;Знаменитый Interrupt List Ральфа Брауна, описывающий все прерывания, включая недокументированные (на английском языке): &lt;u&gt;http://www.pobox.com/~ralf&lt;/u&gt;;
&lt;br&gt;&lt;br&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;OpenBIOS:&lt;/b&gt;
&lt;br&gt;Проект &quot;Открытого BIOS&quot;, распространяемого в исходных текстах; 
помогает понять некоторые неочевидные моменты обработки системного 
загрузчика: &lt;u&gt;http://www.openbios.info/docs/index.html&lt;/u&gt;;
&lt;/li&gt;&lt;/ul&gt;

&lt;p align=&quot;center&quot;&gt;
&lt;img src=&quot;http://www.insidepro.com/kk/065/065_6.gif&quot; alt=&quot;Поиск исходных текстов&quot; height=&quot;559&quot; width=&quot;553&quot; border=&quot;0&quot;&gt;
&lt;/p&gt;

&lt;p class=&quot;small&quot; align=&quot;center&quot;&gt;&lt;b&gt;Рисунок&amp;nbsp;6.&amp;nbsp;&lt;/b&gt;Поиск исходных текстов MBR-загрузчиков на koders&apos;e.&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
&lt;img src=&quot;http://www.insidepro.com/kk/065/065_7.gif&quot; alt=&quot;Просматриваем легендарный Interrupt List Ральфа Брауна&quot; height=&quot;328&quot; width=&quot;553&quot; border=&quot;0&quot;&gt;
&lt;/p&gt;

&lt;p class=&quot;small&quot; align=&quot;center&quot;&gt;&lt;b&gt;Рисунок&amp;nbsp;7.&lt;/b&gt;&amp;nbsp;Просматриваем легендарный Interrupt List Ральфа Брауна.&lt;/p&gt;&lt;br&gt;</content:encoded>
			<link>https://programmist-bav.at.ua/news/2012-03-30-49</link>
			<dc:creator>Turbokherson</dc:creator>
			<guid>https://programmist-bav.at.ua/news/2012-03-30-49</guid>
			<pubDate>Fri, 30 Mar 2012 05:34:35 GMT</pubDate>
		</item>
		<item>
			<title>Пишем свой загрузочный сектор в Ассемблере</title>
			<description>&lt;div align=&quot;center&quot;&gt;Оглавление
 
 &lt;div class=&quot;contenttoc&quot;&gt;
 &lt;p&gt;1. 
 &lt;a href=&quot;http://www.cyberguru.ru/programming/assembler/assembler-boot-sector.html&quot; class=&quot;toclink&quot;&gt;Пишем свой загрузочный сектор
 &lt;/a&gt;
 &lt;/p&gt;
 
 &lt;p&gt;2. 
 &lt;a href=&quot;http://www.cyberguru.ru/programming/assembler/assembler-boot-sector-page2.html&quot; class=&quot;toclink&quot;&gt;Загрузка файла в память&lt;/a&gt;&lt;/p&gt;
 
 &lt;p&gt;3. 
 &lt;a href=&quot;http://www.cyberguru.ru/programming/assembler/assembler-boot-sector-page3.html&quot; class=&quot;toclink&quot;&gt;Процедура загрузки секторов&lt;/a&gt;&lt;/p&gt;
 
 &lt;p&gt;&lt;strong&gt;4. 
 &lt;a href=&quot;http://www.cyberguru.ru/programming/assembler/assembler-boot-sector-page4.html&quot; class=&quot;toclink&quot;&gt;Компиляция&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
 &lt;/div&gt;&lt;/div&gt;&lt;br&gt;Мы будем писать загрузочный сектор для трехдюймовой дискеты с файловой 
системой FAT12. После окончания начальной загрузки программа POST 
находит активное устройство и загружает с него короткую программу 
загрузки ОС - загрузочный сектор. Загрузочный сектор это первый 
физический сектор устройства, в данном случае диске...</description>
			<content:encoded>&lt;div align=&quot;center&quot;&gt;Оглавление
 
 &lt;div class=&quot;contenttoc&quot;&gt;
 &lt;p&gt;1. 
 &lt;a href=&quot;http://www.cyberguru.ru/programming/assembler/assembler-boot-sector.html&quot; class=&quot;toclink&quot;&gt;Пишем свой загрузочный сектор
 &lt;/a&gt;
 &lt;/p&gt;
 
 &lt;p&gt;2. 
 &lt;a href=&quot;http://www.cyberguru.ru/programming/assembler/assembler-boot-sector-page2.html&quot; class=&quot;toclink&quot;&gt;Загрузка файла в память&lt;/a&gt;&lt;/p&gt;
 
 &lt;p&gt;3. 
 &lt;a href=&quot;http://www.cyberguru.ru/programming/assembler/assembler-boot-sector-page3.html&quot; class=&quot;toclink&quot;&gt;Процедура загрузки секторов&lt;/a&gt;&lt;/p&gt;
 
 &lt;p&gt;&lt;strong&gt;4. 
 &lt;a href=&quot;http://www.cyberguru.ru/programming/assembler/assembler-boot-sector-page4.html&quot; class=&quot;toclink&quot;&gt;Компиляция&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
 &lt;/div&gt;&lt;/div&gt;&lt;br&gt;Мы будем писать загрузочный сектор для трехдюймовой дискеты с файловой 
системой FAT12. После окончания начальной загрузки программа POST 
находит активное устройство и загружает с него короткую программу 
загрузки ОС - загрузочный сектор. Загрузочный сектор это первый 
физический сектор устройства, в данном случае дискеты и его размет равен
 всего ничего 512 байт. С помощью этих 512 байт кода мы должны найти 
основную часть загрузчика операционной системы, загрузить его в память и
 передать ему управление. Заголовок файловой системы FAT находится в 
первом секторе дискеты, благодаря чему этот заголовок, содержащий всю 
необходимую информацию о файловой системе, загружается вместе нашим 
загрузчиком.

&lt;p align=&quot;justify&quot;&gt;Наш загрузочный сектор будет искать в корневом 
каталоге некоторый файл - загрузчик, загрузит его в память и передаст 
ему управление на его начало. А загрузчик уже сам разберется, что ему 
делать дальше. Я использую NASM, т.к. считаю, что он больше подходит для
 наших целей.&lt;/p&gt; &lt;p align=&quot;justify&quot;&gt;И так, приступим. Как я уже говорил, в начале нашего загрузочного сектора располагается заголовок FAT, опишем его: &lt;/p&gt;&lt;pre&gt;; Общая часть для всех типов FAT&lt;br&gt; BS_jmpBoot:&lt;br&gt; jmp short BootStart ; Переходим на код загрузчика&lt;br&gt; nop&lt;br&gt; BS_OEMName db &apos;*-v4VIHC&apos; ; 8 байт, что было на моей дискете, то и написал&lt;br&gt; BPB_BytsPerSec dw 0x200 ; Байт на сектор&lt;br&gt; BPB_SecPerClus db 1 ; Секторов на кластер&lt;br&gt; BPB_RsvdSecCnt dw 1 ; Число резервных секторов&lt;br&gt; BPB_NumFATs db 2 ; Количектво копий FAT&lt;br&gt; BPB_RootEntCnt dw 224 ; Элементов в корневом катологе (max)&lt;br&gt; BPB_TotSec16 dw 2880 ; Всего секторов или 0&lt;br&gt; BPB_Media db 0xF0 ; код типа устройства&lt;br&gt; BPB_FATsz16 dw 9 ; Секторов на элемент таблицы FAT&lt;br&gt; BPB_SecPerTrk dw 18 ; Секторов на дорожку&lt;br&gt; BPB_NumHeads dw 2 ; Число головок&lt;br&gt; BPB_HiddSec dd 0 ; Скрытых секторов&lt;br&gt; BPB_TotSec32 dd 0 ; Всего секторов или 0&lt;br&gt; ; Заголовок для FAT12 и FAT16&lt;br&gt; BS_DrvNum db 0 ; Номер дика для прерывания int 0x13&lt;br&gt; BS_ResNT db 0 ; Зарезервировано для Windows NT&lt;br&gt; BS_BootSig db 29h ; Сигнатура расширения&lt;br&gt; BS_VolID dd 2a876CE1h ; Серийный номер тома&lt;br&gt; BS_VolLab db &apos;X boot disk&apos; ; 11 байт, метка тома&lt;br&gt; BS_FilSysType db &apos;FAT12&amp;nbsp;&amp;nbsp; &apos; ; 8 байт, тип ФС&lt;br&gt; ; Структура элемента каталога&lt;br&gt; struc DirItem&lt;br&gt; DIR_Name: resb 11&lt;br&gt; DIR_Attr: resb 1&lt;br&gt; DIR_ResNT: resb 1&lt;br&gt; DIR_CrtTimeTenth resb 1&lt;br&gt; DIR_CrtTime: resw 1&lt;br&gt; DIR_CrtDate: resw 1&lt;br&gt; DIR_LstAccDate: resw 1&lt;br&gt; DIR_FstClusHi: resw 1&lt;br&gt; DIR_WrtTime: resw 1&lt;br&gt; DIR_WrtDate: resw 1&lt;br&gt; DIR_FstClusLow: resw 1&lt;br&gt; DIR_FileSize: resd 1&lt;br&gt; endstruc ;DirItem&lt;br&gt; &lt;/pre&gt; &lt;p align=&quot;justify&quot;&gt;Большинство
 полей мы использовать не будем, и так мало места для полета. Загрузчик 
BIOS передает нам управление на начало загрузочного сектора, т.е. на 
BS_jmpBoot, поэтому в начале заголовка FAT на отводится 3 байта для 
короткой или длинной инструкции jmp. Мы в данном случае использовали 
короткую, указав модификатор short, и в третьем байте просто разместили 
однобайтовую инструкцию nop.&lt;/p&gt; &lt;p align=&quot;justify&quot;&gt;По инструкции jmp short BootStart мы переходим на наш код. Проведем небольшую инициализацию: &lt;/p&gt;&lt;pre&gt;; Наши не инициализированные переменные&lt;br&gt; ; При инициализации они затрут не нужные нам&lt;br&gt; ; поля заголовка FAT: BS_jmpBoot и BS_OEMName&lt;br&gt; struc NotInitData&lt;br&gt; SysSize: resd 1 ; Размер системной области FAT&lt;br&gt; fails: resd 1 ; Число неудачных попыток при чтении&lt;br&gt; fat: resd 1 ; Номер загруженного сектора с элементами FAT&lt;br&gt; endstruc ;NotInitData&lt;br&gt; ; По этому адресу мы будем загружать загрузчик&lt;br&gt; %define SETUP_ADDR 0x1000&lt;br&gt; ; А по этому адресу нас должны были загрузить&lt;br&gt; %define BOOT_ADDR 0x7C00&lt;br&gt; %define BUF 0x500&lt;br&gt; BootStart:&lt;br&gt; cld&lt;br&gt; xor cx, cx&lt;br&gt; mov ss, cx&lt;br&gt; mov es, cx&lt;br&gt; mov ds, cx&lt;br&gt; mov sp, BOOT_ADDR&lt;br&gt; mov bp, sp&lt;br&gt; ; Сообщим о том что мы загружаемся&lt;br&gt; mov si, BOOT_ADDR + mLoading&lt;br&gt; call print&lt;br&gt; &lt;/pre&gt; &lt;p align=&quot;justify&quot;&gt;Все
 сегментные регистры настраиваем на начало физической памяти. Вершину 
стека настраиваем на начало нашего сектора, стек растет вниз (т.е. в 
сторону младших адресов), так что проблем быть не должно. Туда же 
указывает регистр bp - нам нужно обращаться к полям заголовка FAT и паре
 наших переменных. Мы используем базовую адресацию со смещением, для 
чего используем регистр bp т.к. в этом случае можно использовать 
однобайтовые смещения, вместо двухбайтовых адресов, что позволяет 
сократить код. Процедуру print, выводящую сообщение на экран, рассмотрим
 позже.&lt;/p&gt; &lt;p align=&quot;justify&quot;&gt;Теперь нам нужно вычислить номера первых секторов корневого каталога и данных файлов. &lt;/p&gt;&lt;pre&gt; mov al, [byte bp+BPB_NumFATs]&lt;br&gt; cbw&lt;br&gt; mul word [byte bp+BPB_FATsz16]&lt;br&gt; add ax, [byte bp+BPB_HiddSec]&lt;br&gt; adc dx, [byte bp+BPB_HiddSec+2]&lt;br&gt; add ax, [byte bp+BPB_RsvdSecCnt]&lt;br&gt; adc dx, cx&lt;br&gt; mov si, [byte bp+BPB_RootEntCnt]&lt;br&gt; ; dx:ax - Номер первого сектора корневого каталога&lt;br&gt; ; si - Количество элементов в корневом каталоге&lt;br&gt; pusha&lt;br&gt; ; Вычислим размер системной области FAT = резервные сектора +&lt;br&gt; ; все копии FAT + корневой каталог&lt;br&gt; mov [bp+SysSize], ax ; осталось добавить размер каталога&lt;br&gt; mov [bp+SysSize+2], dx&lt;br&gt; ; Вычислим размер корневого каталога&lt;br&gt; mov ax, 32&lt;br&gt; mul si&lt;br&gt; ; dx:ax - размер корневого каталога в байтах, а надо в секторах&lt;br&gt; mov bx, [byte bp+BPB_BytsPerSec]&lt;br&gt; add ax, bx&lt;br&gt; dec ax&lt;br&gt; div bx&lt;br&gt; ; ax - размер корневого каталога в секторах&lt;br&gt; add [bp+SysSize], ax ; Теперь мы знаем размер системной&lt;br&gt; adc [bp+SysSize+2], cx ; области FAT, и начало области данных&lt;br&gt; popa&lt;br&gt; ; В dx:ax - снова номер первого сектора корневого каталога&lt;br&gt; ; si - количество элементов в корневом каталоге&lt;/pre&gt; &lt;p align=&quot;justify&quot;&gt;Теперь мы будем просматривать корневой каталог в поисках нужного нам файла &lt;/p&gt;&lt;pre&gt;NextDirSector:&lt;br&gt; ; Загрузим очередной сектор каталога во временный буфер&lt;br&gt; mov bx, 700h ; es:bx - буфер для считываемого сектора&lt;br&gt; mov di, bx ; указатель текущего элемента каталога&lt;br&gt; mov cx, 1 ; количество секторов для чтения&lt;br&gt; call ReadSectors&lt;br&gt; jc near DiskError ; ошибка при чтении&lt;br&gt; RootDirLoop:&lt;br&gt; ; Ищем наш файл&lt;br&gt; ; cx = 0 после функции ReadSectors&lt;br&gt; cmp [di], ch ; byte ptr [di] = 0?&lt;br&gt; jz near NotFound ; Да, это последний элемент в каталоге&lt;br&gt; ; Нет, не последний, сравним имя файла&lt;br&gt; pusha&lt;br&gt; mov cl, 11 ; длина имени файла с расширением&lt;br&gt; mov si, BOOT_ADDR + LoaderName ; указатель на имя искомого файла&lt;br&gt; rep cmpsb ; сравниваем&lt;br&gt; popa&lt;br&gt; jz short Found ; Нашли, выходим из цикла&lt;br&gt; ; Нет, ищем дальше&lt;br&gt; dec si ; RootEntCnt&lt;br&gt; jz near NotFound ; Это был последний элемент каталога&lt;br&gt; add di, 32 ; Переходим к следующему элементу каталога&lt;br&gt; ; bx указывает на конец прочтенного сектора после call ReadSectors&lt;br&gt; cmp di, bx ; Последний элемент в буфере?&lt;br&gt; jb short RootDirLoop ; Нет, проверим следующий элемент&lt;br&gt; jmp short NextDirSector ; Да последний, загрузим следующий сектор&lt;br&gt;&lt;/pre&gt; &lt;p align=&quot;justify&quot;&gt;Из этого кода мы можем выйти одну из трех точек: ошибка при чтении DiskError, файл наден Found или файл не найден NotFound.&lt;/p&gt;&lt;p align=&quot;justify&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;h2&gt;Загрузка файла в память&amp;nbsp;&lt;/h2&gt; &lt;p align=&quot;justify&quot;&gt;Если файл найден, то загрузим его в память и передадим управление на его начало. &lt;/p&gt;&lt;pre&gt;Found:&lt;br&gt; ; Загрузка загрузчика (извените, калабур)&lt;br&gt; mov bx, SETUP_ADDR&lt;br&gt; mov ax, [byte di+DIR_FstClusLow] ; Номер первого кластера файла&lt;br&gt; ; Загружаем сектор с элемнтами FAT, среди которых есть FAT[ax]&lt;br&gt; ; LoadFAT сохраняет значения всех регистров&lt;br&gt; call LoadFAT&lt;br&gt; ReadCluster:&lt;br&gt; ; ax - Номер очередного кластера&lt;br&gt; ; Загрузим его в память&lt;br&gt; push ax&lt;br&gt; ; Первые два элемента FAT служебные&lt;br&gt; dec ax&lt;br&gt; dec ax&lt;br&gt; ; Число секторов для чтения&lt;br&gt; ; cx = 0 после ReadSectors&lt;br&gt; mov cl, [byte bp+BPB_SecPerClus] ; Секторов на кластер&lt;br&gt; mul cx&lt;br&gt; ; dx:ax - Смещение кластера относительно области данных&lt;br&gt; add ax, [byte bp+SysSize]&lt;br&gt; adc dx, [byte bp+SysSize+2]&lt;br&gt; ; dx:ax - Номер первого сектора требуемого кластера&lt;br&gt; ; cx еще хранит количество секторов на кластер&lt;br&gt; ; es:bx - конец прошлого кластера и начало нового&lt;br&gt; call ReadSectors ; читаем кластер&lt;br&gt; jc near DiskError ; Увы, ошибка чтения&lt;br&gt; pop ax ; Номер кластера&lt;br&gt; ; Это конец файла?&lt;br&gt; ; Получим значение следующего элемента FAT&lt;br&gt; pusha&lt;br&gt; ; Вычислим адрес элемента FAT&lt;br&gt; mov bx, ax&lt;br&gt; shl ax, 1&lt;br&gt; add ax, bx&lt;br&gt; shr ax, 1&lt;br&gt; ; Получим номер сектора, в котором находится текущий элемент FAT&lt;br&gt; cwd&lt;br&gt; div word [byte bp+BPB_BytsPerSec]&lt;br&gt; cmp ax, [bp+fat] ; Мы уже читали этот сектор?&lt;br&gt; popa&lt;br&gt; je Checked ; Да, читали&lt;br&gt; ; Нет, надо загрузить этот сектор&lt;br&gt; call LoadFAT&lt;br&gt; Checked:&lt;br&gt; ; Вычислим адрес элемента FAT в буфере&lt;br&gt; push bx&lt;br&gt; mov bx, ax&lt;br&gt; shl bx, 1&lt;br&gt; add bx, ax&lt;br&gt; shr bx, 1&lt;br&gt; and bx, 511 ; остаток от деления на 512&lt;br&gt; mov bx, [bx+0x700] ; а вот и адрес&lt;br&gt; ; Извлечем следующий элемент FAT&lt;br&gt; ; В FAT16 и FAT32 все немного проще :(&lt;br&gt; test al, 1&lt;br&gt; jnz odd&lt;br&gt; and bx, 0xFFF&lt;br&gt; jmp short done&lt;br&gt; odd:&lt;br&gt; shr bx, 4&lt;br&gt; done:&lt;br&gt; mov ax, bx&lt;br&gt; pop bx&lt;br&gt; ; bx - новый элемент FAT&lt;br&gt; cmp ax, 0xFF8 ; EOF - конец файла?&lt;br&gt; jb ReadCluster ; Нет, читаем следующий кластер&lt;br&gt; ; Наконец-то загрузили&lt;br&gt; mov ax, SETUP_ADDR&amp;gt;&amp;gt;4 ; SETUP_SEG&lt;br&gt; mov es, ax&lt;br&gt; mov ds, ax&lt;br&gt; ; Передаем управление, наше дело сделано :)&lt;br&gt; jmp SETUP_ADDR&amp;gt;&amp;gt;4:0&lt;br&gt; &lt;br&gt; LoadFAT ;proc&lt;br&gt; ; Процедура для загрузки сектора с элементами FAT&lt;br&gt; ; Элемент ax должен находится в этом секторе&lt;br&gt; ; Процедура не должна менять никаких регистров&lt;br&gt; pusha&lt;br&gt; ; Вычисляем адрес слова содержащего нужный элемент&lt;br&gt; mov bx, ax&lt;br&gt; shl ax, 1&lt;br&gt; add ax, bx&lt;br&gt; shr ax, 1&lt;br&gt; cwd&lt;br&gt; div word [byte bp+BPB_BytsPerSec]&lt;br&gt; ; ax - смещение сектора относительно начала таблицы FAT&lt;br&gt; mov [bp+fat], ax ; Запомним это смещение, dx = 0&lt;br&gt; cwd ; dx:ax - номер сектора, содержащего FAT[?]&lt;br&gt; ; Добавим смещение к первой копии таблицы FAT&lt;br&gt; add ax, [byte bp+BPB_RsvdSecCnt]&lt;br&gt; adc dx, 0&lt;br&gt; add ax, [byte bp+BPB_HiddSec]&lt;br&gt; adc dx, [byte bp+BPB_HiddSec+2]&lt;br&gt; mov cx, 1 ; Читаем один сектор. Можно было бы и больше, но не быстрее&lt;br&gt; mov bx, 700h ; Адрес буфера&lt;br&gt; call ReadSectors&lt;br&gt; jc DiskError ; Ошибочка вышла&lt;br&gt; popa&lt;br&gt; ret&lt;br&gt; ;LoadFAT endp&lt;/pre&gt; &lt;p align=&quot;justify&quot;&gt;В
 FAT12 на каждый элемент FAT отводится по 12 бит, что несколько 
усложняет нашу работу, в FAT16 и FAT32 на каждый элемент отводится по 16
 и 32 бита соответственно и можно просто прочесть слово или двойное 
слово, а в FAT12 необходимо прочесть слово содержащее элемент FAT и &lt;em&gt;правильно&lt;/em&gt; извлечь из него 12 бит.&lt;/p&gt;&lt;p align=&quot;justify&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;h2&gt;Процедура загрузки секторов &lt;br&gt;&lt;/h2&gt; &lt;p align=&quot;justify&quot;&gt;Теперь 
разберем процедуру загрузки секторов. Процедура получает номер сектора в
 dx:ax (нумерация с нуля) и преобразует его к формату CSH (цилиндр, 
сектор, сторона), используемому прерыванием BIOS int 0x13. &lt;/p&gt;&lt;pre&gt;&lt;&amp;gt;; *************************************************&lt;/pre&gt;&lt;pre&gt; ; *&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Чтение секторов с диска&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *&lt;/pre&gt;&lt;pre&gt; ; *************************************************&lt;/pre&gt;&lt;pre&gt; ; * Входные параметры:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *&lt;/pre&gt;&lt;pre&gt; ; * dx:ax&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; - (LBA) номер сектора&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *&lt;/pre&gt;&lt;pre&gt; ; * cx&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; - количество секторов для чтения&amp;nbsp; *&lt;/pre&gt;&lt;pre&gt; ; * es:bx&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; - адрес буфера&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *&lt;/pre&gt;&lt;pre&gt; ; *************************************************&lt;/pre&gt;&lt;pre&gt; ; * Выходные параметры:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *&lt;/pre&gt;&lt;pre&gt; ; * cx&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; - Количество не прочтенных секторов&amp;nbsp; *&lt;/pre&gt;&lt;pre&gt; ; * es:bx&amp;nbsp;&amp;nbsp;&amp;nbsp; - Указывает на конец буфера&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *&lt;/pre&gt;&lt;pre&gt; ; * cf = 1&amp;nbsp;&amp;nbsp; - Произошла ошибка при чтении&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *&lt;/pre&gt;&lt;pre&gt; ; *************************************************&lt;/pre&gt;&lt;pre&gt; ReadSectors ;proc&lt;/pre&gt;&lt;pre&gt; next_sector:&lt;/pre&gt;&lt;pre&gt; ; Читаем очередной сектор&lt;/pre&gt;&lt;pre&gt; mov byte [bp+fails], 3 ; Количество попыток прочесть сектор&lt;/pre&gt;&lt;pre&gt; try:&lt;/pre&gt;&lt;pre&gt; ; Очередная попытка&lt;/pre&gt;&lt;pre&gt; pusha&lt;/pre&gt;&lt;pre&gt; ; Преобразуем линейный адрес в CSH&lt;/pre&gt;&lt;pre&gt; ; dx:ax = a1:a0&lt;/pre&gt;&lt;pre&gt; xchg ax, cx ; cx = a0&lt;/pre&gt;&lt;pre&gt; mov ax, [byte bp+BPB_SecPerTrk]&lt;/pre&gt;&lt;pre&gt; xchg ax, si ; si = Scnt&lt;/pre&gt;&lt;pre&gt; xchg ax, dx ; ax = a1&lt;/pre&gt;&lt;pre&gt; xor dx, dx&lt;/pre&gt;&lt;pre&gt; ; dx:ax = 0:a1&lt;/pre&gt;&lt;pre&gt; div si ; ax = q1, dx = c1&lt;/pre&gt;&lt;pre&gt; xchg ax, cx ; cx = q1, ax = a0&lt;/pre&gt;&lt;pre&gt; ; dx:ax = c1:a0&lt;/pre&gt;&lt;pre&gt; div si ; ax = q2, dx = c2 = c&lt;/pre&gt;&lt;pre&gt; inc dx ; dx = Sector?&lt;/pre&gt;&lt;pre&gt; xchg cx, dx ; cx = c, dx = q1&lt;/pre&gt;&lt;pre&gt; ; dx:ax = q1:q2&lt;/pre&gt;&lt;pre&gt; div word [byte bp+BPB_NumHeads] ; ax = C (track), dx = H&lt;/pre&gt;&lt;pre&gt; mov dh, dl ; dh = H&lt;/pre&gt;&lt;pre&gt; mov ch, al&lt;/pre&gt;&lt;pre&gt; ror ah, 2&lt;/pre&gt;&lt;pre&gt; or cl, ah&lt;/pre&gt;&lt;pre&gt; mov ax, 0201h ; ah=2 - номер функции, al = 1 сектор&lt;/pre&gt;&lt;pre&gt; mov dl, [byte bp+BS_DrvNum]&lt;/pre&gt;&lt;pre&gt; int 13h&lt;/pre&gt;&lt;pre&gt; popa&lt;/pre&gt;&lt;pre&gt; jc Failure ; Ошибка при чтении&lt;/pre&gt;&lt;pre&gt; ; Номер следующего сектора&lt;/pre&gt;&lt;pre&gt; inc ax&lt;/pre&gt;&lt;pre&gt; jnz next&lt;/pre&gt;&lt;pre&gt; inc dx&lt;/pre&gt;&lt;pre&gt; next:&lt;/pre&gt;&lt;pre&gt; add bx, [byte bp+BPB_BytsPerSec]&lt;/pre&gt;&lt;pre&gt; dec cx ; Все сектора прочтены?&lt;/pre&gt;&lt;pre&gt; jnz next_sector ; Нет, читаем дальше&lt;/pre&gt;&lt;pre&gt; return:&lt;/pre&gt;&lt;pre&gt; ret&lt;/pre&gt;&lt;pre&gt; Failure:&lt;/pre&gt;&lt;pre&gt; dec byte [bp+fails] ; Последняя попытка?&lt;/pre&gt;&lt;pre&gt; jnz try ; Нет, еще раз&lt;/pre&gt;&lt;pre&gt; ; Последняя, выходим с ошибкой&lt;/pre&gt;&lt;pre&gt; stc&lt;/pre&gt;&lt;pre&gt; ret&lt;/pre&gt;&lt;pre&gt; ;ReadSectors endp&lt;/pre&gt; &amp;gt;&lt;p align=&quot;justify&quot;&gt;Осталось всего ничего: &lt;/p&gt;&lt;pre&gt;; Сообщения об ошибках&lt;br&gt; NotFound: ; Файл не найден&lt;br&gt; mov si, BOOT_ADDR + mLoaderNotFound&lt;br&gt; call print&lt;br&gt; jmp short die&lt;br&gt; DiskError: ; Ошибка чтения&lt;br&gt; mov si, BOOT_ADDR + mDiskError&lt;br&gt; call print&lt;br&gt; ;jmp short die &lt;br&gt; die: ; Просто ошибка&lt;br&gt; mov si, BOOT_ADDR + mReboot&lt;br&gt; call print&lt;br&gt; _die: ; Бесконечный цикл, пользователь сам нажмет Reset&lt;br&gt; jmp short _die&lt;br&gt; ; Процедура вывода ASCIIZ строки на экран&lt;br&gt; ; ds:si - адрес строки&lt;br&gt; print: ; proc&lt;br&gt; pusha&lt;br&gt; print_char:&lt;br&gt; lodsb ; Читаем очередной символ&lt;br&gt; test al, al ; 0 - конец?&lt;br&gt; jz short pr_exit ; Да конец&lt;br&gt; ; Нет, выводим этот символ&lt;br&gt; mov ah, 0eh&lt;br&gt; mov bl, 7&lt;br&gt; int 10h&lt;br&gt; jmp short print_char ; Следующий&lt;br&gt; pr_exit:&lt;br&gt; popa&lt;br&gt; ret&lt;br&gt; ;print endp&lt;br&gt; ; Перевод строки&lt;br&gt; %define endl 10,13,0&lt;br&gt; ; Строковые сообщения&lt;br&gt; mLoading db &apos;Loading...&apos;,endl&lt;br&gt; mDiskError db &apos;Disk I/O error&apos;,endl&lt;br&gt; mLoaderNotFound db &apos;Loader not found&apos;,endl&lt;br&gt; mReboot db &apos;Reboot system&apos;,endl&lt;br&gt; ; Выравнивание размера образа на 512 байт&lt;br&gt; times 499-($-$$) db 0&lt;br&gt; LoaderName db &apos;BOOTOR&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &apos; ; Имя файла загрузчика&lt;br&gt; BootMagic dw 0xAA55 ; Сигнатура загрузочного сектора&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;/pre&gt;&lt;h2&gt;Компиляция &lt;br&gt;&lt;/h2&gt; &lt;p align=&quot;justify&quot;&gt;Ну вот вроде бы и все. Компилируется все это до безобразия просто: &lt;/p&gt;&lt;div align=&quot;justify&quot;&gt; &lt;pre&gt;&amp;gt; nasm -f bin boot.asm -lboot.lst -oboot.bin&lt;/pre&gt; &lt;/div&gt; &lt;p align=&quot;justify&quot;&gt;Осталось
 только как-то записать этот образ в загрузочный сектор вашей дискеты и 
разместить в корне этой дискеты файл загрузчика BOOTOR. Загрузочный 
сектор можно записать с помощью такой вот простой программы на Turbo 
(Borland) Pascal. Эта программа будет работать как в DOS, так и в 
Windows - пробовал на WinXP - работает как ни странно, но только с 
floopy. Но все же я рекомендую запускать эту утилиту из-под чистого 
DOS&apos;а, т.к. WinXP обновляет не все поля в заголовке FAT и загрузочный 
сектор может работать некорректно. &lt;/p&gt; &lt;p align=&quot;justify&quot;&gt; &lt;strong&gt;var&lt;br&gt; &amp;nbsp; &lt;/strong&gt;fn:&lt;strong&gt;string&lt;/strong&gt;;&lt;br&gt; &amp;nbsp; f:&lt;strong&gt;file&lt;/strong&gt;;&lt;br&gt; &amp;nbsp; buf:&lt;strong&gt;array&lt;/strong&gt;[&lt;font color=&quot;#800080&quot;&gt;0.&lt;/font&gt;.&lt;font color=&quot;#800080&quot;&gt;511&lt;/font&gt;] &lt;strong&gt;of &lt;/strong&gt;byte;&lt;br&gt; &amp;nbsp; ok:boolean;&lt;br&gt; &lt;strong&gt;begin&lt;br&gt; &amp;nbsp; &lt;/strong&gt;fn:=ParamStr(&lt;font color=&quot;#800080&quot;&gt;1&lt;/font&gt;);&lt;br&gt; &amp;nbsp; &lt;strong&gt;if &lt;/strong&gt;fn=&lt;font color=&quot;#800000&quot;&gt;&apos;&apos; &lt;/font&gt;&lt;strong&gt;then &lt;/strong&gt;writeln(&lt;font color=&quot;#800000&quot;&gt;&apos;makeboot bootsect.bin&apos;&lt;/font&gt;)&lt;br&gt; &amp;nbsp; &lt;strong&gt;else&lt;br&gt; &amp;nbsp; begin&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/strong&gt;writeln(&lt;font color=&quot;#800000&quot;&gt;&apos;Making boot floppy&apos;&lt;/font&gt;);&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color=&quot;#000080&quot;&gt;{$I-}&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;assign(f,fn);&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; reset(f,sizeof(buf));&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; BlockRead(f,buf,&lt;font color=&quot;#800080&quot;&gt;1&lt;/font&gt;);&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; close(f);&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color=&quot;#000080&quot;&gt;{$I+}&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;strong&gt;if &lt;/strong&gt;IOResult&lt;&amp;gt;&lt;font color=&quot;#800080&quot;&gt;0 &lt;/font&gt;&lt;strong&gt;then&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; begin&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/strong&gt;Writeln(&lt;font color=&quot;#800000&quot;&gt;&apos;Failed to read file &quot;&apos;&lt;/font&gt;,fn,&lt;font color=&quot;#800000&quot;&gt;&apos;&quot;&apos;&lt;/font&gt;);&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Halt(&lt;font color=&quot;#800080&quot;&gt;1&lt;/font&gt;);&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;strong&gt;end&lt;/strong&gt;;&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; ok:=false;&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;strong&gt;asm&lt;/strong&gt;&lt;font color=&quot;#008000&quot;&gt;&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; mov&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ax, &lt;font color=&quot;#800080&quot;&gt;0301h&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;mov&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cx, &lt;font color=&quot;#800080&quot;&gt;1&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;mov&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dx, &lt;font color=&quot;#800080&quot;&gt;0&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;mov&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; bx, seg buf&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; mov&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; es, bx&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; mov&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; bx, offset buf&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; int&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color=&quot;#800080&quot;&gt;13h&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;jc&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; @error&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; mov&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ok, true&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; @error:&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;strong&gt;end&lt;/strong&gt;;&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;strong&gt;if &lt;/strong&gt;ok &lt;strong&gt;then &lt;/strong&gt;writeln(&lt;font color=&quot;#800000&quot;&gt;&apos;Done :)&apos;&lt;/font&gt;)&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;strong&gt;else begin&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/strong&gt;writeln(&lt;font color=&quot;#800000&quot;&gt;&apos;Makeboot failed :(&apos;&lt;/font&gt;);&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Halt(&lt;font color=&quot;#800080&quot;&gt;1&lt;/font&gt;);&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;strong&gt;end&lt;/strong&gt;;&lt;br&gt; &amp;nbsp; &lt;strong&gt;end&lt;/strong&gt;;&lt;br&gt; &lt;strong&gt;end&lt;/strong&gt;.&lt;/p&gt;&lt;p align=&quot;justify&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p align=&quot;justify&quot;&gt;&lt;a href=&quot;http://www.cyberguru.ru/programming/assembler/assembler-boot-sector-page4.html&quot;&gt;http://www.cyberguru.ru/programming/assembler/assembler-boot-sector-page4.html&lt;/a&gt;&lt;br&gt;&lt;/p&gt;&lt;pre&gt;&lt;br&gt;&lt;/pre&gt;</content:encoded>
			<link>https://programmist-bav.at.ua/news/2012-03-30-48</link>
			<dc:creator>Turbokherson</dc:creator>
			<guid>https://programmist-bav.at.ua/news/2012-03-30-48</guid>
			<pubDate>Fri, 30 Mar 2012 05:04:52 GMT</pubDate>
		</item>
		<item>
			<title>Dll на ассемблере. Динамические библиотеки (Dll-файли)</title>
			<description>&lt;p class=&quot;text&quot;&gt;&lt;strong&gt;Пример:&lt;/strong&gt; Написать программу на ассемблер. Задан массив &lt;em&gt;А &lt;/em&gt;из &lt;em&gt;N&lt;/em&gt; = 40 элементов. Навести алгоритм и программу определения количества элементов массива &lt;em&gt;А, &lt;/em&gt;которые удовлетворяют условию&amp;nbsp; &lt;em&gt;L&lt;/em&gt; &amp;gt;= &lt;em&gt;Ai&lt;/em&gt; &amp;gt;= M, где&amp;nbsp; &lt;em&gt;L&lt;/em&gt; = 6 и &lt;em&gt;M&lt;/em&gt; = 22. &lt;/p&gt;
&lt;p class=&quot;text&quot;&gt;&lt;br&gt;
 &lt;strong&gt;Текст программы&lt;/strong&gt; &lt;br&gt;
 &lt;strong&gt;файл 1.asm&lt;/strong&gt; &lt;/p&gt;
&lt;p class=&quot;text&quot;&gt;&lt;br&gt;
 &lt;span class=&quot;prog&quot;&gt;.386&lt;br&gt;
 .model&amp;nbsp; flat,stdcall &lt;br&gt;
 option casemap:none&amp;nbsp; ; отличие строчных и прописных букв &lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;prog&quot;&gt;includelib&amp;#92;masm32&amp;#92;lib&amp;#92;kernel32.lib &lt;/p&gt;
&lt;p class=&quot;prog&quot;&gt;ExitProcess proto :DWORD &lt;br&gt;
 Mas_sum proto :DWORD, :DWORD, :DWORD ; прототип процедуры &lt;br&gt;
 .code &lt;br&gt;
 Mas_sum proc arg1:DWORD,arg2:DWORD,masiv:DWORD &lt;/p&gt;
&lt;p class=&quot;prog&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; mov ebx,0 &lt;br&gt;
 mov eax,masiv &lt;br&gt;
 cmp eax,arg1 &lt;br&gt;
 jnc m1 &lt;br&gt;...</description>
			<content:encoded>&lt;p class=&quot;text&quot;&gt;&lt;strong&gt;Пример:&lt;/strong&gt; Написать программу на ассемблер. Задан массив &lt;em&gt;А &lt;/em&gt;из &lt;em&gt;N&lt;/em&gt; = 40 элементов. Навести алгоритм и программу определения количества элементов массива &lt;em&gt;А, &lt;/em&gt;которые удовлетворяют условию&amp;nbsp; &lt;em&gt;L&lt;/em&gt; &amp;gt;= &lt;em&gt;Ai&lt;/em&gt; &amp;gt;= M, где&amp;nbsp; &lt;em&gt;L&lt;/em&gt; = 6 и &lt;em&gt;M&lt;/em&gt; = 22. &lt;/p&gt;
&lt;p class=&quot;text&quot;&gt;&lt;br&gt;
 &lt;strong&gt;Текст программы&lt;/strong&gt; &lt;br&gt;
 &lt;strong&gt;файл 1.asm&lt;/strong&gt; &lt;/p&gt;
&lt;p class=&quot;text&quot;&gt;&lt;br&gt;
 &lt;span class=&quot;prog&quot;&gt;.386&lt;br&gt;
 .model&amp;nbsp; flat,stdcall &lt;br&gt;
 option casemap:none&amp;nbsp; ; отличие строчных и прописных букв &lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;prog&quot;&gt;includelib&amp;#92;masm32&amp;#92;lib&amp;#92;kernel32.lib &lt;/p&gt;
&lt;p class=&quot;prog&quot;&gt;ExitProcess proto :DWORD &lt;br&gt;
 Mas_sum proto :DWORD, :DWORD, :DWORD ; прототип процедуры &lt;br&gt;
 .code &lt;br&gt;
 Mas_sum proc arg1:DWORD,arg2:DWORD,masiv:DWORD &lt;/p&gt;
&lt;p class=&quot;prog&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; mov ebx,0 &lt;br&gt;
 mov eax,masiv &lt;br&gt;
 cmp eax,arg1 &lt;br&gt;
 jnc m1 &lt;br&gt;
 jmp _end &lt;br&gt;
 m1: &lt;br&gt;
 cmp eax,arg2 &lt;br&gt;
 jc m2 &lt;br&gt;
 jmp _end &lt;br&gt;
 m2: &lt;br&gt;
 inc ebx &lt;br&gt;
 _end: &lt;br&gt;
 &lt;br&gt;
 ret&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ; возвращение управления ОС &lt;br&gt;
 Mas_sum endp&amp;nbsp; &amp;nbsp; ; окончание процедуры с именем Mas_sum &lt;br&gt;
 end&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ; окончание программы с именем start &lt;/p&gt;
&lt;p class=&quot;prog&quot;&gt;end start &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;; директива окончания программы с именем start &lt;/p&gt;
&lt;p class=&quot;text&quot;&gt;&lt;strong&gt;Файл 1dll.asm&lt;/strong&gt; &lt;/p&gt;
&lt;p class=&quot;text&quot;&gt;&lt;br&gt;
 &lt;span class=&quot;prog&quot;&gt;.386&lt;br&gt;
 .model&amp;nbsp; flat,stdcall &lt;br&gt;
 option casemap:none&amp;nbsp; ; отличие строчных и прописных букв &lt;br&gt;
 include &amp;#92;masm32&amp;#92;include&amp;#92;windows.inc &lt;br&gt;
 include &amp;#92;masm32&amp;#92;include&amp;#92;kernel32.inc &lt;br&gt;
 include &amp;#92;masm32&amp;#92;include&amp;#92;fpu.inc &lt;br&gt;
 include &amp;#92;masm32&amp;#92;include&amp;#92;user32.inc &lt;br&gt;
 include &amp;#92;masm32&amp;#92;include&amp;#92;msvcrt.inc &lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;prog&quot;&gt;includelib &amp;#92;masm32&amp;#92;lib&amp;#92;user32.lib &lt;br&gt;
 includelib &amp;#92;masm32&amp;#92;lib&amp;#92;kernel32.lib &lt;br&gt;
 includelib &amp;#92;masm32&amp;#92;lib&amp;#92;msvcrt.lib &lt;br&gt;
 includelib &amp;#92;masm32&amp;#92;lib&amp;#92;fpu.lib &lt;/p&gt;
&lt;p class=&quot;prog&quot;&gt;includelib 1.lib &lt;br&gt;
 ExitProcess proto :DWORD &lt;br&gt;
 Mas_sum proto :DWORD, :DWORD, :DWORD ; прототип процедуры &lt;/p&gt;
&lt;p class=&quot;prog&quot;&gt;.data&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ; директива определения данные &lt;br&gt;
 _c dd 40 &lt;br&gt;
 sum dd 0 &lt;br&gt;
 op1 dd 6 ; запись в 32-разрядную память op1 &lt;br&gt;
 op2 dd 22 &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ; минимальных предел &lt;br&gt;
 frmt db &quot;%d&quot;,0 &lt;br&gt;
 buf db 30 dup(?) &lt;br&gt;
 stdout DWORD ? &lt;br&gt;
 stdin DWORD ? &lt;br&gt;
 cRead dd ? &lt;br&gt;
 temp dd ? &lt;br&gt;
 mas1 dd 40&amp;nbsp; dup(0) &lt;/p&gt;
&lt;p class=&quot;prog&quot;&gt;st1 db &quot;Vvesty masiv: &quot; &lt;br&gt;
 st2 db &quot;Вывод количества элементов в пределах (6,22) массива! А, 0 &lt;br&gt;
 st3 db 10 dup(0) &lt;br&gt;
 ifmt db &quot;количество = %d&quot;,0 &lt;br&gt;
 .code&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;; директива начала кода программы &lt;/p&gt;
&lt;p class=&quot;prog&quot;&gt;_start: &lt;br&gt;
 lea esi, mas1 &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;; загрузка адреса начала массива &lt;br&gt;
 mov ecx,_c &lt;br&gt;
 m1: &lt;br&gt;
 mov ebx,ecx &lt;br&gt;
 invoke GetStdHandle,STD_OUTPUT_HANDLE &lt;br&gt;
 mov stdout,eax &lt;br&gt;
 invoke GetStdHandle,STD_INPUT_HANDLE &lt;br&gt;
 mov stdin,eax &lt;br&gt;
 invoke WriteConsoleA,stdout,ADDR st1,14,NULL,NULL ; VIVOD ST1 &lt;br&gt;
 invoke ReadConsole,stdin,ADDR buf,20 &lt;br&gt;
 ADDR cRead,NULL ; чтения числа как символ &lt;br&gt;
 invoke crt_atoi,ADDR buf ; преобразовать символ в число &lt;br&gt;
 mov [esi],eax &lt;br&gt;
 add esi,4 &lt;br&gt;
 mov ecx,ebx &lt;br&gt;
 loop m1 &lt;br&gt;
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;&lt;br&gt;
 &lt;br&gt;
 mov ecx,_c &lt;br&gt;
 lea esi, mas1 &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;; загрузка адреса начала массива &lt;br&gt;
 mov eax [esi] &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ; загрузка числа &lt;br&gt;
 m3: &lt;br&gt;
 invoke Mas_sum, op1,op2,eax &lt;br&gt;
 add sum,ebx &lt;br&gt;
 add esi,4 &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;; расчет адреса нового числа &lt;br&gt;
 mov eax[esi] &lt;br&gt;
 loop m3&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/p&gt;
&lt;p class=&quot;prog&quot;&gt;mov ebx,sum &lt;/p&gt;
&lt;p class=&quot;prog&quot;&gt;invoke wsprintf &amp;#92; &lt;br&gt;
 ADDR st3 &amp;#92; &lt;br&gt;
 ADDR ifmt &amp;#92; &lt;br&gt;
 ebx &lt;br&gt;
 invoke MessageBox &amp;#92; &lt;br&gt;
 NULL &amp;#92; &lt;br&gt;
 addr st3 &amp;#92; &lt;br&gt;
 addr st2 &amp;#92; &lt;br&gt;
 MB_OK &lt;br&gt;
 invoke ExitProcess,0 &lt;br&gt;
 ret &lt;br&gt;
 end _start &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ; конец программы &lt;/p&gt;
&lt;p class=&quot;text&quot;&gt;&lt;strong&gt; Результат работы программы:&lt;/strong&gt; &lt;/p&gt;
&lt;p align=&quot;center&quot;&gt;&lt;img src=&quot;http://life-prog.ru/assembler/clip_image002.jpg&quot; alt=&quot;&quot; height=&quot;107&quot; width=&quot;425&quot;&gt;&lt;/p&gt;&lt;p align=&quot;center&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p align=&quot;left&quot;&gt;&lt;a href=&quot;http://life-prog.ru/view_zam.php?id=45&amp;amp;cat=3&amp;amp;page=2&quot;&gt;http://life-prog.ru/view_zam.php?id=45&amp;amp;cat=3&amp;amp;page=2&lt;/a&gt;&lt;br&gt;&lt;/p&gt;</content:encoded>
			<link>https://programmist-bav.at.ua/news/2012-03-30-47</link>
			<dc:creator>Turbokherson</dc:creator>
			<guid>https://programmist-bav.at.ua/news/2012-03-30-47</guid>
			<pubDate>Thu, 29 Mar 2012 21:48:17 GMT</pubDate>
		</item>
		<item>
			<title>Ассемблер работа с файлами. Запись в файл</title>
			<description>&lt;h1 class=&quot;head&quot;&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;Написать программу &lt;strong&gt;&lt;em&gt;с записью данных в файл&lt;/em&gt;&lt;/strong&gt;.
 Проанализировать 2 массива, которые состоят из 15&amp;nbsp; элементов каждый. 
Подсчитать количество элементов первого массива, которые имеют равные 
значения во втором массиве. Вывести соответствующие сообщения. &lt;/span&gt;&lt;/h1&gt;
&lt;p class=&quot;text&quot;&gt;&lt;strong&gt;Текст программы:&lt;/strong&gt;&lt;/p&gt;
&lt;p class=&quot;prog&quot;&gt;.386 &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;; директива определения типа микропроцессора &lt;br&gt;
 .model&amp;nbsp; flat, stdcall&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ; задание линейной модели памяти &lt;br&gt;
 ; но соглашения ОС Windows &lt;br&gt;
 option casemap:none&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ; отличие малых и больших букв &lt;br&gt;
 include&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;#92;masm32&amp;#92;include&amp;#92;windows.inc &lt;br&gt;
 include&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;#92;mas...</description>
			<content:encoded>&lt;h1 class=&quot;head&quot;&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;Написать программу &lt;strong&gt;&lt;em&gt;с записью данных в файл&lt;/em&gt;&lt;/strong&gt;.
 Проанализировать 2 массива, которые состоят из 15&amp;nbsp; элементов каждый. 
Подсчитать количество элементов первого массива, которые имеют равные 
значения во втором массиве. Вывести соответствующие сообщения. &lt;/span&gt;&lt;/h1&gt;
&lt;p class=&quot;text&quot;&gt;&lt;strong&gt;Текст программы:&lt;/strong&gt;&lt;/p&gt;
&lt;p class=&quot;prog&quot;&gt;.386 &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;; директива определения типа микропроцессора &lt;br&gt;
 .model&amp;nbsp; flat, stdcall&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ; задание линейной модели памяти &lt;br&gt;
 ; но соглашения ОС Windows &lt;br&gt;
 option casemap:none&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ; отличие малых и больших букв &lt;br&gt;
 include&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;#92;masm32&amp;#92;include&amp;#92;windows.inc &lt;br&gt;
 include&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;#92;masm32&amp;#92;include&amp;#92;kernel32.inc &lt;br&gt;
 includelib &amp;#92;masm32&amp;#92;lib&amp;#92;user32.lib &lt;br&gt;
 includelib &amp;#92;masm32&amp;#92;lib&amp;#92;kernel32.lib &lt;br&gt;
 BSIZE&amp;nbsp; equ 42&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ; количество байтов, которые записываются в файл &lt;br&gt;
 .data&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;; директива определения данные &lt;br&gt;
 fName&amp;nbsp;&amp;nbsp; BYTE &quot;лабораторная по файлам&quot;,0&amp;nbsp; &amp;nbsp; &lt;br&gt;
 fHandle DWORD ? ; резервирование у памяти 32-разрядной &lt;br&gt;
 cWritten&amp;nbsp; DWORD&amp;nbsp; ? ; резервирование 32-разрядного амбарчика памяти &lt;br&gt;
 ; с именем cWritten для адреса символов выведения &lt;br&gt;
 st1 db &apos;Количество одинаковых чисел в массиве = &apos;,0 &lt;br&gt;
 st1_kol = $ - st1 &lt;br&gt;
 st2 db 50 dup(0) &lt;br&gt;
 stemp2 db 2 dup(0),0 &lt;br&gt;
 ifmt db &quot;%d &quot;,0 &lt;br&gt;
 masivA db 1,6,4,6,9,15,21,2,51,8,12,3,13 &lt;br&gt;
 masivB db 1,5,4,43,13,4,65,9,7,21,32,23,15,51,66 &lt;br&gt;
 temp db 15 &lt;br&gt;
 prom db 0 &lt;/p&gt;
&lt;p class=&quot;prog&quot;&gt;.code&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;; директива начала сегмента-данных &lt;br&gt;
 start:&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;; метка начала программы с именем start &lt;/p&gt;
&lt;p class=&quot;prog&quot;&gt;mov eax,0 &lt;br&gt;
 mov ebx,0 &lt;/p&gt;
&lt;p class=&quot;prog&quot;&gt;lea esi, masivA &lt;/p&gt;
&lt;p class=&quot;prog&quot;&gt;M1: &lt;br&gt;
 mov eax,0 &lt;br&gt;
 mov al, byte ptr[esi] &lt;br&gt;
 lea edi, masivB &lt;br&gt;
 dec temp &lt;br&gt;
 jz _end &lt;br&gt;
 inc esi &lt;br&gt;
 mov ecx,15 &lt;br&gt;
 Temp1: &lt;br&gt;
 mov bl, byte ptr[edi] &lt;br&gt;
 inc edi &lt;br&gt;
 cmp eax,ebx &lt;br&gt;
 jz M3 &lt;br&gt;
 &lt;br&gt;
 M2:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br&gt;
 loop Temp1 &lt;br&gt;
 jmp M1 &lt;/p&gt;
&lt;p class=&quot;prog&quot;&gt;M3: &lt;br&gt;
 inc prom &lt;br&gt;
 jmp M1 &lt;/p&gt;
&lt;p class=&quot;prog&quot;&gt;_end: &lt;br&gt;
 lea edi, st2 &lt;br&gt;
 lea esi, st1 &lt;br&gt;
 mov ecx,st1_kol &lt;/p&gt;
&lt;p class=&quot;prog&quot;&gt;_m1: &lt;br&gt;
 mov al[esi] &lt;br&gt;
 mov [edi],al &lt;br&gt;
 inc esi &lt;br&gt;
 inc edi &lt;br&gt;
 loop _m1 &lt;br&gt;
 mov eax,0 &lt;br&gt;
 mov al,prom &lt;/p&gt;
&lt;p class=&quot;prog&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; invoke&amp;nbsp; wsprintf &amp;#92; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;; АПИ-ФУНКЦИЯ преобразования числа &lt;br&gt;
 ADDR stemp2 &amp;#92;&amp;nbsp; ; адрес буфф., куда будет записан помет. символов &lt;br&gt;
 ADDR ifmt &amp;#92; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;; адрес строки преобразования формата &lt;br&gt;
 eax &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;; регистр, содержание которого преобразовывается &lt;br&gt;
 lea esi, stemp2 &lt;br&gt;
 mov ecx,2 &lt;br&gt;
 dec edi &lt;br&gt;
 z1: &lt;br&gt;
 mov al[esi] &lt;br&gt;
 mov [edi],al &lt;br&gt;
 inc edi &lt;br&gt;
 inc esi &lt;br&gt;
 loop z1 &lt;/p&gt;
&lt;p class=&quot;prog&quot;&gt;invoke CreateFile, ADDR fName ; адрес имени файла с символами &lt;br&gt;
 GENERIC_WRITE,&amp;#92; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ; запись в файл &lt;br&gt;
 0, NULL &amp;nbsp;; параметры многозадачности &lt;br&gt;
 CREATE_ALWAYS &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;; уничтожить и создать новый файл &lt;br&gt;
 FILE_ATTRIBUTE_ARCHIVE, 0 &lt;br&gt;
 mov&amp;nbsp;&amp;nbsp; fHandle, eax&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ; запоминание дескриптора устройства &lt;br&gt;
 invoke&amp;nbsp; WriteFile, fHandle&amp;nbsp;&amp;nbsp;&amp;nbsp; ; дескриптор устройства &lt;br&gt;
 ADDR st2&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ; адрес области памяти, которая хранит символы &lt;br&gt;
 BSIZE&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; ; количество символов &lt;br&gt;
 ADDR cWritten&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ; адрес памяти, где сохраняется число &lt;br&gt;
 NULL&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; ; записанных в файл символ_в &lt;br&gt;
 invoke&amp;nbsp; CloseHandle, fHandle &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;; дескриптор файла &lt;br&gt;
 invoke&amp;nbsp; ExitProcess, 0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ; возвращение управления ОС Windows &lt;br&gt;
 end start &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;; директива окончания программы с именем start&lt;/p&gt;
&lt;p class=&quot;text&quot;&gt;&lt;strong&gt;Результат работы программы:&lt;/strong&gt;&lt;/p&gt;
&lt;img src=&quot;http://life-prog.ru/assembler/asm10_clip_image002.jpg&quot; height=&quot;93&quot; width=&quot;442&quot;&gt;&lt;br&gt;&lt;br&gt;&lt;a href=&quot;http://life-prog.ru/view_zam.php?id=44&amp;amp;cat=3&amp;amp;page=1&quot;&gt;http://life-prog.ru/view_zam.php?id=44&amp;amp;cat=3&amp;amp;page=1&lt;/a&gt;&lt;br&gt;</content:encoded>
			<link>https://programmist-bav.at.ua/news/2012-03-30-46</link>
			<dc:creator>Turbokherson</dc:creator>
			<guid>https://programmist-bav.at.ua/news/2012-03-30-46</guid>
			<pubDate>Thu, 29 Mar 2012 21:46:58 GMT</pubDate>
		</item>
		<item>
			<title>Ассемблер структуры. Примеры задач (Задана матрица 3 X 4).</title>
			<description>&lt;a href=&quot;http://life-prog.ru/view_zam.php?id=42&amp;amp;cat=3&amp;amp;page=1&quot;&gt;http://life-prog.ru/view_zam.php?id=42&amp;amp;cat=3&amp;amp;page=1&lt;/a&gt;&lt;br&gt;&lt;br&gt;&lt;strong&gt;Пример&lt;/strong&gt;: Задана 
матрица 3 X 4. Определить максимальный элемент каждой строки. Результат
 выполнения программы вывести в окно консоли. 
&lt;p class=&quot;text&quot;&gt;&lt;strong&gt; Текст программы:&lt;/strong&gt;&lt;/p&gt;
&lt;p class=&quot;prog&quot;&gt;.386 &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class=&quot;text_com&quot;&gt;&amp;nbsp;; директива определения типа микропроцессора &lt;/span&gt;&lt;br&gt;
 .model&amp;nbsp; flat, stdcall &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class=&quot;text_com&quot;&gt;&amp;nbsp;; задание линейной модели памяти &lt;/span&gt;&lt;br&gt;
 option casemap:none &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class=&quot;text_com&quot;&gt; ; отличие малых и больших букв &lt;/span&gt;&lt;br&gt;
 include&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;#92;masm32&amp;#92;include&amp;#92;windows.inc &lt;br&gt;
 include&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;#92;masm32&amp;#92;include&amp;#92;user32.inc &lt;br&gt;
 include&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;#92;masm...</description>
			<content:encoded>&lt;a href=&quot;http://life-prog.ru/view_zam.php?id=42&amp;amp;cat=3&amp;amp;page=1&quot;&gt;http://life-prog.ru/view_zam.php?id=42&amp;amp;cat=3&amp;amp;page=1&lt;/a&gt;&lt;br&gt;&lt;br&gt;&lt;strong&gt;Пример&lt;/strong&gt;: Задана 
матрица 3 X 4. Определить максимальный элемент каждой строки. Результат
 выполнения программы вывести в окно консоли. 
&lt;p class=&quot;text&quot;&gt;&lt;strong&gt; Текст программы:&lt;/strong&gt;&lt;/p&gt;
&lt;p class=&quot;prog&quot;&gt;.386 &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class=&quot;text_com&quot;&gt;&amp;nbsp;; директива определения типа микропроцессора &lt;/span&gt;&lt;br&gt;
 .model&amp;nbsp; flat, stdcall &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class=&quot;text_com&quot;&gt;&amp;nbsp;; задание линейной модели памяти &lt;/span&gt;&lt;br&gt;
 option casemap:none &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class=&quot;text_com&quot;&gt; ; отличие малых и больших букв &lt;/span&gt;&lt;br&gt;
 include&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;#92;masm32&amp;#92;include&amp;#92;windows.inc &lt;br&gt;
 include&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;#92;masm32&amp;#92;include&amp;#92;user32.inc &lt;br&gt;
 include&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;#92;masm32&amp;#92;include&amp;#92;kernel32.inc &lt;br&gt;
 includelib &amp;#92;masm32&amp;#92;lib&amp;#92;user32.lib &lt;br&gt;
 includelib &amp;#92;masm32&amp;#92;lib&amp;#92;kernel32.lib &lt;br&gt;
ExitProcess&amp;nbsp;&amp;nbsp; proto: dword&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;span class=&quot;text_com&quot;&gt; ; прототип API-функции&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;prog&quot;&gt;DATE1 STRUCT &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class=&quot;text_com&quot;&gt;&amp;nbsp;&amp;nbsp; ; тип данных СТРУКТУРА с именем DATE1 &lt;/span&gt;&lt;br&gt;
 elem1 db ? &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class=&quot;text_com&quot;&gt; ; имя первого поля структуры &lt;/span&gt;&lt;br&gt;
 elem2 db ? &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class=&quot;text_com&quot;&gt; ; имя второго поля структуры &lt;/span&gt;&lt;br&gt;
 elem3 db ? &amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class=&quot;text_com&quot;&gt;&amp;nbsp; ; имя третьего поля структуры &lt;/span&gt;&lt;br&gt;
 elem4 db ? &amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class=&quot;text_com&quot;&gt;&amp;nbsp; ; имя четвертого поля структуры &lt;/span&gt;&lt;br&gt;
 DATE1 ENDS &lt;br&gt;
 .data &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class=&quot;text_com&quot;&gt;&amp;nbsp;; директива определения данные &lt;/span&gt;&lt;br&gt;
 max db 0 &lt;br&gt;
 nomer db 1 &lt;br&gt;
 str1 DATE1 &lt;20,9,2,15&amp;gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class=&quot;text_com&quot;&gt;&amp;nbsp;&amp;nbsp;; структура с именем str1 &lt;/span&gt;&lt;br&gt;
 str2 DATE1 &lt;6,31,1,3&amp;gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class=&quot;text_com&quot;&gt;&amp;nbsp;&amp;nbsp;; структура с именем str2 &lt;/span&gt;&lt;br&gt;
 str3 DATE1 &lt;4,6,155,2&amp;gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class=&quot;text_com&quot;&gt;&amp;nbsp;&amp;nbsp;; структура с именем str2 &lt;/span&gt;&lt;br&gt;
 st1 db &quot; Вывод максимальных чисел &quot;,0 &lt;br&gt;
 st2 db 180 dup(?),0 &lt;br&gt;
 stemp db 0 &lt;br&gt;
 stemp2 db 3 dup(?),0 &lt;br&gt;
 st4 db &quot;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Нажмите Ок&quot;,0 &lt;br&gt;
 st3 db &quot;-й ряд имеет максимальное число = &quot; &lt;br&gt;
 kol3 = $ - st3 &lt;br&gt;
 kol4 = $ - st4 &lt;br&gt;
 ifmt db &quot;%d &quot;,0 &lt;br&gt;
 .code &amp;nbsp;&lt;span class=&quot;text_com&quot;&gt; ; директива начала сегмента-данных &lt;/span&gt;&lt;br&gt;
 start: &amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class=&quot;text_com&quot;&gt;&amp;nbsp;; метка начала программы с именем start &lt;/span&gt;&lt;br&gt;
 xor edx,edx &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class=&quot;text_com&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;; заполнение нулями &lt;/span&gt;&lt;br&gt;
 mov ebx,3 &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class=&quot;text_com&quot;&gt;&amp;nbsp;&amp;nbsp;; загрузка количества строк &lt;/span&gt;&lt;br&gt;
 lea esi, str1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class=&quot;text_com&quot;&gt;&amp;nbsp; ; загрузка адреса первой строки структуры &lt;/span&gt;&lt;br&gt;
 lea edi,st2 &lt;br&gt;
 m1: mov ecx,4 &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class=&quot;text_com&quot;&gt;&amp;nbsp;; количество элементов в строке &lt;/span&gt;&lt;br&gt;
 mov max,0 &lt;br&gt;
 m2: mov al[esi]&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class=&quot;text_com&quot;&gt;; загрузка элемента из строки структуры &lt;/span&gt;&lt;br&gt;
 .IF (al &amp;gt; max) &lt;br&gt;
 mov max,al &lt;br&gt;
 .ENDIF &lt;br&gt;
jmp m4 &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class=&quot;text_com&quot;&gt;&amp;nbsp;; безусловный переход, если наоборот &lt;/span&gt;&lt;br&gt;
 m3: add edx,eax&amp;nbsp; &lt;span class=&quot;text_com&quot;&gt;; добавление негативных элементов строки структуры &lt;/span&gt;&lt;br&gt;
 m4: inc esi &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class=&quot;text_com&quot;&gt;&amp;nbsp;; подготовка адреса нового элемента &lt;/span&gt;&lt;br&gt;
 loop m2 &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class=&quot;text_com&quot;&gt;&amp;nbsp;; есх := ecx – 1 и переход на m3, если не нуль &lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;prog&quot;&gt;mov eax,0 &lt;br&gt;
 mov al,nomer &lt;br&gt;
 invoke&amp;nbsp; wsprintf &amp;#92; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;span class=&quot;text_com&quot;&gt;&amp;nbsp;; API-ФУНКЦИЯ превращения числа &lt;/span&gt;&lt;br&gt;
 ADDR stemp &amp;#92;&amp;nbsp; &lt;span class=&quot;text_com&quot;&gt;; адрес буфф., куда будет записан помет. символов &lt;/span&gt;&lt;br&gt;
 ADDR ifmt &amp;#92; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class=&quot;text_com&quot;&gt;&amp;nbsp;; адрес строки превращения формата &lt;/span&gt;&lt;br&gt;
 eax &amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class=&quot;text_com&quot;&gt;&amp;nbsp;; регистр, содержание которого превращается &lt;/span&gt;&lt;br&gt;
 mov al,stemp &lt;br&gt;
 mov [edi],al &lt;br&gt;
 inc edi &lt;/p&gt;
&lt;p class=&quot;prog&quot;&gt;lea esi, st3 &lt;br&gt;
 mov ecx,kol3 &lt;/p&gt;
&lt;p class=&quot;prog&quot;&gt;_m1: &lt;br&gt;
 mov al[esi] &lt;br&gt;
 mov [edi],al &lt;br&gt;
 inc esi &lt;br&gt;
 inc edi &lt;br&gt;
 loop _m1 &lt;br&gt;
 mov eax,0 &lt;br&gt;
 mov al,max &lt;br&gt;
 &lt;br&gt;
 invoke&amp;nbsp; wsprintf &amp;#92; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class=&quot;text_com&quot;&gt;&amp;nbsp;&amp;nbsp;; API-ФУНКЦИЯ превращения числа &lt;/span&gt;&lt;br&gt;
 ADDR stemp2 &amp;#92;&amp;nbsp;&lt;span class=&quot;text_com&quot;&gt; ; адрес буфф., куда будет записан помет. символов &lt;/span&gt;&lt;br&gt;
 ADDR ifmt &amp;#92; &amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class=&quot;text_com&quot;&gt;&amp;nbsp;; адрес строки превращения формата &lt;/span&gt;&lt;br&gt;
 eax &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class=&quot;text_com&quot;&gt;&amp;nbsp;; регистр, содержание которого превращается &lt;/span&gt;&lt;br&gt;
 lea esi, stemp2 &lt;br&gt;
 mov ecx,3 &lt;br&gt;
 z1: &lt;br&gt;
 mov al[esi] &lt;br&gt;
 mov [edi],al &lt;br&gt;
 inc edi &lt;br&gt;
 inc esi &lt;br&gt;
 loop z1 &lt;/p&gt;
&lt;p class=&quot;prog&quot;&gt; mov al,10 &lt;br&gt;
 mov [edi],al &lt;br&gt;
 inc edi &lt;br&gt;
 inc nomer &lt;/p&gt;
&lt;p class=&quot;prog&quot;&gt;dec ebx &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class=&quot;text_com&quot;&gt; ; ebx := ebx – 1 &lt;/span&gt;&lt;br&gt;
 .IF ebx == 2 &lt;br&gt;
 lea esi,str2&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class=&quot;text_com&quot;&gt;&amp;nbsp; ; загрузка адреса новой строки &lt;/span&gt;&lt;br&gt;
 jmp m1 &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class=&quot;text_com&quot;&gt;&amp;nbsp; ; переход на новый цикл &lt;/span&gt;&lt;br&gt;
 .ELSEIF ebx == 1 &lt;br&gt;
 lea esi,str3&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class=&quot;text_com&quot;&gt; ; загрузка адреса новой строки &lt;/span&gt;&lt;br&gt;
 jmp m1 &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class=&quot;text_com&quot;&gt; ; переход на новый цикл &lt;/span&gt;&lt;br&gt;
 .ENDIF &lt;/p&gt;
&lt;p class=&quot;prog&quot;&gt;mov al,10 &lt;br&gt;
 mov [edi],al &lt;br&gt;
 inc edi &lt;br&gt;
 lea esi, st4 &lt;br&gt;
 mov ecx,kol4 &lt;br&gt;
 inc esi &lt;br&gt;
 _z1: &lt;br&gt;
 mov al[esi] &lt;br&gt;
 mov [edi],al &lt;br&gt;
 inc esi &lt;br&gt;
 inc edi &lt;br&gt;
 loop _z1 &lt;/p&gt;
&lt;p class=&quot;prog&quot;&gt;invoke MessageBox &amp;#92;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class=&quot;text_com&quot;&gt; ; API-ФУНКЦИЯ выведения окна консоли &lt;/span&gt;&lt;br&gt;
 NULL &amp;#92; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class=&quot;text_com&quot;&gt;&amp;nbsp;; hwnd – идентификатор окна &lt;/span&gt;&lt;br&gt;
 addr st2 &amp;#92; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class=&quot;text_com&quot;&gt;&amp;nbsp;; адрес строки, который содержит&amp;nbsp; текст сообщения &lt;/span&gt;&lt;br&gt;
 addr st1 &amp;#92; &lt;span class=&quot;text_com&quot;&gt;; адрес строки, который содержит&amp;nbsp; заглавие сообщения &lt;/span&gt;&lt;br&gt;
 MB_OK &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class=&quot;text_com&quot;&gt;&amp;nbsp;; вид диалогового окна &lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;prog&quot;&gt;invoke ExitProcess, 0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class=&quot;text_com&quot;&gt; ; возвращение управления ОС Windows &lt;/span&gt;&lt;br&gt;
 end start &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class=&quot;text_com&quot;&gt;&amp;nbsp;; директива окончания программы с именем start &lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;text&quot;&gt;&lt;br&gt;
 &lt;strong&gt; Результат работы программы:&lt;/strong&gt; &lt;/p&gt;
&lt;br&gt;
 &lt;strong&gt;&lt;img src=&quot;http://life-prog.ru/assembler/asm8_clip_image002.jpg&quot; height=&quot;159&quot; width=&quot;237&quot;&gt;&lt;/strong&gt;&lt;br&gt;</content:encoded>
			<link>https://programmist-bav.at.ua/news/2012-03-30-45</link>
			<dc:creator>Turbokherson</dc:creator>
			<guid>https://programmist-bav.at.ua/news/2012-03-30-45</guid>
			<pubDate>Thu, 29 Mar 2012 21:42:01 GMT</pubDate>
		</item>
	</channel>
</rss>