Считывание и запись регистров
Все функции в микроконтроллерах MAXQ выполняются через регистры непосредственно или косвенно. В данном разделе рассматривается загрузка регистров конкретным значением и перенос данных между регистрами одинаковых и различных размеров.
Загрузка 8-битного регистра непосредственным значением
Любые доступные для записи 8- битные регистры с субиндексом в пределах модуля от 0h до 7h могут быть загружены за один цикл при помощи команды MOVE.
move AP, #05h ; загрузка в регистр указателя аккумулятора значения 05h
|
Доступные для записи 8- битные регистры с субиндексом в пределах модуля 8h и выше могут быть загружены значением непосредственно при помощи команды MOVE, но требуется дополнительный цикл для установки префиксного значения для адресата.
move WDCN, #33h ; транслируется в команды: move PFX[2], #00h
; move (WDCN-80h), #33h
|
Загрузка 16-разрядного регистра 16-разрядным непосредственным значением
Любые доступные для записи 16- битные регистры с субиндексом в пределах модуля от 0h до 7h могут быть загружены за один цикл при помощи команды MOVE, но только если старший байт непосредственно загружаемого значения является нулевым.
Если старший байт непосредственного значения не является нулевым или если 16- разрядный субиндекс больше 7h, то потребуется дополнительный цикл для установки значения старшего байта и/или старшего индекса регистра.
; старший байт <> #00h
move LC[0], #0110h ; транслируется в команды: move PFX[2], #01h
; move LC[0], #10h
; субиндекс получателя > 7h
move A[8], #0034h ; транслируется в команды: move PFX[2], #00h
; move (A[8]-80h), #34h
|
Перемещение значений между регистрами с одинаковым размером
Перемещение данных между регистрами с одинаковым размером может быть выполнено при помощи команды MOVE за один цикл, но только в том случае, если индекс регистра получателя от 0h до 7h и индекс регистра источника - от 0h до Fh.
move A[0], A[8] ; копирование данных из аккумулятора 8 в аккумулятор 0
move LC[0], LC[1] ; копирование данных из следящего счетчика 1 в следящий счетчик 0
|
Если индекс регистра получателя больше чем 7h или если адрес регистра источника больше чем Fh, то необходимо выполнить следующие команды.
move A[15], A[0] ; транслируется в команды: move PFX[2], #00h
; move (A[15]-80h), A[0]
|
Перемещение значений между регистраторами различных размеров
Перед рассмотрением всех возможных случаев, сначала представим вам регистр, который будет использоваться практически во всех случаях. В микроконтроллерах имеется 16-разрядный регистр общего назначения (General Register - GR). Старший и младший байты регистра GR индивидуально доступны как регистры GRH и GRL соответственно. Доступные только для чтения регистры GRS и GRXL позволяют ввести для регистров GR и GRL знак.
Загрузка в 8-битный получатель младшего байта 16-разрядного источника
Самая простая операция - загрузка 8- разрядного регистра младшим байтом 16- разрядного регистра. Для этой операции не требуется использование регистра GR и требует префиксных операций только в том случае, если индексы регистров получателя и источника соответственно больше 07h и 0Fh.
move OFFS, LC[0] ; копирование младшего байта LC[0] в регистр OFFS
move IMR, @DP[1] ; копирование младшего байта @DP[1] в регистр IMR
move WDCN, LC[0] ; транслируется в команды: move PFX[2], #00h
; move (WDCON-80h), LC[0]
|
Загрузка в 8-битный получатель старшего байта 16-разрядного источника
Для загрузки 8- разрядного регистра значением старшего байта 16- разрядного регистра лучше всего было бы использовать регистр GR. Перенос 16- разрядного значения источника в регистр GR выполняется за один цикл.
move GR, LC[0] ; перемещение значения регистра LC[0] в регистр GR
move IC, GRH ; копирование старшего байта в регистр IC
|
Загрузка 16-битного регистра содержимым двух 8-битных регистров
Два 8- битных источника могут быть связаны и запомнены в 16- разрядном регистре при помощи префиксного регистра, содержащего старший байт передаваемого слова. Дополнительный цикл может потребоваться только если индекс регистра источника больше чем 0Fh или если индекс 16- разрядного получателя больше чем 07h.
move PFX[0], IC ; загрузка содержимого регистра IC в регистр PFX
move @++SP, AP ; сохранение в @DP[0] сцепки IC:AP
; 16-битный субиндекс получателя: dst=08h
; 8-битный субиндекс источника:
; старший = 10h, младший = 11h
move PFX[1], #00h ;
move PFX[3], high ; PFX=00: старший
move dst, low ; dst= старший байт: младший байт
|
Загрузка младшего байта 16-разрядного регистра 8-битным значением регистра источника
Для того, чтобы изменить значение только младшего байта 16- разрядного регистра необходимо сохранить значение этого регистра в регистре GR. Дополнительный цикл потребуется только если индекс получателя больше чем 0Fh.
move GR, DP[0] ; перемещение значения регистра DP[0] в регистр GR
move PFX[0], GRH ; получение значения старшего байта DP[0] через регистр GRH
move DP[0], #20h ; сохранение нового значения регистра DP[0]
; сохранение нового значения регистра DP[0
; 8- битный субиндекс источника: src=11h
move PFX[1], #00h ;
move GR, dst ; считывание слова dst в регистр GR
move PFX[5], GRH ; получение значения старшего байта через регистр GRH
move dst, src ; сохранение нового значения dst
|
Загрузка старшего байта 16-разрядного регистра 8-битным значением регистра источника
Для того чтобы изменить значение только старшего байта 16- разрядного регистра необходимо сохранить значение этого регистра в регистре GR. Дополнительный цикл потребуется только если индекс получателя больше чем 0Fh.
move GR, DP[0] ; перемещение значения регистра DP[0] в регистр GR
move PFX[0], #20h ; получение значения старшего байта DP[0] через регистр GRH
move DP[0], GRL ; сохранение нового значения регистра DP[0
; сохранение нового значения регистра DP[0
; 8- битный субиндекс источника: src=11h
move PFX[1], #00h ;
move GR, dst ; считывание слова dst в регистр GR
move PFX[1], #00h
move PFX[4], src ; получение нового src байта
move dst, GRL ; сохранение нового значения dst
|
Если старший байт должен быть очищен, то операция может быть сохранена за счет передачи 16-разрядному получателю только байта регистра GRL:
move GR, DP[0] ; перемещение значения регистра DP[0] в регистр GR
move DP[0], GRL ; сохранение нового значения регистра DP[0], в старший байт
записано значение 00h
|
|