Чтобы понять, почему создаются инструкции 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: