Заменить в заданном слове комбинации 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.
- Преобразуемое число в DX
- Перемещаем число из регистра DX в BX с помощью команды mov bx, dx.
- Переменная CX содержит количество бит, которые нужно перебрать
- Устанавливаем CX равным 16 - 4, чтобы выполнить перебор 12 последних битов числа в DX.
- Начальный цикл перебора битов
- В каждой итерации цикла выполняем следующие действия:
- Перемещаем значение 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 на противоположный.
- В каждой итерации цикла выполняем следующие действия:
- Поворот байтов в BX и DX
- Команды ror bx, 1 и ror dx, 1 выполняют поворот байтов в регистрах BX и DX соответственно.
- Повторяем цикл до тех пор, пока все 12 последних битов не будут перебраны
- Команда loop cykl.
- Перемещаем значение CX в CL
- Команда mov cl, 4.
- Поворот байтов в DX с помощью количества битов, равного значению CL
- Команда ror dx, cl. В результате выполнения данного кода комбинация 1011 будет заменена на комбинацию 1101 в заданном слове, которое находится в регистрах BX и DX.