Заменить в заданном слове комбинации 1011 на комбинации 1101 - Assembler

Узнай цену своей работы

Формулировка задачи:

Дано задание: Заменить в заданном слове комбинации 1011 на комбинации 1101 Я попытался его сделать так, но в итоге получаю некорректный ответ в регистре dx=( Где у меня косяк?
.model small;
.data
    a dw 1011b ;Исходные данные. Взял 1011 чисто для тестирования на малом размере данных.
    p dw 1011b ;что ищем
    r dw 1101b ;на что меняем
     buf db  ?
    b dw ?
.code
.486
    mov ax,@data
    mov ds,ax
    mov ax,0
    mov ax,a
    mov cx,16;Инициализируем счетчик
    mov bx,ax
next:
    and bx,1111b;выделяем младшие 4 бита.
    cmp bx,p ; Сравниваемся с шаблоном
    jnz nz  ;Если не равно
    mov bx,r;Заменяем на шаблон
nz:
    mov buf,bl
    OR dh,buf; Склеиваем с предыдущим значением
        shr dx,1 ;сдвигаем вправо результат
    shr ax,1 ;сдвигаем вправо исходные данные
        mov bx,ax
    loop next
    
    mov ah,4ch
    int 21h
end

Решение задачи: «Заменить в заданном слове комбинации 1011 на комбинации 1101»

textual
Листинг программы
; Преобразуемое число в DX
    mov bx, dx
    mov cx, 16 - 4
cykl:
    mov al, bl
    and al, 1111b
    cmp al, 1011b
    jne @
    xor dl, 1011b xor 1101b
@:
    ror bx, 1
    ror dx, 1
    loop    cykl
    mov cl, 4
    ror dx, cl

Объяснение кода листинга программы

В данном коде выполняется замена комбинации 1011 на комбинацию 1101 в заданном слове, которое находится в регистрах BX и DX.

  1. Преобразуемое число в DX
    • Перемещаем число из регистра DX в BX с помощью команды mov bx, dx.
  2. Переменная CX содержит количество бит, которые нужно перебрать
    • Устанавливаем CX равным 16 - 4, чтобы выполнить перебор 12 последних битов числа в DX.
  3. Начальный цикл перебора битов
    • В каждой итерации цикла выполняем следующие действия:
      • Перемещаем значение BL в AL
      • Команда mov al, bl.
      • AL теперь содержит текущий бит, который мы будем проверять.
      • Применяем операцию AND к AL и 1111b
      • Команда and al, 1111b.
      • Результат этой операции будет равен текущему биту, если он установлен.
      • Сравниваем результат с 1011b
      • Команда cmp al, 1011b.
      • Если результат не равен 1011b, то выполняем следующие действия.
      • Если результат не равен 1011b, то переходим к следующей итерации цикла
      • Команда jne @.
      • В противном случае выполняем замену бита
      • Команда xor dl, 1011b xor 1101b.
      • Заменяем бит в DL на противоположный.
  4. Поворот байтов в BX и DX
    • Команды ror bx, 1 и ror dx, 1 выполняют поворот байтов в регистрах BX и DX соответственно.
  5. Повторяем цикл до тех пор, пока все 12 последних битов не будут перебраны
    • Команда loop cykl.
  6. Перемещаем значение CX в CL
    • Команда mov cl, 4.
  7. Поворот байтов в DX с помощью количества битов, равного значению CL
    • Команда ror dx, cl. В результате выполнения данного кода комбинация 1011 будет заменена на комбинацию 1101 в заданном слове, которое находится в регистрах BX и DX.

Оцени полезность:

7   голосов , оценка 3.571 из 5
Похожие ответы