Прочитав эту статью, ты научишься пользоваться арифметическими и логическими инструкциями, а также инструкциями сдвига. Попутно узнаешь, как создавать подпрограммы. А в конце напишешь простенькую игрушку «Угадай число».

Большинство тех инструкций, о которых ты узнаешь из этой статьи, принимают на входе два аргумента. Каждый отдельно взятый аргумент — это либо регистр, либо память, либо константа. Почти все их сочетания допустимы: регистр-регистр, регистр-память, память-регистр, регистр-константа, память-константа. Единственное недопустимое сочетание — память-память.

Регистры могут быть 16- или 8-битными. 16-битные регистры: AX, BX, CX, DX, SI, DI, BP и SP. 8-битные регистры: AH, AL, BH, BL, CH, CL, DH и DL.

 

Пишем вспомогательную подпрограмму

У всех программ, которые мы с тобой сейчас напишем, есть повторяющееся действие: вывести результат на экран. Чтобы не писать код для этого действия каждый раз заново, давай напишем для него подпрограмму.

Что такое подпрограмма? Это кусок кода, который выполняет какую-то небольшую задачу. К подпрограмме обычно обращаются через инструкцию call. Все подпрограммы заканчиваются инструкцией ret (RETurn).

Пока это все, что тебе нужно знать о подпрограммах. Конечно, по-хорошему, когда пользуешься подпрограммами, надо бы понимать еще несколько вещей, в частности что такое указатель стека и как он меняется при обращении к подпрограмме. Но пока, в рамках текущего урока, давай просто условимся, что если тебе надо нарисовать на экране букву, просто вставляй в свой код вот такую инструкцию.

Реализация подпрограммы call display_letter представлена ниже. Сохрани ее в файл library.asm.

Важно! В конец всех программ, которые мы напишем, тебе надо будет вставлять код из library.asm. К чему это приведет? Все программы будут заканчиваться выходом в командную строку, и у них будут подпрограммы для вывода символа на экран (из регистра AL) и для считывания символа с клавиатуры (результат помещается в регистр AL).

 

Учимся складывать и вычитать

В качестве аргументов для инструкции сложения давай задействуем регистр AL и константу.

Эта программа выводит на экран цифру 7. Потому что 4 + 3 = 7.

В качестве аргументов для инструкции вычитания давай возьмем регистр AL и константу.

Эта программа выводит на экран цифру 1. Потому что 4 – 3 = 1.

Продолжение доступно только участникам

Вариант 1. Присоединись к сообществу «Xakep.ru», чтобы читать все материалы на сайте

Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее

Вариант 2. Открой один материал

Заинтересовала статья, но нет возможности стать членом клуба «Xakep.ru»? Тогда этот вариант для тебя! Обрати внимание: этот способ подходит только для статей, опубликованных более двух месяцев назад.


Антон Карев

Антон Карев

Окончил физтех Алтайского госуниверситета. 20 лет занимаюсь низкоуровневым программированием на Ассемблере и Си. С уклоном в Secure Coding. Провожу в скайпе индивидуальные уроки по программированию на Ассемблере, Си, Питоне. Хочешь пообщаться? Пиши на email: anton.barnaul.1984@mail.ru

Check Also

RDP over SSH. Как я писал клиент для удаленки под винду

Когда в кино показывают, как на Земле разражается эпидемия страшного вируса, людям там нуж…

6 комментариев

  1. Аватар

    Роман

    08.07.2020 в 18:43

    Спасибо! Вспомнил времена когда изучал ассемблер, какие-то приятные воспоминания)

  2. Аватар

    ckib_tomsk

    16.07.2020 в 07:23

    Добрый день, Антон !
    В Ваших примерах функция displayletter работает только с регистром AL. Получается, что в случае умножения двух 8-ми битных чисел, результат умножения запишется в AX, но если он будет больше чем 0xFF, то на экран будет выведен 0xFF, а остальное отбросится. То же самое и с умножением двух 16-ти битных чисел. Регистр DX:AX возьмется не полностью, а только в части AL.
    Можете привести пример как сделать вывод с учетом этих особенностей ?

    • Антон Карев

      Антон Карев

      16.07.2020 в 15:46

      Добрый день, вы наблюдательны! Спасибо вам. Я в этом уроке для простоты подобрал примеры так, чтобы не выходить за пределы одной цифры. Для простоты. Это для того сделал, чтобы новичок сосредоточил внимание исключительно на арифметических операциях. Любознательный читатель, легко сможет найти полноценную процедуру для печати чисел на экране – в другой моей статье, которая была опубликована на ][ чуть раньше: https://xakep.ru/2020/05/13/microb/

  3. Аватар

    webvalera96

    21.08.2020 в 13:41

    Добрый день, Антон!

    Вместо того, чтобы вручную вставлять содержимое файла «library.asm» в каждый листинг программы, можно использовать директиву %include «library.asm» в конце каждого файла. Вы намеренно отказались от ее использования в программе для упрощения чтения кода или ввиду чего-то другого ?

Оставить мнение