Forums » Программное обеспечение »
Ассемблер и замена инструкций
Added by paul7 over 8 years ago
Добрый день.
Обнаружил, что в режиме --fix-hardware-errors ассемблер производит некоторые замены инструкций по неочевидным для меня причинам.
Например
getl #0 => orl @0, #0
setl #0, 0 => orl @0, 0 setl #0, @1
С первого взгляда замена функционально эквивалентна оригиналу, на моих простых примерах разницы в поведении не видно.
Не понимаю, какую аппаратную ошибку из описанных в Errata ассемблер пытается таким образом обойти и при каких условиях такие замены будут важны.
Подскажите, пожалуйста.
Целевая платформа - R1.
Replies (6)
RE: Ассемблер и замена инструкций - Added by ak_multiclet over 8 years ago
Данная замена "обходит" баг 204.
Дело в том, что инструкции getl #0
и setl #0, 0
выполняются на этапе декодирования, и, при возникновении прерывания, могут привести к "зависанию" последующих инструкций чтения из памяти, и, в конечном итоге, всего процессора.
RE: Ассемблер и замена инструкций - Added by paul7 over 8 years ago
Спасибо.
Если я правильно понял, то опасные с точки зрения ошибки №204 ситуации описаны следующим параграфом мануала:
В ряде случаев устройство управления может самостоятельно выполнить команду без помещения ее в буфер в команд: 1. Если выбранная команда — чтение регистра. 2. Если для выбранной команды требуется только константа и/или значение регистра ( команды SET, GET, JMP или IRM). 3. Если выбранная команда — чтение из памяти по известному адресу, содержащемуся в константе и/или регистре, и блок DMS не занят.
По всей видимости, следующая замена обусловлена теми же причинами.
jmp XXX => orl @0,@0 jmp @1,XXX
Хотелось бы уточнить вот какие два момента:
1. Что такое чтение регистра в первом пункте, если не GET из второго пункта?
2. Замену в примере с jmp я наблюдаю и при косвенной адресации, т.е. когда XXX = [some_address]. Правильно ли я понял, что это не подпадает под условия возникновения ошибки?
RE: Ассемблер и замена инструкций - Added by ak_multiclet over 8 years ago
Теперь по пунктам:
- Не совсем.
get
ведь может принимать форму не толькоget #R
, но иget V
. Но, согласен, по большому счёту, первый пункт из мануала -- лишний. - Здесь обходится ошибка №303 (проблемы с косвенной адресацией в инструкциях
jxx
).
RE: Ассемблер и замена инструкций - Added by paul7 over 8 years ago
2. Но ведь в errata написано, что jxx [v] работает правильно. Или с точки зрения ассемблера это jxx [@0 + v] и он перестраховывается?
В общем, прояснилось, спасибо!
RE: Ассемблер и замена инструкций - Added by ak_multiclet over 8 years ago
Действительно, посмотрел внимательнее на пример с jmp
, и понял, что наврал Вам.
Ассемблер, действительно, обходит ошибку 204, но не учитывает, что jmp [addr]
этой ошибки не вызывает. И 303-й ошибки не вызывает тоже (до тех пор, пока переход безусловный и адрес не берётся из коммутатора). Т.е. условие в ассемблере слишком слабое. Поправим.
RE: Ассемблер и замена инструкций - Added by ak_multiclet over 8 years ago
Дополнительный анализ показал, что при некоторых условиях (а именно, занятость блока DMS в момент декодирования инструкции) jmp [addr]
тоже может вызывать ошибку 204, и заранее это предсказать невозможно. Так что ассемблер тут прав, а errata -- нет.