0018 - Отладка в C++. Руководство для разработчиков - Экран отладчика показан на рис. Мы должны были получи...

Крис Х. Паппас, Уильям Х. Мюррей III. Отладка в C++. Руководство для разработчиков. 2001

 Крис Х. Паппас, Уильям Х. Мюррей III 
.  Отладка в C++. Руководство для разработчиков 
. 2001
. 5-7989-0218-8, 0-07-212519-5
. Бином
. 
. В книге рассматриваются как общие методики и стратегии написания кода и отладки (вплоть до `проектирования, неза
Название: 
Отладка в C++. Руководство для разработчиков
Автор: 
Крис Х. Паппас, Уильям Х. Мюррей III
Год: 
2001
Издательство: 
Бином
Описание: 

В книге рассматриваются как общие методики и стратегии написания кода и отладки (вплоть до `проектирования, независимого от языка`), так и весьма специальные вопросы вроде отладки элементов ActiveX. Некоторые главы книги посвящены чрезвычайно актуальным вопросам, о которых к тому же почти нигде не пишется. Это, например, отладка кода с шаблонами STL или работа с OLE-ориентированными объектами - СОМ и ActiveX. Отдельные части (II и III) отхватывают широкий круг теоретико-практических вопросов отладки в процедурно- и объектно-ориентированных системах. Специфические аспекты C++ освещаются в части IV.

Экран отладчика показан на рис. Мы должны были получить шестнадцатеричное число . Думайте, думайте, думайте. К этим цифрам должен прибавляться перенос от сложения в предыдущей колонке, когда вы переходите от одной части сложения к другой. Давайте посмотрим, работает ли флаг переноса. Флаги микропроцессора Флаг Установлен . Это означает, что к цифрам первой колонки второго . Цифра в младшей колонке суммы получается на единицу меньше, чем нужно. Другими словами, программа не принимает во внимание информацию о переносе. Совет разработчику Мнемоника . Это соответствует случаю сложения самых младших разрядов . После этого нужно учитывать возможность переноса. Поэтому во всех остальных случаях для сложения должна применяться мнемоника . Давайте пройдем всю программу до конца и посмотрим, что происходит с переносами, и убедимся, что мы правильно диагностировали суть проблемы. Конечно, младшая цифра . Мы теперь знаем, что это проблема переноса, поскольку перед сложением, как можно видеть из рис. Наконец, сложение самых старших . Правильный результат здесь получился потому, что предыдугцее . Мы можем в этом убедиться, посмотрев на флаг переноса . Конечно, флаг не установлен. Что нужно сделать для устранения проблемы. , . . результат третьего сложения также неверен . . :. и и . Это легко можно было видеть при исполнении программы в отладчике, одновременно наблюдая за флагом переноса . Только самая первая операция сложения должна использовать мнемонику . Для всех остальных сложений должна применяться мнемоника . Вот скорректированный программный код, который теперь заслуживает своего названия — . Ваш экран должен соответствовать рис. Указатели являются только одним из малых аспектов проблем, которые предвидит программист при выполнении арифметики многократной точности. Тонкие различия семантики таких мнемоник, как . Вы знакомы с циклами С. В языке ассемблера имеются различные способы реализации циклов, но самым популярным является применение мнемоники . Цикл полезен в любом языке, когда нужно выполнять повторяющуюся задачу. Эти задачи могут быть какими угодно, от заполнения таблицы специфическими данными до прерывания процесса с целью обновления экрана. Пример, рассматриваемый в следующих разделах, объявляет массив С. Код на языке ассемблера, используя индексную адресацию, заполняет этот массив возрастающими четными значениями. Когда массив заполнен, он распечатывается на экране через поток . Проблемный код Кодирование этого приложения достаточно прямолинейно, — никакой арифметики многократной точности. Давайте посмотрим на исходную реализацию. Так что первым шагом является инициализация индексного регистра начальным значением. Управление циклом использует регистр есх. Этот регистр автоматически уменьшается на единицу при каждом проходе цикла. Когда значение его становится равным нулю, управление проваливается ниже и . Чтобы цикл обращ,ался к последовательным ячейкам таблицы, на каждом проходе к регистру . Ради экономии для присваивания значений элементам таблицы используется то же самое значение регистра . Так что мы можем ожидать, что в таблице окажутся шестнадцатеричные значения О, . Давайте компилируем, эту программу и посмотрим в отладчике на ее результаты. Заметьте также, что несколько строк кода уже исполнены. На самом деле был выполнен первый проход цикла. Если вы внимательно посмотрите на рис. Щелкните кнопкой мыши на этом значке, чтобы раскрыть содержимое таблицы, как показано на рис. Это правильное значение, поскольку оно соответствует содержимому регистра . Все остальные элементы таблицы не имеют смысла, поскольку значения им еще не присваивались. Ваш экран должен выглядеть как на рис. Появляющиеся значения данных правильны, но появляются они в ячейках через одну. Вернувшись к исходному коду, нетрудно обнаружить источник ошибки. В данном случае для индексации элементов таблицы используется регистр . Однако индексное значение слишком велико. Исходная таблица объявлена как таблица целых, так что каждый ее элемент должен занимать . Однако индексное значение в языке ассемблера должно быть выражено в байтах. Так что для сдвига на . Совет разработчику Если значение в регистре . Вторая попытка, после коррекции индексного значения, показывает, что значения заносятся в таблицу правильно, как вы можете видеть из рис. Граничные проблемы с циклами почти всегда указывают на неправильные начальные значения, используемые в управлении циклом. О, да ведь регистр есх должен быть установлен равным шестнадцатеричному . Правильная установка управляющих переменных цикла всегда была проблемой в любом языке. В языке ассемблера она, может быть, еще более серьезна из. Корректный код Две ошибки в исходном листинге теперь исправлены. Помните, что хотя значения печатаются здесь как шестнадцатеричные . Счетчик цикла скорректирован, чтобы сделать один дополнительный проход . Вывод значений на экран программой . срр До сих пор все наше программирование на языке ассемблера имело дело только с целыми числами. В следуюпдем разделе вы научитесь использовать сопроцессор для действий вещественной арифметики. Вы также увидите, как окно отладчика . Сложение вещественных чисел на сопроцессоре Первая программа, иллюстрирующая работу с сопроцессором, не содержит ошибок. На ее примере мы покажем некоторые основные принципы программирования сопроцессора и то, как с помощью отладчика изучаются переменные и значения на стеке сопроцессора. Корректный КОД Чтобы получить представление о программировании сопроцессора на языке ассемблера, изучите следующий листинг. Каждое число определяется как . Вы увидите, что этот тип данных очень хорошо подходит для работы с сопроцессором. Затем вы видите пять строк кода на языке ассемблера. Каждая мнемоника начинается с буквы . Рекомендуется, чтобы первой операцией на сопроцессоре всегда была . Следующая инструкция загружает вещественное число на стек сопроцессора в позиции .