Заменить 1011 в слове на 1101

Рейтинг: 1Ответов: 1Опубликовано: 12.04.2015

Дано задание: заменить в заданном слове комбинации 1011 на комбинации 1101.

Не до конца понимаю, как делать это задание:

  1. Копирую данные в регистр
  2. Выделяю младшие 4 бита через AND с маской 1111
  3. Делаю CMP c 1011.
  4. В зависимости от результата я делаю JMP
  5. Записываю результат в другой регистр(Пытаюсь собрать результат в другом регистре)
  6. Восстанавливаю исходные данные в регистре(До применения AND) и делаю сдвиг на 1
  7. Выполняю опять все проверки
  8. Теперь нужно результаты этой итерации совместить с 5 шагом... Вот на этом шаге я не понимаю что делать... Как мне результаты текущей итерации объединить с результатами предыдущей итерации в результирующем регистре?

Буду признателен, если расскажете, как это делать или еще лучше кините пример на TASM.

Ответы

▲ 2Принят

Попробуйте так:

  1. Текущая маска = 1111b, текущее число из данных в регистр, текущий сдвиг 0
  2. Цикл:
  3. Выделить дополнение маски (not) в другой регистр
  4. Применить маску к числу (and) и сдвинуть вправо на значение текущего сдвига
  5. Проверить результат, сравнить с 1011b
  6. Если не равно, переходим к пункту 8
  7. Заменяем. Для этого вычисляем часть числа вне маски (and с дополнением маски), новую часть «под» маской (1101b сдвинутое влево на значение текущего сдвига) и соединяем их (or)
  8. Сдвигаем маску влево на 1 бит, увеличиваем на 1 текущий сдвиг
  9. Если текущий сдвиг всё ещё меньше разрядности данных, возвращаемся в пункт 2

Расписывать на ассемблере не буду, всё-таки учебное задание.

Ключевая идея: разделять данные на часть под маской и остальное.

Возможная оптимизация: цикл можно крутить лишь до тех пор, пока текущий сдвиг + 3 меньше разрядности данных. Выигрыш 3 итерации.