Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Помогите кто шарит в ассемблере

coffe Ученик (64), на голосовании 3 дня назад
Задача:Реверсируем порядок битов числа, сохраненного в AL, то есть переставим
младший бит на место старшего, второй справа — на место второго слева и т. д. Полученный
результат сохраним в АН.Например, наше число равно 0x15, то есть 00010101b. После реверсирования мы
получим его «зеркальное отображение»: 10101000b, то есть 0хА8.
Голосование за лучший ответ
Алекс Куха Высший разум (465826) 1 месяц назад
Шарит мат4асть всегда
pro-prof .com/forums/topic/asm_i8086_16
alternativeGod Гуру (4164) 1 месяц назад
Вот алгоритм и код для решения задачи реверса битов числа в регистре AL и сохранения результата в AH на языке ассемблера. Я использую синтаксис Intel для процессоров x86.

Алгоритм:
Использовать битовые операции, такие как сдвиг (SHR, SHL) и битовые маски.
Последовательно брать младший бит из AL, сдвигать его влево на нужное количество позиций и помещать его в AH.
Код:
asm
Копировать код
section .data
input db 0x15 ; Исходное число (пример из задачи)

section .text
global _start
_start:
mov al, [input] ; Загружаем число из памяти в AL
xor ah, ah ; Обнуляем AH, где будет результат
mov cl, 8 ; Указываем количество битов (8-битное число)

reverse_bits:
shl ah, 1 ; Сдвигаем результат в AH влево на 1 бит
shr al, 1 ; Сдвигаем AL вправо на 1 бит
jc set_bit ; Если старший бит (после сдвига) был 1, установить его
loop reverse_bits ; Уменьшаем CL и продолжаем цикл
jmp done ; Переход к завершению

set_bit:
or ah, 1 ; Устанавливаем младший бит в AH
loop reverse_bits ; Уменьшаем CL и продолжаем цикл

done:
; В AH находится результат
movzx eax, ah ; Перемещаем результат в EAX для проверки или вывода
int 0x80 ; Завершаем программу (Linux, системный вызов exit)
Объяснение:
Инициализация:

Число из памяти загружается в регистр AL.
Регистр AH обнуляется для хранения результата.
Устанавливается счётчик (8 итераций для 8 битов).
Цикл:

В каждой итерации берётся младший бит AL (используя SHR) и добавляется в старший разряд AH (используя SHL).
Если бит был равен 1 (JC проверяет флаг переноса), устанавливается соответствующий бит в AH.
Результат:

После завершения цикла в регистре AH будет число с реверсированными битами.
Пример:
Для числа 0x15 (00010101b):

Итерация 1: Младший бит 1 → AH = 00000001.
Итерация 2: Бит 0 → AH = 00000010.
Итерация 3: Бит 1 → AH = 00000101.
Итерация 8: Все биты обработаны, итог: AH = 10101000b (0xA8).
Результат: AH = 0xA8.

Дополнительно:
Этот код можно протестировать в любом ассемблере, поддерживающем x86 (например, NASM). Если у вас есть вопросы, помогу доработать!
Похожие вопросы