Упражнение в инструкциях MIPS - PullRequest
1 голос
/ 24 сентября 2019

Я новичок в MIPS, и мы сделали упражнение в классе, где мы должны записать последовательность инструкций MIPS, которая записывает значение «-1» в регистр s6, если бит находится в седьмой позиции (изсправа) регистра s0 равен «1» (в противном случае регистр s6 остается неизменным).Предполагается, что первые 16 битов s0 - все нули.

Для справки (возможны ошибки):

Псевдокод:

if(s0[10]==1)
  s6 <- -1:

Инструкции MIPS:

andi $t1, $s0, 0x0040
beq $t1, $0, END_IF
addi $s6, $0, -1

Я не очень понимаю, почему мы рассматриваем s0[9] и как мы получили Инструкции MIPS.Может кто-нибудь подробно объяснить, как это работает?Мне сказали, что мы должны сделать «маску», чтобы увидеть, есть ли бит в регистре, но пока это не очень понятно.

Редактировать: if(s0[9]==1) -> if(s0[10]==1)

Ответы [ 2 ]

1 голос
/ 24 сентября 2019

Чтобы понять, почему создаются инструкции MIPS для реализации вашего псевдокода, вы должны сначала понять основы побитовых операций.В этом случае вы имеете дело с побитовой операцией AND .Побитовое И - отличный способ проверить, установлены ли определенные биты или нет.Такая проверка часто включает использование так называемой битовой маски.Битовые маски используют преимущество свойства идентичности логической логики.Другими словами, любой бит AND'd с 1 сохраняет свое значение, в то время как любой бит AND'd с 0 приводит к нулю.Рассмотрим несколько следующих примеров:

      01000
(AND) 11000
      -----
      01000


      01010
(AND) 11111
      -----
      01010


      01010
(AND) 00000
      -----
      00000

Обратите внимание, что битовая маска 11111 сохраняет исходное значение первого операнда, а битовая маска 00000 всегда приводит к 00000.

Теперь примените это к вашей проблеме.Если вы хотите проверить, установлен ли определенный бит, скажем, 11-й бит из крайней правой позиции, то вы можете сделать это, создав битовую маску с 11-м битом, установленным в 1, а остальные - в ноль.Например, от шестнадцатеричного до двоичного мы имеем:

0x400 = 0000010000000000

Обратите внимание, как 11-й бит из крайней правой позиции установлен в 1 в шестнадцатеричном значении 0x400.Помните, это только в том случае, если мы начнем считать с 1.

Собираем все вместе.Чтобы проверить, если $s0[10] == 1 (11-й бит), мы знаем, что можем использовать шестнадцатеричное значение 0x400 и побитовое AND.Если установлен 11-й бит, результат $s0 AND 0x400 должен привести к ненулевому значению.В противном случае результат равен нулю.Теперь давайте разберемся с кодом MIPS.

andi $t1, $s0, 0x00400  ; perform the AND and store the result in $t1
beq $t1, $0, END_IF     ; if $t1 is zero, then the 11th bit must not have been set. BRANCH past the following instruction!
addi $s6, $0, -1        ; Ah! We didn't take the branch so the 11th bit was set, so assign -1 to $s6
END_IF:

Надеюсь, это прояснит то, что вы видите.

ПРИМЕЧАНИЕ - Это был ваш первоначальный запрос: " напишитепоследовательность инструкций MIPS, которая записывает значение «-1» в регистр s6, если бит в седьмой позиции (справа) регистра s0 равен «1» (в противном случае регистр s6 остается неизменным) »

Мы можем использовать ту же логику, что и выше, но нам нужна другая битовая маска.Битовая маска для проверки 7-го бита справа будет выглядеть как 0x40 = 01000000. Здесь мы должны быть осторожны, основываясь на формулировке.7-й бит справа означает, что мы не считаем с нуля. Таким образом, мы можем фактически использовать тот же алгоритм, что и раньше, если редактируем битовую маску.

andi $t1, $s0, 0x40     ; perform the AND and store the result in $t1
beq $t1, $0, END_IF     ; if $t1 is zero, then the 7th bit must not have been set. BRANCH past the following instruction!
addi $s6, $0, -1        ; Ah! We didn't take the branch so the 7th bit was set, so assign -1 to $s6
END_IF:
1 голос
/ 24 сентября 2019

MIPS в более человеческие инструкции:

$t1 = $s0 bitand 0x00400   # note that 0x00400 is the 10th bit set, so anding s0 against that will give a number that is either 0, or 0x00400 if the 10th bit was set)
if $t1 == 0 -> goto endif
else  $s6 = -1

Поэтому, если 10-й бит не установлен, переходите к endif, в противном случае установите s6

...