К. Хамахер, З. Вранешич, С. Заки - Организация ЭВМ - 5-е издание (2003) (1114649), страница 21
Текст из файла (страница 21)
В некоторых случаях ассемблер не заменяет представляющее адрес имя реальным значением этого адреса. В частности, в командах перехода не заменяется реюгьным адресом имя, определяющее точку, к которой будет выполняться переход. В командах перехода целевой адрес обычно задается в режиме относительной адресации (см. раздел 2.5). Ассемблер вычисляет смещение перехода, то есть расстояние до целевого адреса, и помещает его в машинную команду. Сканируя исходную программу, ассемблер записывает все имена и соответствуютцие им числовые значения в специальную таблицу, называемую глаблицей символов. Когда имя встречается в программе повторно, оно заменяется соответствующим значением из таблицы. Проблема может возникнуть лишь в том случае, если имя использовалось в качестве операнда до того, как ему было присвоено значение.
Такое возможно, в частности, при выполнении перехода вверх по программе. Ассемблер не сможет определить целевой адрес перехода, так как указанное в команде имя еще не записано в таблицу символов. Для решения проблемы достаточно дважды просканировать исходную программу.
На первом проходе ассемблер создает полную таблицу символов. В конце этого прохода всем встречающимся в программе именам должны быть поставлены в соответствие числовые значения. 88 Глава 2. Машинные команды н программы После этого ассемблер снова проходит по исходной программе и заменяет все имена значениями из таблицы символов. Такой ассемблер называется двухпроходным. Ассемблер сохраняет объектную программу на магнитном диске. Перед выполнением эта программа загружается в память компьютера. Для этого там должна присутствовать еще одна служебная программа, называемая загрузчиком. Загрузчик выполняет последовательность операций ввода, необходимых для пересылки программы на машинном языке с диска в заданное место памяти.
При этом загрузчик должен знать длину программы и адрес, по которому ее необходимо загрузить. Обычно ассемблер помещает такого рода информацию в заголовок программы, предшествующий объектному коду. Загрузив код, загрузчик начинает выполнение объектной программы с перехода к той ее команде, которая должна быть реализована первой. Адрес этой команды включается в программу на языке ассемблера в качестве операнда директивы ассемблера ЕЫП. Ассемблер помещает этот адрес в заголовок, предшествующий объектному коду на диске. Программа начинает выполняться и выполняется до своего завершения, если только в ней нет логических ошибок. Пользователь должен уметь находить такие ошибки.
Что касается синтаксических ошибок, то ассемблер выявляет их сам и сообщает об этом пользователю. Для того чтобы помочь пользователю найти другие программные ошибки, в состав системного программного обеспечения обычно включают программу, называемую отладчиком. Эта программа предоставляет пользователю возможность остановить выполнение объектной программы в указанной им точке и проанализировать содержимое памяти и регистров процессора. Об отладке программ подробнее рассказывается в главе 4. 2.6.3.
Запись чисел При работе с числовыми значениями обычно используют привычную десятичную запись. Конечно, в компьютере числовые значения хранятся как двоичные числа. В некоторых случаях удобнее прямо задавать двоичные значения. Большинство реализаций ассемблера позволяет задавать числовые значения различными способами, используя соглашения, определяемые синтаксисом языка. Рассмотрим в качестве примера число 93, представленное в виде 8-разрядной двоичной записи 01011101.
Если непосредственно использовать это значение в качестве операнда, его можно задать в виде десятичного числа, как в следующей команде: АП1) №93,21 или же в виде двоичного числа, на что указывает специальный префикс, такой как символ «',4ю А1)Р №7" 01011101,21 Двоичные числа можно записать более компактно, используя шеплиадцаглеричную систему, в которой каждые четыре бита числа представлены одной шестнадцатеричной цифрой. Шестнадцатеричную запись можно считать расширенной версией двоично-десятичной записи (см.
приложение Д). Первые десять кодов, 0000, 2.7. Базовые операции ввода-вывода 89 0001, ..., 1001, обозначаются цифрами О, 1, ..., 9, как в двоично-десятичной системе кодирования. Оставшиеся шесть 4-разрядных кодов, 1010, 1011, ..., 1111, обозначаются буквами А, В, ..., Е В шестнадцатеричном представлении десятичное значение 93 записывается как 5Р. В языках ассемблера шестнадцатеричное представление часто задается с помощью префикса в виде знака доллара.
Таким образом, команда, прибавляющая к содержимому регистра число 93, при использовании шестнадцатеричной системы кодирования чисел записывается так: АРР Ф5Р,К1 2.7. Базовые операции ввода-вывода В предыдущем разделе описывались машинные команды и режимы адресации. При этом мы предполагали, что данные, на которые воздействуют указанные команды, уже хранятся в памяти. Далее речь пойдет о средствах, с помощью которых данные пересылаются между памятью компьютера и внешним миром. Операции ввода-вывода являются одной из важнейших составляющих работы компьютера, и от того, как они выполняются, в значительной мере зависит его производительность. Эта тема подробно освещается в главе 4. А пока мы рассмотрим несколько базовых концепций ввода-вывода.
Предположим, нам необходимо считать вводимые с клавиатуры символы и вывести их на экран. Простейший способ выполнения подобных задач заключается в использовании метода, который называется программно управляемым вводом-выводом. Скорость передачи данных от клавиатуры к компьютеру зависит от того, насколько быстро пользователь может их вводить (а зто едва ли больше нескольких символов в секунду!).
Скорость передачи данных от компьютера к дисплею гораздо выше. Она определяется пропускной способностью соединения между компьютером и дисплеем, которая обычно составляет несколько тысяч символов в секунду. Однако и это невероятно мало, если сравнивать со скоростью работы процессора, выполняющего миллионы команд в секунду. Разница в быстродействии процессора и устройств ввода-вывода вызывает потребность в механизмах синхронизации процесса передачи данных между ними. Решение этой проблемы заключается в следующем. Процессор отсылает дисплею первый символ и ждет от него сигнала о том, что символ получен. Затем он отсылает второй символ, снова ждет сигнала и т. д. Точно так же отсылаются процессору данные, вводимые с клавиатуры.
Процессор ждет сигнала, означающего, что пользователь нажал одну из клавиш и что ее код помещен в некоторый буферный регистр, связанный с клавиатурой. Получив сигнал, процессор считывает код клавиши. Как показано на рис 2.19, клавиатура и дисплей являются совершенно независимыми устройствами. Нажатие клавиши на клавиатуре само по себе не вызывает вывода на экран соответствующего символа. Один блок команд в программе ввода-вывода пересылает символы в процессор, а другой выводит таковые на экран.
Рассмотрим, как пересылается код символа от клавиатуры процессору. В ответ на нажатие клавиши соответствующий ей код символа сохраняется в 8-разрядном буферном регистре, связанном с клавиатурой. Назовем его РАТА1Х, как 90 Глава 2. Машинные команды и программы на рис. 2.19. Для уведомления процессора о наличии нового кода символа в регистре ПАТА?Х специалъный флаг состояния 5?Х устанавливается в 1. Программа отслеживает состояние этого флага, и когда он оказывается установленным в 1, процессор считывает содержимое регистра. После пересылки символа в процессор значение флага Я?Х автоматически сбрасывается в О.
Когда с клавиатуры вводится второй символ, флаг Я 1Х снова устанавливается в 1 и процесс повторяется. Вывод символа на экран осуществляется аналогичным образом. Но в этом случае для его пересылки от процессора к монитору используются буферный регистр ЭАТАОПТ и флаг ЯОПТ. Если значение ЯОПТ равно 1, значит, дисплей готов к приему символа. Процессор под управлением программы отслеживает содержимое флага ЯО??Т, и когда его значение оказывается равным 1, процессор пересылает код символа в регистр ?)АТАО ПТ.
После этого флаг Я О ??Т сразу же снимается. Когда дисплей готов к приему следующего символа, флаг ЯО??Т опять устанавливается в 1 и процесс повторяется. Буферные регистры ?1АТА?Х и ?)АТАО??Т совместно с флагами состояния Я?Х и ЯОПТ являются частью схемы, называемой интерфейсом устройства. Такая схема имеется у каждого устройства ввода-вывода. С процессором она соединяется через шину (рис. 2.19). Шина Рис. 2.19. Шина, соединяющая процессор с клавиатурой и дисплеем Для выполнения операций ввода-вывода необходимы машинные команды, проверяющие состояние флагов и пересылающие данные между процессором н устройствами ввода-вывода. Эти команды сходны с командами пересылки данных между процессором и памятью.
Например, процессор может отслеживать состояние флага клавиатуры Я?Х и пересылать символ из регистра ?)АТА?Х в К1 путем применения такой последовательности операций: КЕА?)ЖА?Т ВгапсЬ 1о КЕА?)ЖА?Т ?? Б?Х - О ?прог й ош?)АТА?Х го К1 Операция ВгапсЬ обычно реализуется посредством двух машинных команд. Первая проверяет флаг состояния, а вторая выполняет переход. Процесс отслеживания состояния флага в различных компъютерах может быть реализован немного 2Л.