Команды перемещения данных

Система команд

Все команды по функциональному признаку разделены на группы: перемещение данных; обработка данных; управление программой; ввод – вывод и специальные команды.

Описывая систему команд с использованием мнемоники, необходимо учитывать возможности конкретного языка для образования допустимых сокращений. Конечно, тем, кто впервые сталкивается с микропроцессорами и их программированием, хочется, чтобы все мнемонические сокращения были сделаны на основе их родного языка, а не какого-нибудь иностранного. Но, например, как сократить команды ВВОД и ВЫВОД (аналогично ВХОД и ВЫХОД)? По-английски они будут записаны IN-OUT, т.е. сразу достаточно краткими, и различаются на столько, что могут быть сокращены до одной буквы (I/O). В русском варианте сокращение, к сожалению, совершенно невозможно.

Слову ВЫВОД (ВЫХОД) особенно не повезло, так как в командах арифметических действий и управления программой встречаются сокращения, отличающиеся только одной буквой, например, ВЫЧесть, ВЫПолнить, ВЫЗвать и др. Разница в одной букве для трех- или четырехбуквенных сокращений очень часто приводит к досадным ошибкам и труднообнаруживаемым опечаткам. В этом заключается одна из причин того, почему программисты часто предпочитают использовать в качестве мнемокодов сокращения английских терминов, хотя в начальный период их трудно запомнить.

Но основная причина широкого использования английского языка для мнемонических сокращений машинных команд связана с наличием готового математического обеспечения конкретного микропроцессора, а также возможностью использования математического обеспечения, подготовленного для других систем, в частности мини-ЭВМ.

Проблема применения мнемокодов на английском язык решается проще, чем это кажется с первого взгляда. Для создания программы иностранный язык изучать не надо, достаточно знать лишь несколько терминов одинаково часто встречающихся в командах большинства микропроцессоров и микро-ЭВМ. Описывая в дальнейшем систему команд, будем придерживаться следующего порядка.

Как правило, для восьмиразрядного микропроцессора КР.580ИK80A адреса и коды команд принято давать в шестнадцатеричной системе кодирования; в частности, именно в таком виде выдается листинг (распечатка) программы после машинной трансляции.

В микропроцессоре КР.580ИК80А команды межрегистровых передач являются двухадресными: в них приходится адресовать регистр - источник и регистр – получатель информации.

Регистровая адресация. По однобайтной команде (перемещение данных из одного регистра в другой). В зоне операнда должны быть указаны два адреса: на первом месте - куда помещается информация, т.е. адрес получателя (приемника); на втором месте - откуда берутся данные, т.е. адрес источника, например MOV R2, R1, где R означает регистры A, B, C, D, E, H, L, M. Можно сказать, что в команде указывается место назначения, в которое должны прибыть перемещаемые данные в результате операции.

При операции перемещения данных содержимое источника сохраняется неизменным, а начальное содержимое приемника заменяется результатом операции.

В мнемонике команды указываются условные обозначения РОН, в которых находятся приемник и источник, между собой эти обозначения обязательно разделяются запятой. Например, MOV С, В означает «перенести содержимое регистра В в регистр С»; содержимое регистра В остается без изменения. При трансляции команды в объектный код, условные обозначения регистров заменяются их двоичными номерами. Все регистры общего назначения, память и аккумулятор имеют постоянные номера.

Команда перемещения данных является самой «богатой» по числу различных вариантов. Если перебрать в зоне операнда все возможные комбинации регистров, то в перечне машинных команд будет занято 64 позиции. Правда, хотя все их можно применять, часть их окажется по существу бесполезной. Например, команда MOV А, А предписывает переслать содержимое аккумулятора обратно в аккумулятор.

Косвенно-регистровая адресация. Если данные переме-щаются в регистр из основной памяти или, наоборот, переносятся в память из регистра, то используется косвенно-регистровая адресация.

Например, MOV М, В означает поместить содержимое регистра В в ячейку памяти, адрес которой находится в регистрах Н и L. В восьмеричном коде эта операция представляется как 160, а в машинном - 01110000 (70 HEX). Команда MOV В, М аналогична предыдущей, но перемещение информации происходит в противоположном направлении: из памяти (по адресу в регистрах Н и L) в регистр – приемник В.

Непосредственная адресация. Команды перемещения данных могут иметь непосредственное представление операнда и косвенную адресацию.

Непосредственная адресация по-английски будет читаться как Immediate Addressing, поэтому в мнемонике команд она указывается буквой I, стоящей на последнем месте. Например, MVIA, 02 означает поместить число 02 в регистр А. Эти команды имеют двухбайтный формат, в результате их выполнения содержимое второго слова команды помещается в регистр, номер которого указан в поле операнда первого слова команды.

Очевидно, что при использовании любых команд перемещения все необходимые данные должны быть предварительно помещены в соответствующие регистры. Для этого применяются относящиеся к этой же группе команды передачи содержимого ячейки памяти во внутренние регистры. Обычно такие операции выполняются по командам загрузки. Противоположные действия, т.е. передачу содержимого внутреннего регистра в память, называют командами запоминания, или сохранения данных.

