Вставка заданного значения (0 или 1) в любой бит байта со сдвигом влево - Assembler
Формулировка задачи:
Реализуйте с помощью логических операций вставку заданного значения (0 или 1) в любой бит байта со сдвигом влево и потерей крайнего бита. Как ассемблерная вставка в C++. Мне бы и код на обоих языках. И пожалуйста, поясните что происходит в строчках кода.
Решение задачи: «Вставка заданного значения (0 или 1) в любой бит байта со сдвигом влево»
textual
Листинг программы
mov al, [Val] mov cx, [BitNo] mov bx, [BitVal] and bx, 1 ;выделение младшего бита and cx, 7h ;ограничение номера бита одним байтом shl bx, cl ;получение маски вставляемого бита mov ah, al ;обнуление правой части байта shr ah, cl shl ah, cl shl ah, 1 sub cl, 8 ;обнуление левой части байта neg cl shl al, cl shr al, cl or al, ah ;объединение левой и правой частей or al, bl ;сохранение вставляемого бита mov [Val], al
Объяснение кода листинга программы
- Переменная Val содержит значение, в которое необходимо вставить бит.
- Переменная BitNo содержит номер бита, который необходимо сдвинуть влево.
- Переменная BitVal содержит значение бита, который необходимо вставить.
- Выделение младшего бита переменной BitVal с помощью операции and с числом 1.
- Ограничение номера бита одним байтом с помощью операции and с числом 7h.
- Получение маски вставляемого бита с помощью операции shl, используя значение переменной BitNo.
- Обнуление правой части байта переменной Val с помощью операций mov, shr и shl.
- Обнуление левой части байта переменной Val с помощью операции sub и neg.
- Объединение левой и правой частей байта с помощью операции or, используя значение переменной Val.
- Сохранение вставляемого бита с помощью операции or, используя значение переменной Bl.
- Запись обновленного значения переменной Val в память с помощью операции mov.