Логические операции:
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
и тд.
Далее нужно числа превратить в строку для вывода, но это другая задача.
Отправить ответ
Для отправки комментария вам необходимо авторизоваться.