Анимация
JavaScript
|
Главная Библионтека
По поводу программ трассировки в целом и этой в частности нужно отметить следующее. 1) Здесь представлена только самая интересная часть программы трассировки- часть, которая является управляющей во время выполнения другой программы. Чтобы трассировка принесла пользу, необходима также программа записи содержимого регистров, но мы ее не включили. Такая программа, хотя и безусловно важная, отвлекает внимание от более тонких моментов программы трассировки. Поэтому модификации, которые в этой связи необходимо ввести в программу, оставлены для упражнения (см. упр. 2). 2) Занимаемое пространство обычно имеет большее значение, чем время выполнения, т. е. программа должна быть настолько короткой, насколько это возможно. Тогда программа трассировки сможет "сосуществовать" даже с очень большими программами. А время выполнения все равно расходуется на вывод данных. 3) Мы позаботились о том, чтобы избежать изменения содержимого большинства регистров. Фактически программа использует только регистр А машины MIX. Программа трассировки не оказывает влияния ни на флаг сравнения, ни на флаг переполнения. (Чем меньше регистров используется, тем меньшее их число нужно восстанавливать.) 4) Когда происходит переход к ячейке JUMP, необязательно выполнять команду "STA AREG", так как содержимое гА не изменилось. 5) После выхода из программы трассировки регистр J не восстанавливается. В упр. 1 показано, как исправить эту ситуацию. 6) На трассируемую программу налагаются только три ограничения. a) Она не должна сохранять что-либо в ячейках, используемых программой трассировки. b) Она не должна использовать выходное устройство, на которое выводится информация о трассировке (например, команда JBUS дала бы неправильное указание). c) Во время трассировки она будет работать медленнее. УПРАЖНЕНИЯ 1. [22] Модифицируйте программу трассировки так, чтобы при выходе она восстанавливала регистр J. (Можете предполагать, что содержимое регистра J ненулевое.) 2. [26] Модифицируйте приведенную в тексте программу трассировки таким образом, чтобы перед выполнением каждого шага она записывала на магнитную ленту (устройство 0) следующую информацию. Слово 1, поле (0:2): адрес ячейки. Слово 1, поле (4:5): регистр J (перед выполнением). СлОво 1, поле (3:3)- 2, если результат сравнения - больше, 1-если равно, О - если меньше; плюс 8, если перед выполнением нет переполнения. Слово 2: команда. Слово 3: регистр А (перед выполнением). Слова 4-9: регистры 11-16 (перед выполнением). Слово 10: регистр X (перед выполнением). Слова 11-100 каждого блока ленты размером 100 слов должны содержать еще девять групп по 10 слов, записанных в том же формате. 3. [10] В предыдущем упражнении программа трассировки записывает свои выходные данные на магнитную ленту Объясните, почему это лучше, чем непосредственно распечатать результаты. ► 4. [25] Что произойдет, если программа трассировки будет трассировать саму себя? Если более конкретно, то выясните, как будет работать программа трассировки, если две команды - ENTX LEA VEX и JMP ♦+! - поместить непосредственно перед ENTER 5. [28] Рассмотрим задачу, аналогичную предыдущей. Пусть две копии программы трассировки помещены в различных местах памяти и настроены так, чтобы трассировать одна другую. Что произойдет? ► 6. [40] Напишите программу трассировки, способную трассировать себя в смысле упр 4: она должна в замедленном режиме распечатывать собственные шаги, а та программа будет трассировать саму себя в еще более замедленном режиме, и так до бесконечности, пока будет хватать памяти. ► 7. [25] Подумайте, как написать эффективную программу трассировки переходов, которая выдает намного меньше выходных данных, чем обычная программа трассировки. Вместо того чтобы отображать содержимое регистров, программа трассировки переходов просто записывает происходящие переходы Она выдает последовательность пар (xi,yi), {х2,У2),---- Это означает, что программа перешла из ячейки х\ в yi, затем (после выполнения команд из ячеек у\, yi + \, ..., хг) - из ячейки Х2 в уг и т. д. [На основании этой информации следующая программа может восстановить ход выполнения программы и установить, как часто выполнялась каждая команда.] 1.4.4. Ввод и вывод Вероятно, самое очевидное, чем один компьютер отличается от другого, - это устройства ввода-вывода, а также компьютерные команды, управляющие этими периферийными устройствами. В рамках одной книги невозможно обсудить все проблемы и методы, связанные с данной областью, поэтому мы ограничимся изучением наиболее типичных методов ввода-вывода, применимых для большинства компьютеров. Операторы ввода-вывода машины MIX представляют собой нечто среднее между самыми разнообразными средствами, имеющимися в реальных компьютерах.. Чтобы вы могли представить себе операции ввода-вывода на конкретном примере, давайте в этом разделе обсудим проблемы оптимального вьшолнения операций ввода-вывода в машине MIX. и снова я прошу читателя снисходительно отнестись к тому, что здесь рассматривается анахроничная машина MIX с ее перфокартами я т. п. Хотя эти устаревшие устройства сегодня полностью вышли из употребления, они по-прежнему могут дать несколько важных уроков. Но, конечно, когда для этой цели будет использоваться компьютер MMIX, он преподаст нам их еще лучше. Многие пользователи компьютеров полагают, что ввод и вывод на самом деле не являются частью процесса "настоящего" программирования. Считается, что ввод и вывод - это нудные задачи, которые приходится выполнять только для того, чтобы ввести информацию в компьютер и вывести из него полученные результаты. Поэтому средства ввода-вывода компьютера обычно начинают изучать только после знакомства с остальными его возможностями. И часто случается так, что Лишь небольшая группа программистов некоторого компьютера вообще что-либо знает о деталях операций ввода-вывода. Такое положение вещей в чем-то даже естественно, поскольку программирование ввода-вывода никогда не было особенно привлекательным. Но до тех пор, пока многие не начнут серьезно относиться к данному предмету, нельзя ожидать, что ситуация изменится. В этом и других разделах (например, в разделе 5.4.6) вы увидите, что в связи с вводом-выводом возникает множество интересных вопросов, а также узнаете о существовании некоторых изящных алгоритмов. Теперь, пожалуй, нужно сделать небольшое отступление по поводу терминологии. В словарях английского языка слова "input" ("ввод") и "output" ("вывод") раньше приводились только как существительные ("What kind of input are we getting?" - "Какого вида данные мы вводим?"). Но теперь уже вошло в привычку использовать их как прилагательные ("Dont drop the input tape" - "He сотрите эту ленту с входными данными") и переходные глаголы ("Why did the program output this garbage?" - "Почему программа выводит эту чепуху?"). Вместо комбинированного термина "ввод-вывод" чаще всего используют аббревиатуру "В/В" (на английском- "I/O"). Операцию ввода часто называют чтением, а вывода соответственно записью. Элементы, составляющие ввод или вывод, обычно называют "данными" (на английском- "data"). В английском языке это слово, строго говоря, является формой множественного числа (как и в русском языке. - Прим. перев.), но используется в собирательном смысле, как будто это единственное число ("The data has not been read."). Точно так и слово "information" ("информация") является формой как единственного, так и множественного числа. На этом урок английского закончен. Предположим, необходимо прочитать данные с магнитной ленты. Оператор IN машины MIX, как описано в разделе 1.3.1, просто инициирует процесс ввода, и в то время, пока данные вводятся, компьютер продолжает вьшолнять следующие команды. Поэтому по команде "IN 1000(5)" начинается считывание 100 слов с накопителя на магнитных лентах под номером 5 в ячейки памяти 1000-1099, но последующие команды программы пока не должны обращаться к этим ячейкам. Программа может считать, что ввод завершен только после того, как (а) инициируется другая операция В/В (IN, OUT или ЮС), обращающаяся к устройству 5, или (Ь) команда условного перехода JBUS(5) или JRED(5) показывает, что устройство 5 больше не "занято". Поэтому самый простой способ считать блок данных с ленты в ячейки 1000-1099 так, чтобы информация была на месте, - воспользоваться двумя командами: IN 1000(5); JBUS *(5). (1) 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 [ 79 ] 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 |