Главная страница
Навигация по странице:

  • Решение

  • Ассемблер. Задание вводится два числа k и f, необходимо первое число k циклически сдвинуть вправо, на f. Циклически сдвинуть, то есть выпадающие биты справа закидывать в старшие входные биты.


    Скачать 94.78 Kb.
    НазваниеЗадание вводится два числа k и f, необходимо первое число k циклически сдвинуть вправо, на f. Циклически сдвинуть, то есть выпадающие биты справа закидывать в старшие входные биты.
    АнкорАссемблер
    Дата04.05.2022
    Размер94.78 Kb.
    Формат файлаdocx
    Имя файлаАссемблер.docx
    ТипРешение
    #512323

    Задание: вводится два числа k и f, необходимо первое число k циклически сдвинуть вправо, на f. Циклически сдвинуть, то есть выпадающие биты справа закидывать в старшие входные биты. Пример для 8 битного числа 11010010, сдвигаем на 2 вправо, получается 10110100. У тебя же будут 32-битные числа. Использовать только базовый набор инструкций. Ввод числа делать константой.

    Решение: Для выполнения задания создаётся программа, состоящая из трёх секций: 1) Секция с датой, т.е. с данными, где они объявляются и резервируются; 2) Секция с кодом, в которой записывается программа; 3) Секция с таблицей импорта, где импортируются библиотеки и методы из библиотек и им даются псевдонимы, чтобы обращаться к ним из секции с кодом.

    В секции с кодом с метки Start начинается программа. Для записи 32-битных чисел используется регистр eax. Для начала необходимо обнулить регистр eax, используя команду xor, т.к. складывая по модулю 2 регистр с им же самим-он обнуляется. Следом, в младший байт младшего слова записывается 32-битное число k. Для циклического сдвига вправо используем команду ror и записываем число f, на которое будет сдвигаться число k. Сдвигаемые вправо биты записываются в тот же операнд слева. Следом, в стек заносится весь регистр eax и выводится на экран, что в нём находится.

    Тело кода:


    format PE console
    entry Start
    include 'win32a.inc'
    section 'data' data readable writable
    resStr db 'Result: %d', 0

    A dw ?

    B dw ?

    C dw ?
    NULL = 0
    section '.code' code readable executable
    Start:

    xor eax, eax

    mov eax, 11111011110011110110101110010011b

    ror eax, 3
    push eax

    push resStr

    call [printf]
    call [getch]
    push NULL

    call [ExitProcess]
    section '.idata' import data readable
    library kernel, 'kernel32.dll',\

    msvcrt, 'msvcrt.dll'
    import kernel, \

    ExitProcess, 'ExitProcess'
    import msvcrt, \

    printf, 'printf',\

    scanf, 'scanf',\

    getch, '_getch'



    Проверка:



    написать администратору сайта