Команды загрузки аккумулятора и запоминания данных. По трехбайтной команде LDA в аккумулятор загружается содержимое ячейки памяти, адресуемой вторым и третьим байтами команды, а по команде запоминания STA -обратная противоположная передача. Все команды могут быть выполнены с прямой, непосредственной и косвенной адресацией.

При прямой адресации команды имеют трехбайтный формат и предписывают в случае запоминания поместить содержимое аккумулятора в ячейку памяти, адрес которой указан вторым и третьим байтами, например,SDA 0502 означает поместить содержимое регистра А в ячейку памяти 0502 (запомнить), а при загрузке, наоборот, поместить в аккумулятор данные из ячейки памяти, адресуемой аналогично: например, LDA 0700 означает поместить содержимое ячейки памяти в регистр А (загрузить).

При непосредственном представлении возможна только загрузка данных.

команды косвенной адресации имеют однобайтный формат LDAXRp, STAXR, разрядный адрес Rp указывается парой регистров. Это может быть не только пара Н и L, но В и С либо D и Е. При загрузке адресация выполняется аналогично, но данные записываются в аккумулятор. по-английски cовместное исполь-зование двух регистров будет читаться как Extended Addressing, поэтому в мнемонические сокращения этих команд добавляется символ Х. Например LDAX H означает поместить в регистр А данные из ячейки памяти, адрес которой содержится в регистровой паре HL(загрузить), а STAX Н,наоборот, данные из регистра А поместить в ячейку памяти (запомнить) по адресу который содержится в регистровой паре HL.

Команды загрузки указателей памяти и запоминания данных. Для загрузки начальных значений во внутренние указатели памяти (инициализации) применяют трехбайтную команду с непосредственным представлением операнда LXIrp, где Rр означает регистровые пары ВС, DE, HL или указатель стека SP-Stack Pointer. Например, LХL H 0900 означает поместить в регистр L число 00, а в регистр Н – число 09, следовательно, в регистровую пару загрузить указатель на ячейку памяти 0900.

Для загрузки основного указателя памяти-регистров Н и L- из двух смежных ячеек памяти применяется команда LHLD - Load HL Direct. Запоминание содержимого регистровой пары Н и L в двух следующих друг за другом ячейках памяти осуществляется по команде SHLD - Store HL Direct. Обе эти команды трехбайтные, во втором и третьем байтах указывается полный 16-разрядный адрес ячейки, из которой загружается или в которую заносится содержимое регистра L (младшего байта). Адрес содержимого регистра Н (старшего байта) получают путем прибавления 1 к значению второго и третьего байтов команды.

Команды межрегистрового обмена. Особенностями микропроцессора КР.580ИK80A являются однобайтные команды передачи 16-битных операндов. Имеется специальная команда XCHG (сокращение английского слова Exshange), производящая обмен содержимым регистров DE и HL:

(H) ↔ (D), (L) ↔ (E).

В ряде случаев очень удобной оказывается специальная однобайтная команда XTHL (exchange HL):

(L) ↔ ([ SP ]), (H) ↔ ([ SP + 1 ]),

она выполняет обмен содержимым регистров HL и двух верхних ячеек стека, т. е. последних, загруженных в стек данных. Содержимое указателя стека при выполнении команды XTHL не изменяется. Кстати сказать, команда XTHL - самая длинная в системе команд микропроцессора КР.580ИK80A, для ее выполнения требуется 18 машинных тактов.

Содержание регистровой пары HL передается в указатель стека командой SPHL или в программный счетчик командой PCHL. Здесь, как и ранее, на первом месте стоит получатель информации (приемник), а на втором - источник данных.

Команды операций со стеком. Для установки указателя стека на начальное значение используют упомянутую ранее команду LXI SP. Благодаря такой установке в качестве стека может быть применена любая область оперативной памяти микропроцессорной системы.

Основными командами работы со стеком являются PUSH - занести (буквально «втолкнуть») в стек и POP (Pull up) - извлечь (вытянуть) из стека. Эти команды всегда оперируют с регистровыми парами, указанными в поле операнда команды. При выполнении команды PUSH в ячейку памяти с адресом (SP)-1 записывается содержимое восьми старших разрядов, а в ячейку с адресом (SP)-2 - восьми младших разрядов регистровой пары. Содержимое указателя стека уменьшится на 2, так как стек «растет вверх», в область меньших адресов. Когда выполняется команда POP Rр, содержимое верхушки стека передается в младшие разряды регистровой пары, а содержимое следующей ячейки стека - в старшие разряды той же регистровой пары.

Для правильной работы стека команды PUSH и POP обязательно должны быть парными. Соблюдение этого принципа ложиться полностью на программиста, так как процедуры загрузки в стек и извлечение из стека выполняются микропроцессором не автоматически, а только по командам в программе.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: