В этот раз обсудим возможности
языка ассемблера. Итак, мы знаем
как давать команду процессору.
Но что, если её нужно зациклить?
А как же условия? Тут же просто
поочередные команды!

Это главная часть курса. Итак,
начнем с простого.
Напишем библиотеку, которая печатает
на экран и воспользуемся ей.

  1. как это хранится?

    Файлы библиотек, или же
    подключаемые файлы принято
    сохранять с расширением *.inc.
    Есть ли отличия? Вообще нет.
    Просто это дань времени и
    структуризации программы.

  2. как создать функцию?

2.1
Функций как таковых в асме нету.
Зато есть метки! и прыжки.
Например, небезопасный метод
зависнуть процессор:

metka: jmp metka

Как можно заметить, метки
обозначаются как "название:".
Ну а если нужно несмотря ни на
что прыгнуть на метку, то
используется конструкция
"JMP название".

Но это не все, поверьте! Есть
и условные прыжки! Для
большинства из них нужно
предварительно вызвать
сравнивающую команду:
"CMP оператор1, оператор2".
В ассемблере есть эти типы прыжков:

  • JMP, безусловно прыгнуть

  • JE, оп1 == оп2

  • JNE, оп1 != оп2

  • JG, оп1 > оп2

  • JGE, оп1 >= оп2

  • JL, оп1 < оп2

  • JLE, оп1 <= оп2

  • JZ, активен zero-флаг

  • JC, активен carry-флаг

    Последние 2 рассмотрим позже.

И так мы можем прыгать на метки.
Удобно ведь?

2.2
А как же функции? Для подобных
нужд в ассемблере есть
директивы "CALL" и "RET".
Пример:

call func
cli
hlt
jmp $-2
func:
do sth
ret

Этот код вызывает функцию func и
зависает. Удобно ведь?

  1. Ближе к делу

давайте разберем работу 10-го
прерывания 14-й команды.

mov ah, 0Eh
int 10h

Итак, оно печатает символ из
ah на экран. Можно применить
метки, чтобы зациклить печать
и поставить условие для выхода
из цикла. А ведь можно обернуть
все в функцию! Вот итоговый код:

file: print.inc

print:
mov ah, 0Eh
loopa:
lodsb test al, al
jz loopb
int 10h
loopb:
ret

file: example.asm

use16

org 7C00h

jmp main

include "print.inc"

msg db "Hello from ColaOS!", 00h

main:

mov si, msg call print

cli hlt jmp $-2

Возник вопрос? Подскажу! ;)

Предыдущий урок: https://habr.com/ru/post/666458/

Следующий урок: здесь_будет_ссылка

Комментарии (4)


  1. LeshaRB
    18.05.2022 18:29
    +3

    Вы в следующий раз пишите статьи из одного абзаца

    Сообществу хабра это нравится, и показывает уровень профессионализма автора...


    1. TalismanChet Автор
      18.05.2022 18:31

      хорошо, приму к сведению


  1. sden77
    18.05.2022 18:34

    Честно говоря, не совсем понятно, кому реально в современном мире может понадобится руководство в стиле "ассеблер для чайников". Программистом на этом языке видится всё же опытный сишник, которому надо сделать какие-то ассемблерные вставки в коде драйвера устройства или типа того.


    1. TalismanChet Автор
      18.05.2022 18:47
      +1

      скажу по своему опыту, что такие находятся