Какой тип инструкции по прерыванию на MARS (MIPS Assembly) - PullRequest
0 голосов
/ 07 ноября 2018

Я пишу статью об эволюции языков программирования и написал небольшую программу в MIPS Assembly, которая вычисляет первые 100 простых чисел. Одной из (псевдо) инструкций этой программы является 'rem $ t3, $ t0, $ t2', которая преобразуется в следующие четыре нативные инструкции:

bne $10, $0, 0x00000001
break
div $8, $10
mfhi$11

Я никогда раньше не замечал эту инструкцию по прерыванию, поэтому я искал повсюду и едва мог найти упоминание о команде прерывания или ее типе.

Единственные два документа, которые я смог найти, где это , в котором говорится "break" как инструкция, используемая отладчиком, и это еще один , в котором говорится "break" как инструкция с три части: специальный (6 бит), код (20 бит) и разрыв (6 бит), но в нем нет ссылки на тип этой инструкции. Это, конечно, не тип R, I или J.

Так что мне было интересно:

  1. Является ли инструкция по прерыванию частью MIPS ISA или только инструкция МАРС признает?
  2. Какой тип инструкции для команды разрыва?
  3. Как он передает управление в обработчик исключений, аппаратно?
  4. Изменяет ли он регистр счетчика программ (ПК)?

1 Ответ

0 голосов
/ 07 ноября 2018

Согласно Архитектура MIPS32 ™ для программистов Том I: Введение в архитектуру MIPS32 ™ , только формат R-Type имеет поле function. BREAK имеет поле function, таким образом, это инструкция R-типа.

Поскольку инструкция BREAK не принимает операндов, для этой цели не используются биты 6..25. Это не так уж необычно; например, SLL не использует поле rs, поэтому эти биты устанавливаются в ноль, а MULT не использует поля rd или sa, поэтому все эти биты установить на ноль.

Что касается того, что происходит: соответствующие биты в регистре 13 CP0 (Cause) будут установлены, чтобы указывать, что исключение произошло в результате достижения точки останова. Затем управление будет передано в код обработчика исключений по какому-то фиксированному адресу.

...