SHR — побитовое деление (NASM)

Логические  операции:

AND  — когда оба

OR — хотя-бы один

XOR — обнуление

NOT — перевернуть знак

SHL — умножение на степень 2 / побитовый сдвиг влево

SHR — деление на степень 2 / побитовый сдвиг вправо

 

SHR — деление

Начнем с деления.  Сдвигом мы можем делить на степени двойки  — 2, 4,8,16,32,64,128,256,512,1024 и тд.

Разделим сдвигом  256 на 8.

Регист AX состоит из двух частей младшие 8 бит AL  и старшие 8 бит AH. Вместе  AL+AH образуют  AX, регистр который 8 бит + 8 бит = 16 битный.

Поместить число 256 в AL мы не можем, потому что это больше чем   максимально возможное для 8 бит число 255 (0-255), поэтому используем весь 16 битный регистр AX.  

 mov ax, 256

Итак, число 256 в регистре AX

Теперь нужно число на которое мы делим — это 8. Восемь в битовом представлении это:

16  8  4  2  1

0    1  0  0  0

      8

В двоичном числе 01000 — слева направо начиная с 0 тот бит где стоит 1 по счету 4, но если считать от 0, то он будет 3

4 3 2 1 0  

0 1 0 0 0

   3-й бит (четвертый по счету) = 8

Значит  для деления на 8 нужно сдвинуть на 3 бита (8)

shr ax, 3

Итого пример кода:

                 

segment .txt

mov ax,256

shr ax,3

Как это происходит побитово.

В0т число 256 в побитовом варианте

256 128 64 32 16 8 4 2 0
1 0 0 0 0 0 0 0 0

А теперь представим что нам надо 1 сдвинуть на 3 позиции в право c помощью SHR, соответственно 1 переместится c позиции 256 на позицию 32. 

256 128 64 32 16 8 4 2 0
> > > 1 0 0 0 0 0

Это и есть ответ — 256/8 = 32

256 128 64 32 16 8 4 2 0
> > > 1 0 0 0 0 0
1 перв втор трет          

Полный код:

section .bss

buff times 16 db 0  ; или buff resb 16

segment .txt

global _start

_start:

; поместим число в ax

mov ax,256

; разделим на 8 (3 бит, т.е 2^3, два в степени 3)

shr ax,3

;Поместим адрес буфера в rdi

mov rdi, buff

и тд.

Далее нужно числа превратить в строку для вывода, но это другая задача.

 

Оставьте первый комментарий

Отправить ответ