Приписать по единице в начало и конец двоичной записи натурального числа.
давно это было... но попытаемся что-нибудь прояснить в памяти...
- определимся сначала что есть натуральные числа - это целые, бесзнаковые
- где можно хранить такие числа? ну например в регистрах AL, AX, EAX (8 бит, 16 бит, 32 бита соотв.), это значит что натуральное число может храниться в ячейках разного размера и то что число может быть ограничено соотв. диапазоном значений... но для примера возьмём 8-битное число, т.е. то которое влазит в AL - т.е. байт
- итак мне лично нравится число 10 - его двоичное педставление 1010b
- я так понимаю что на выходе должно получиться 110101b
- ту единичку, которая зелёная можно получить путём сдвига всего числа влево и прибавлением единицы... т.е.
mov al, 1010b
shl al, 1
inc al - ну а ту что красная... тут наверное есть несколько способов, но мне кажется самый очевидный - это подсчитать сколько значащих разрядов в числе, а потом на такое же кол-во + 1 сдвинуть вправо единицу, ну и полученный результат проORить с исходным значением...
- итак попробуем подсчитать кол-во начащих символов, будем сдвигать наше число (предварительно сохранив его где-нибудь) вправо - после сдвига проверяем флаг Zero - т.е. что число не стало нулём, если не стало увеличиваем счётчик на 1 и снова сдвигаем...
mov al, 1010b ;инициализируем al нашим числом
mov ah, al ;сохраним значение al в ah
mov cx, 0 ;обнуляем счётчик
; подсчитываем кол-во значащих разрядов в нашем числе путём сдвига
m1:
shr al, 1
jz m2 ; если флаг ZF выставлен - то значение al = 0, следовательно выходим
inc cx
jmp m1
m2:
inc cx ; увеличим ещё на один - чтобы единичка стала красной ;-)
; теперь двигаем на cx-раз 1 влево
m3:
mov al, 1
shl al, 1
dec cx
jnz m3
; тут думается что al = 10000b
; тут OR-им, т.е. накладывает нашу единичку
or al, ah
; тут подразумеваем что al уже в виде 11010b
исходников которые можно было бы скомпилировать не прилагаю, т.к не знаю какой OS вы пользуетесь и каким ассемблером... да и подзабыл я уже немного :-))
на этом всё.
Комментариев нет:
Отправить комментарий