Команды регистрового обмена с сопроцессором (MRC, MCR)
Эти команды будут выполнены, если условие истинно. Все различные условия их выполнения перечислены в таблице 6. Машинный код обеих команд приведен на рис.36.
Рис. 36. Команды регистрового обмена с сопроцессором
Команды этого класса используются для обмена информацией непосредственно между ядром ARM7TDMI и сопроцессором. Например, команда регистровой передачи (MRC) от сопроцессора к ядру ARM7TDMI может быть использована для передачи от сопроцессора 32-битного числа с плавающей запятой (предварительно преобразованное им же в целое 32-битное) непосредственное в регистр общего назначения ARM7TDMI. 32-битное число типа FLOAT, размещенное в регистре ARM7TDMI, может быть передано непосредственно в один из регистров сопроцессора с помощью команды регистровой передачи в сопроцессор (MCR).
Эти команды также очень удобны для передачи/приема управляющей информации между обоими ядрами. Например, можно непосредственно передать флаги сопроцессора в регистр CPSR ядра ARM7DTMI, тем самым управлять ветвлением программы в зависимости от результатов работы сопроцессора.
Поля сопроцессора
Поле CP# используется (как и в остальных командах для работы с сопроцессором) для указания номера сопроцессора, с которым будет производиться обмен.
Поля CP Opc, CRn, CP и CRm используются только самим сопроцессором. Допустима интерпретация этих полей, отличная от стандартной, в зависимости от типа и возможностей сопроцессора. Стандартное назначение этих полей таково: поля CP Opc и CP определяют тип команды, которую должен выполнить сопроцессор, поле CRn - регистр сопроцессора, который может быть либо источником, либо получателем передаваемой информации, и поле CRm - второй регистр сопроцессора, который может быть использован в зависимости от типа команды сопроцессора.
Передача в регистр R15
Когда содержимое регистра сопроцессора передается в регистр ARM7TDMI, в качестве которого используется R15, то биты с 31-го по 28-й передаваемого слова копируются в соответствующие флаги: N, Z, C и V ядра ARM7TDMI. При этом остальные биты этого слова никуда не записываются, регистр при этом PC не подвергается изменениям, а остальные биты регистра CPSR также остаются без изменений.
Передача из регистра R15
В этом случае реально будет передано в сопроцессор содержимое регистра PC плюс 12 ядра ARM7TDMI.
Число машинных тактов
Команда MRC выполняется за 1S + (b+1)I + 1C, где b - число машинных тактов, необходимых для выполнения пустых тактов сопроцессора, а S, I и C зависят от типа машинных тактов.
Команда MRC выполняется за 1S + bI + 1C, где b - число машинных тактов, необходимых для выполнения пустых тактов сопроцессора, а S, I и C зависят от типа машинных тактов.
Синтаксис в ассемблере
<MCR|MRC>{cond} p#,<expression1>,Rd,cn,cm{,<expression2>}
где:
{cond}: |
двухсимвольная мнемоника условия выполнения команды (см. табл. 6); |
MRC: |
передать из сопроцессора в регистр ARM7TDMI (L=1); |
MCR: |
передать из регистра ARM7TDMI в сопроцессор (L=0); |
p#: |
номер сопроцессора, которому адресована команда; |
{выражение1}: |
результат вычисления этого выражения размещается в поле "CP opc"; |
Rd: |
выражение, которое определяет номера регистра ядра ARM7TDMI; |
cn и cm: |
выражения, которые определяют номера регистров сопроцессора для полей CRn, и CRm соответственно; |
{выражение2}: |
вычисления этого выражения размещается в поле "CP". |
Примеры
MRC p2,5,R3,c5,c6 ; Указать сопроцессору #2 на необходимость
; выполнения им команды с кодом 5 для регистров с5 и c6
; и передать результат (32-битное слово) в регистр R3.
MCR p6,0,R4,c5,c6 ; Указать сопроцессору #6 на необходимость
; выполнения им команды с кодом 0 c регистром R4,
; после этого разместить результат в регистре c6.
MRCEQ p3,9,R3,c5,c6,2 ; По условию указать сопроцессору #3 на необходимость
; выполнения им команды с кодом 9 c регистрами c5 и с6,
; после этого разместить результат в регистре R3.
|
<---- Вернуться к Системе команд --->
|