CMP вычитает r1 из r0 (r0-r1) и затем устанавливает флаг для BNE относительно того, равны ли эти два (результат равен 0) или нет (результат не равен 0).
Чтобы вычесть в двоичном виде, вы должны использовать «комплимент от двойки» , где вы берете r1, отрицаете его, добавляете 1 к нему, а затем добавляете это к r0. Если результатом сложения являются все 0, оно считается равным. В противном случае он помечается как неравный. Здесь важно помнить, что есть флаг. В этом случае он устанавливает флаг "Z" . Таким образом, BNE может работать правильно.
r0 (00100000) [32]
r1 (00111000) [56]
Отрицание r1: (11000111) [-57] # Первый бит числа со знаком указывает, является ли он
отрицательно обычно. 1 обычно означает отрицательный, когда впереди, как это.
Добавление значений: # Помните, что это в основном стандартная операция ИЛИ, но с
функция переноса, если оба бита равны 1.
(00100000)
(11000111)
ADD
(11100111) # Это не 0 и, следовательно, не устанавливает флаг Z.
EOR выполняет логическую побитовую операцию с данными в r0 и r1, объединяя их в XOR и сохраняя результат в r5.
Это происходит следующим образом: XOR приводит к 0, если оба бита равны 0 или оба бита равны 1. В противном случае он возвращает 1.
r5 (00000000) # Для простоты я предполагаю, что r5 пуст.
r0 (00001111)
r1 (00011111)
XOR (00010000)
r5 (00010000) # Результат XOR скопирован в r5.
Вы использовали суффикс S, который запускает флаг, чтобы решить его, верно?
В чем другое отличие от операций? Регистры назначения. Я подозреваю, что вам нужно хранить в r0, а не в r5, поскольку BNE может не проверять r5. В любом случае, это мое мнение.