section .bss
x resq 1 ;пригодится для вывода
section .data
n dq 0xABC8547F ; наше число
section .text ; начинаем программу
global _start
start:
mov r10, [n] ;запишем число в регистр
mov rdi, r10 ;передадим его как параметр через rdi
call print_bin ;и выведем
mov rdi, r10 ;rdi - параметр вызываемой функции
call find_max_tetrade;найдём максимальную тетраду
mov rdi, r10 ;первый параметр
mov rsi, rax ;второй параметр
call all_xor ;преобразуем число
mov rdi, rax ;результат функции в rax
call print_bin ;выведем его
call the_end ;без комментарием
all_xor:
;нужно rsi сксорить со всеми чётными тетрадами rdi
mov r8, rdi ;r8 понадобится для проверки чётности
while4: ;пуск цикла
mov r9, r8 ;с помощью r9 проверим чётность последней тетрады r8
and r9, 1
jnz if2 ;если тетрада нечётна, пропустим следующую операцию
xor rdi, rsi; xor двух параметров функции
if2:
shr r8, 4 ;сдвинем r8, что бы перейти к следующей тетраде
shl rsi, 4 ;сдивнем rsi, что бы ксорить уже с другой тетрадой
cmp esi, 0 ;если в последний 32-ух битах rsi одни нули - мы закончили
jnz while4
mov rax, rdi ;закинуть результат преобразования в rax
ret ;выход из функции
find_max_tetrade: ;Найдём максимальную тетраду в параметре rdi
mov r8, 0 ;текущий максимум храним в r8
while3: ;старт цикла
mov r9, rdi ;последняя тетрада rdi окажется в r9
and r9, 0xF
cmp r9, r8
js if1 ;если r9 < r8, пропустим присваивание r8 значение r9
mov r8, r9
if1:
shr rdi, 4 ;сдвинем rdi для перехода к следующей тетраде
jnz while3 ;закончим цикл, если rdi равен 0
mov rax, r8 ;закинем результат (максимум) в rax
ret
print_bin: ;выведем число на экран
push 10 ;закинем в стек символ переноса строкм
mov r9, 32 ;r9 - счётчик цикла (loop не работает)
while1:
mov r8, rdi ;в r8 будет последний бит rdi
and r8, 1
add r8, '0' ;прибавим ascii код нуля
push r8 ;и закинем очередной символ в стек
shr rdi, 1 ;сдвинем rdi, для перехода к следующему биту
dec r9 ;уменьшим счётчик и проверим
jnz while1
mov rax, 1 ;подготовим регистры к вызову syscall
mov rdi, 1
mov rsi, x
mov rdx, 1
mov r9, 33 ;выводим 33 символа - 32 бита и перенос строки
while2:
pop qword[x] ;достаём символ из стека в ячейку памяти номер x
syscall ;выводим символ
dec r9 ;уменьшаем счётчик и проверяем
jnz while2
ret
the_end: ;решил написать отдельную функцию для завершения
mov rax, 60 ;60 - системный вызов команды завершения
mov rdi, 0 ;0 - возвращаемое значение
syscall ;завершение кода
ret ;пусть будет - для приличия
c2VjdGlvbiAuYnNzCgp4IHJlc3EgMSA70L/RgNC40LPQvtC00LjRgtGB0Y8g0LTQu9GPINCy0YvQstC+0LTQsAoKc2VjdGlvbiAuZGF0YQoKbiBkcSAweEFCQzg1NDdGIDsg0L3QsNGI0LUg0YfQuNGB0LvQvgoKc2VjdGlvbiAudGV4dCA7INC90LDRh9C40L3QsNC10Lwg0L/RgNC+0LPRgNCw0LzQvNGDCgpnbG9iYWwgX3N0YXJ0CgpzdGFydDoKCm1vdiByMTAsIFtuXSA70LfQsNC/0LjRiNC10Lwg0YfQuNGB0LvQviDQsiDRgNC10LPQuNGB0YLRgAoKbW92IHJkaSwgcjEwIDvQv9C10YDQtdC00LDQtNC40Lwg0LXQs9C+INC60LDQuiDQv9Cw0YDQsNC80LXRgtGAINGH0LXRgNC10LcgcmRpCgpjYWxsIHByaW50X2JpbiA70Lgg0LLRi9Cy0LXQtNC10LwKCm1vdiByZGksIHIxMCA7cmRpIC0g0L/QsNGA0LDQvNC10YLRgCDQstGL0LfRi9Cy0LDQtdC80L7QuSDRhNGD0L3QutGG0LjQuAoKY2FsbCBmaW5kX21heF90ZXRyYWRlO9C90LDQudC00ZHQvCDQvNCw0LrRgdC40LzQsNC70YzQvdGD0Y4g0YLQtdGC0YDQsNC00YMKCm1vdiByZGksIHIxMCA70L/QtdGA0LLRi9C5INC/0LDRgNCw0LzQtdGC0YAKCm1vdiByc2ksIHJheCA70LLRgtC+0YDQvtC5INC/0LDRgNCw0LzQtdGC0YAKCmNhbGwgYWxsX3hvciA70L/RgNC10L7QsdGA0LDQt9GD0LXQvCDRh9C40YHQu9C+Cgptb3YgcmRpLCByYXggO9GA0LXQt9GD0LvRjNGC0LDRgiDRhNGD0L3QutGG0LjQuCDQsiByYXgKCmNhbGwgcHJpbnRfYmluIDvQstGL0LLQtdC00LXQvCDQtdCz0L4KCmNhbGwgdGhlX2VuZCA70LHQtdC3INC60L7QvNC80LXQvdGC0LDRgNC40LXQvAoKYWxsX3hvcjoKCjvQvdGD0LbQvdC+IHJzaSDRgdC60YHQvtGA0LjRgtGMINGB0L4g0LLRgdC10LzQuCDRh9GR0YLQvdGL0LzQuCDRgtC10YLRgNCw0LTQsNC80LggcmRpCgptb3YgcjgsIHJkaSA7cjgg0L/QvtC90LDQtNC+0LHQuNGC0YHRjyDQtNC70Y8g0L/RgNC+0LLQtdGA0LrQuCDRh9GR0YLQvdC+0YHRgtC4Cgp3aGlsZTQ6IDvQv9GD0YHQuiDRhtC40LrQu9CwCgptb3YgcjksIHI4IDvRgSDQv9C+0LzQvtGJ0YzRjiByOSDQv9GA0L7QstC10YDQuNC8INGH0ZHRgtC90L7RgdGC0Ywg0L/QvtGB0LvQtdC00L3QtdC5INGC0LXRgtGA0LDQtNGLIHI4CgphbmQgcjksIDEKCmpueiBpZjIgO9C10YHQu9C4INGC0LXRgtGA0LDQtNCwINC90LXRh9GR0YLQvdCwLCDQv9GA0L7Qv9GD0YHRgtC40Lwg0YHQu9C10LTRg9GO0YnRg9GOINC+0L/QtdGA0LDRhtC40Y4KCnhvciByZGksIHJzaTsgeG9yINC00LLRg9GFINC/0LDRgNCw0LzQtdGC0YDQvtCyINGE0YPQvdC60YbQuNC4CgppZjI6CgpzaHIgcjgsIDQgO9GB0LTQstC40L3QtdC8IHI4LCDRh9GC0L4g0LHRiyDQv9C10YDQtdC50YLQuCDQuiDRgdC70LXQtNGD0Y7RidC10Lkg0YLQtdGC0YDQsNC00LUKCnNobCByc2ksIDQgO9GB0LTQuNCy0L3QtdC8IHJzaSwg0YfRgtC+INCx0Ysg0LrRgdC+0YDQuNGC0Ywg0YPQttC1INGBINC00YDRg9Cz0L7QuSDRgtC10YLRgNCw0LTQvtC5CgpjbXAgZXNpLCAwIDvQtdGB0LvQuCDQsiDQv9C+0YHQu9C10LTQvdC40LkgMzIt0YPRhSDQsdC40YLQsNGFIHJzaSDQvtC00L3QuCDQvdGD0LvQuCAtINC80Ysg0LfQsNC60L7QvdGH0LjQu9C4Cgpqbnogd2hpbGU0Cgptb3YgcmF4LCByZGkgO9C30LDQutC40L3Rg9GC0Ywg0YDQtdC30YPQu9GM0YLQsNGCINC/0YDQtdC+0LHRgNCw0LfQvtCy0LDQvdC40Y8g0LIgcmF4CgpyZXQgO9Cy0YvRhdC+0LQg0LjQtyDRhNGD0L3QutGG0LjQuAoKZmluZF9tYXhfdGV0cmFkZTogO9Cd0LDQudC00ZHQvCDQvNCw0LrRgdC40LzQsNC70YzQvdGD0Y4g0YLQtdGC0YDQsNC00YMg0LIg0L/QsNGA0LDQvNC10YLRgNC1IHJkaQoKbW92IHI4LCAwIDvRgtC10LrRg9GJ0LjQuSDQvNCw0LrRgdC40LzRg9C8INGF0YDQsNC90LjQvCDQsiByOAoKd2hpbGUzOiA70YHRgtCw0YDRgiDRhtC40LrQu9CwCgptb3YgcjksIHJkaSA70L/QvtGB0LvQtdC00L3Rj9GPINGC0LXRgtGA0LDQtNCwIHJkaSDQvtC60LDQttC10YLRgdGPINCyIHI5CgphbmQgcjksIDB4RgoKY21wIHI5LCByOAoKanMgaWYxIDvQtdGB0LvQuCByOSA8IHI4LCDQv9GA0L7Qv9GD0YHRgtC40Lwg0L/RgNC40YHQstCw0LjQstCw0L3QuNC1IHI4INC30L3QsNGH0LXQvdC40LUgcjkKCm1vdiByOCwgcjkKCmlmMToKCnNociByZGksIDQgO9GB0LTQstC40L3QtdC8IHJkaSDQtNC70Y8g0L/QtdGA0LXRhdC+0LTQsCDQuiDRgdC70LXQtNGD0Y7RidC10Lkg0YLQtdGC0YDQsNC00LUKCmpueiB3aGlsZTMgO9C30LDQutC+0L3Rh9C40Lwg0YbQuNC60LssINC10YHQu9C4IHJkaSDRgNCw0LLQtdC9IDAKCm1vdiByYXgsIHI4IDvQt9Cw0LrQuNC90LXQvCDRgNC10LfRg9C70YzRgtCw0YIgKNC80LDQutGB0LjQvNGD0LwpINCyIHJheAoKcmV0CgpwcmludF9iaW46IDvQstGL0LLQtdC00LXQvCDRh9C40YHQu9C+INC90LAg0Y3QutGA0LDQvQoKcHVzaCAxMCA70LfQsNC60LjQvdC10Lwg0LIg0YHRgtC10Log0YHQuNC80LLQvtC7INC/0LXRgNC10L3QvtGB0LAg0YHRgtGA0L7QutC8Cgptb3YgcjksIDMyIDtyOSAtINGB0YfRkdGC0YfQuNC6INGG0LjQutC70LAgKGxvb3Ag0L3QtSDRgNCw0LHQvtGC0LDQtdGCKQoKd2hpbGUxOgoKbW92IHI4LCByZGkgO9CyIHI4INCx0YPQtNC10YIg0L/QvtGB0LvQtdC00L3QuNC5INCx0LjRgiByZGkKCmFuZCByOCwgMQoKYWRkIHI4LCAnMCcgO9C/0YDQuNCx0LDQstC40LwgYXNjaWkg0LrQvtC0INC90YPQu9GPCgpwdXNoIHI4IDvQuCDQt9Cw0LrQuNC90LXQvCDQvtGH0LXRgNC10LTQvdC+0Lkg0YHQuNC80LLQvtC7INCyINGB0YLQtdC6CgpzaHIgcmRpLCAxIDvRgdC00LLQuNC90LXQvCByZGksINC00LvRjyDQv9C10YDQtdGF0L7QtNCwINC6INGB0LvQtdC00YPRjtGJ0LXQvNGDINCx0LjRgtGDCgpkZWMgcjkgO9GD0LzQtdC90YzRiNC40Lwg0YHRh9GR0YLRh9C40Log0Lgg0L/RgNC+0LLQtdGA0LjQvAoKam56IHdoaWxlMQoKbW92IHJheCwgMSA70L/QvtC00LPQvtGC0L7QstC40Lwg0YDQtdCz0LjRgdGC0YDRiyDQuiDQstGL0LfQvtCy0YMgc3lzY2FsbAoKbW92IHJkaSwgMQoKbW92IHJzaSwgeAoKbW92IHJkeCwgMQoKbW92IHI5LCAzMyA70LLRi9Cy0L7QtNC40LwgMzMg0YHQuNC80LLQvtC70LAgLSAzMiDQsdC40YLQsCDQuCDQv9C10YDQtdC90L7RgSDRgdGC0YDQvtC60LgKCndoaWxlMjoKCnBvcCBxd29yZFt4XSA70LTQvtGB0YLQsNGR0Lwg0YHQuNC80LLQvtC7INC40Lcg0YHRgtC10LrQsCDQsiDRj9GH0LXQudC60YMg0L/QsNC80Y/RgtC4INC90L7QvNC10YAgeAoKc3lzY2FsbCA70LLRi9Cy0L7QtNC40Lwg0YHQuNC80LLQvtC7CgpkZWMgcjkgO9GD0LzQtdC90YzRiNCw0LXQvCDRgdGH0ZHRgtGH0LjQuiDQuCDQv9GA0L7QstC10YDRj9C10LwKCmpueiB3aGlsZTIKCnJldAoKdGhlX2VuZDogO9GA0LXRiNC40Lsg0L3QsNC/0LjRgdCw0YLRjCDQvtGC0LTQtdC70YzQvdGD0Y4g0YTRg9C90LrRhtC40Y4g0LTQu9GPINC30LDQstC10YDRiNC10L3QuNGPCgptb3YgcmF4LCA2MCA7NjAgLSDRgdC40YHRgtC10LzQvdGL0Lkg0LLRi9C30L7QsiDQutC+0LzQsNC90LTRiyDQt9Cw0LLQtdGA0YjQtdC90LjRjwoKbW92IHJkaSwgMCA7MCAtINCy0L7Qt9Cy0YDQsNGJ0LDQtdC80L7QtSDQt9C90LDRh9C10L3QuNC1CgpzeXNjYWxsIDvQt9Cw0LLQtdGA0YjQtdC90LjQtSDQutC+0LTQsAoKcmV0IDvQv9GD0YHRgtGMINCx0YPQtNC10YIgLSDQtNC70Y8g0L/RgNC40LvQuNGH0LjRjw==