Сборка заменяет CMP на EORS перед прыжком - PullRequest
0 голосов
/ 26 июня 2011

Я использую процессор ARM, но я предполагаю, что вопрос одинаков для всех процессоров.

Я бы хотел использовать инструкцию EOR (битовое исключающее ИЛИ) вместо CMP, потому что я должен найти несопоставимые биты после перехода.

Но я не знаю, почему кажется, что

CMP r0, r1
BNE .somewhere

не является "эквивалентом"

EORS r5, r0, r1
BNE .somewhere

Это нормально или я должен искать свою проблему снова?

Спасибо в

Ответы [ 2 ]

1 голос
/ 26 июня 2011

CMP не является «эквивалентом» EORS.Инструкция CMP - это, по сути, SUBS, которая отбрасывает результат вычитания.

Существует инструкция ARM, которая выполняет EORS, но выбрасывает результат.Это TEQ.Возможно, вы хотели это вместо CMP?

0 голосов
/ 26 июня 2011

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. В любом случае, это мое мнение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...