<?xml version='1.0' encoding="utf-8"?>
      <rss version='2.0'>
      <channel>
      <title>Форум на Исходниках.RU</title>
      <link>https://forum.sources.ru</link>
      <description>Форум на Исходниках.RU</description>
      <generator>Форум на Исходниках.RU</generator>
  	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=172765&amp;view=findpost&amp;p=1460069</guid>
        <pubDate>Tue, 20 Feb 2007 20:34:00 +0000</pubDate>
        <title>Ошибки программирования</title>
        <link>https://forum.sources.ru/index.php?showtopic=172765&amp;view=findpost&amp;p=1460069</link>
        <description><![CDATA[rikitikitavi: <div class='tag-align-center'><br>
<span class='tag-size' data-value='13' style='font-size:13pt;'><span class="tag-color tag-color-named" data-value="blue" style="color: blue"><strong class='tag-b'>Ошибки программирования</strong></span></span></div><br>
<div class='tag-align-center'><span class='tag-size' data-value='11' style='font-size:11pt;'><span class="tag-color tag-color-named" data-value="green" style="color: green"><strong class='tag-b'>Классификация ошибок программирования</strong></span></span></div><br>
<div class='tag-align-center'>Рассмотренные ошибки программирования могут быть разделены на следующие категории:</div><br>
<div class='tag-align-center'><strong class='tag-b'>Перестановка операндов или частей операндов</strong></div><br>
К типичным ошибкам этого рода относятся:<br>
&#9632; перестановка операндов, указывающих на источник и назначение в командах пересылки;<br>
&#9632; перевертывание формата, в котором запоминаются 16-разрядные значения;<br>
&#9632; изменение направления при вычитаниях и сравнениях.<br>
<br>
<div class='tag-align-center'><strong class='tag-b'>Неправильное использование флагов</strong></div><br>
Типичные ошибки следующие:<br>
&#9632; использование не того флага, который в данном конкретном случае должен проверяться (как, например, флага знака вместо флага переноса);<br>
&#9632; условный переход после команд, которые не воздействуют на данный флаг;<br>
&#9632; инвертирование условий перехода (особенно при использовании флага нуля);<br>
&#9632; неправильный условный переход в случаях равенства и случайное изменение флага перед условным переходом.<br>
<br>
<div class='tag-align-center'><strong class='tag-b'>Смешивание регистров и пар регистров</strong></div><br>
Типичная ошибка состоит в работе с регистром (В, D или Н) вместо пары регистров с аналогичным именем.<br>
<br>
<div class='tag-align-center'><strong class='tag-b'>Смешивание адресов и данных</strong></div><br>
К типичным ошибкам относятся:<br>
&#9632; использование непосредственной адресации вместо прямой адресации или наоборот;<br>
&#9632; смешивание регистров с ячейками памяти, адресуемыми через пары регистров.<br>
<br>
<div class='tag-align-center'><strong class='tag-b'>Использование неверных форматов</strong></div><br>
Типичные ошибки состоят в:<br>
&#9632; использовании формата BCD (десятичного) вместо двоичного или наоборот,<br>
&#9632; использование двоичного и шестнадцатеричного кода вместо ASCII.<br>
<br>
<div class='tag-align-center'><strong class='tag-b'>Неправильная работа с массивами</strong></div><br>
Обычная ошибка состоит в выходе за границы массивов.<br>
<br>
<div class='tag-align-center'><strong class='tag-b'>Неучет неявных эффектов</strong></div><br>
К типичным ошибкам относятся использование без учета влияния участвующих в работе команд:<br>
&#9632; аккумулятора;<br>
&#9632; пары регистров;<br>
&#9632; указателя стека;<br>
&#9632; флагов или ячеек памяти.<br>
Большинство ошибок вызываются командами, которые дают непредвиденные, неявные или косвенные результаты.<br>
<br>
<div class='tag-align-center'><span class='tag-size' data-value='11' style='font-size:11pt;'><span class="tag-color tag-color-named" data-value="green" style="color: green"><strong class='tag-b'>Ошибки при задании необходимых начальных условий для отдельных программ</strong></span></span></div><br>
Большинство программ требует инициализации счетчиков, косвенных адресов, регистров, флагов и ячеек для временного хранения. Микро-ЭВМ в целом требует инициализации всех общих ячеек в ОЗУ (особо отметим косвенные адреса и счетчики).<br>
<br>
<div class='tag-align-center'><strong class='tag-b'>Неправильная организация программы</strong></div><br>
К типичным ошибкам относятся:<br>
&#9632; обход или повторение секций инициализации;<br>
&#9632; ошибочное изменение регистров с адресами или счетчиками;<br>
&#9632; потеря промежуточных или окончательных результатов.<br>
Обычным источником ошибок, которые здесь не рассматриваются, является конфликт между программой пользователя и системными программами.<br>
Простым примером такого конфликта является попытка сохранять данные программы пользователя в ячейках памяти системной программы. В этом случае всякий раз, когда выполняется системная программа, изменяются данные, которые нужны для программы пользователя.<br>
Более сложные источники конфликтов связаны с системой прерываний, портами ввода-вывода, стеком и флагами.<br>
Системные программы в конечном счете должны эксплуатировать те же самые ресурсы, что и программы пользователя.<br>
При этом обычно в системных программах предусматривается сохранение и восстановление программной среды, в которой работают пользовательские программы, но это часто приводит к трудноуловимым или неожиданным последствиям.<br>
Сделать такую операционную систему, которая была бы совершенно прозрачной для пользователя — это задача, сравнимая с выработкой правил и законов или сводов о налогах, которые не имели бы лазеек или побочных эффектов.<br>
<br>
<div class='tag-align-center'><span class='tag-size' data-value='11' style='font-size:11pt;'><span class="tag-color tag-color-named" data-value="green" style="color: green"><strong class='tag-b'>Распознавание ошибок Ассемблером</strong></span></span></div><br>
Большинство Ассемблеров немедленно распознает наиболее распространенные ошибки, такие как:<br>
&#9632; <strong class='tag-b'>Неопределенный код операции</strong>(обычно это неправильное написание или отсутствие двоеточия или метки);<br>
&#9632; <strong class='tag-b'>Неопределенное имя</strong> (часто это неправильное написание или отсутствие определенного имени);<br>
&#9632; <strong class='tag-b'>Неверный символ</strong>(например, 2 в двоичном числе или В в десятичном числе);<br>
&#9632; <strong class='tag-b'>Неправильное значение</strong> (обычно это число, которое слишком велико для 8 или 16 разрядов);<br>
&#9632; <strong class='tag-b'>Отсутствует операнд;</strong><br>
&#9632; <strong class='tag-b'>Двойное определение</strong> (одному и тому же имени присваиваются два различных значения);<br>
&#9632; <strong class='tag-b'>Недопустимая метка</strong> (например, метка, предписанная псевдооперации, не допускающей метки);<br>
&#9632; <strong class='tag-b'>Отсутствие метки</strong> (например, при псевдооперации EQU, для которой требуется метка).<br>
Эти ошибки неприятны, но они легко исправимы. Единственная трудность возникает тогда, когда ошибка (такая, как отсутствие точки с запятой у строки с комментарием) приводит Ассемблер в <strong class='tag-b'>“замешательство”</strong>, результатом чего является ряд бессмысленных сообщений об ошибках.<br>
Существует, однако, много простых ошибок, которые Ассемблер не может распознать. Программисту следует иметь в виду, что его программа может содержать такие ошибки, даже если Ассемблер и не сообщил о них.<br>
Типичны следующие примеры.<br>
&#9632; Пропущенные строки.<br>
&#9632; Пропущенные определения.<br>
&#9632; Ошибки в написании, когда запись сама по себе допустима.<br>
&#9632; Обозначение команд как комментариев.<br>
&#9632; Если в команде, которая работает с парой регистров, задается одинарный регистр.<br>
&#9632; Если вводится неправильная цифра, такая как Х в десятичном или шестнадцатеричном числе или 7 в двоичном числе.<br>
В Ассемблере могут распознаваться только такие ошибки, которые предусмотрел его разработчик.<br>
Программисты же часто способны делать ошибки, которые разработчик не мог и вообразить, такие ошибки возможно найти при проверке программ вручную строчка за строчкой.<br>
<br>
<div class='tag-align-center'><span class='tag-size' data-value='11' style='font-size:11pt;'><span class="tag-color tag-color-named" data-value="green" style="color: green"><strong class='tag-b'>Распространенные ошибки в драйверах ввода-вывода</strong></span></span></div><br>
Так как большинство ошибок в драйверах ввода-вывода связано как с аппаратурным, так и с программным обеспечением, они трудно поддаются классификации. Приведем некоторые возможные случаи.<br>
&#9632; Смешивание портов ввода и вывода.<br>
&#9632; Попытка выполнить операции, которые физически невозможны.<br>
&#9632; Упущенные из вида неявных эффектов аппаратуры.<br>
&#9632; Чтение или запись без проверки состояния.<br>
&#9632; Игнорирование различия между вводом и выводом.<br>
&#9632; Ошибка при сохранении копии выводимых данных.<br>
&#9632; Чтение данных до того, как они стабилизируются, или во время их изменения.<br>
&#9632; Отсутствие изменения полярности данных, которые передаются к устройству или от устройства, работающего с отрицательной логикой.<br>
&#9632; Смешивание действительных портов ввода-вывода с внутренними регистрами интегральных схем ввода-вывода.<br>
&#9632; Неправильное использование двунаправленных портов.<br>
&#9632; Отсутствие очистки состояния после выполнения команды ввода-вывода.<br>
<br>
<div class='tag-align-center'><span class='tag-size' data-value='11' style='font-size:11pt;'><span class="tag-color tag-color-named" data-value="green" style="color: green"><strong class='tag-b'>Распространенные ошибки в программах прерывания</strong></span></span></div><br>
Многие ошибки, связанные с прерываниями, зависят как от аппаратного, так и программного обеспечения. Самыми распространенными ошибками являются следующие.<br>
&#9632; Отсутствие разрешения прерываний.<br>
&#9632; Отсутствие сохранения регистров.<br>
&#9632; Сохранение или восстановление регистров в неправильном порядке.<br>
&#9632; Разрешение прерываний до инициализации приоритетов и других параметров системы прерываний.<br>
&#9632; Неучет того, что реакция на прерывание включает сохранение счетчика команд в вершине стека.<br>
&#9632; Отсутствие запрещения прерываний во время многобайтных передач или выполнения последовательности команд, которая не должна прерываться.<br>
&#9632; Отсутствие разрешения прерываний после последовательности команд, которая должна выполняться без прерываний.<br>
&#9632; Отсутствие очистки сигнала, вызывающего прерывание.<br>
&#9632; Ошибка в общении с основной программой.<br>
&#9632; Отсутствие сохранения и восстановления приоритетов.<br>
&#9632; Отсутствие разрешения прерываний от дополнительных аппаратурных входов, которое выполняется с помощью очистки разрядов масок в регистре I.<br>
&#9632; Неправильное использование разрядов разрешения прерываний в командах <strong class='tag-b'>SIM</strong>.]]></description>
        <author>rikitikitavi</author>
        <category>Assembler FAQ</category>
      </item>
	
      </channel>
      </rss>
	