логотип нашего сайта о программировании для начинающих

Программирование на ассемблере для начинающих. Ассемблер gas под linux, fasm под windows, tasm под dos, и многое другое.


Сайт для программистов, начинающих кодеров, и людей, желающих заняться программированием.



Меню невыпадающее
Программистам : Другое :

Создание загрузчика приветствия с дискеты в ассемблере gas

Пример создания загрузчика с дискеты на ассемблере gas. Для простоты задача загрузчика только вывести приветствие и подвесить систему. То есть вся программа с легкостью помещается в загрузочный сектор - 512 байт.


.file "start.s"         # наш файл
ABS1 = (real_stat - _start + 0x7c00)         # определяем абсолютные смещения для прыжков
ABS2 = (msgstart - _start + 0x7c00)         # так как линкер не работает с относительными
.text         # секция текста/кода
.code16         # указываем разрядность нашего кода - 16
.globl _start         # начало программы
_start:
jmp nachalo
        # сразу прыжок к началу кода
nop         # а здесь ничего не делающий оператор
nachalo:         # непосредственно начало

cli         # запрет прерываний
ljmp $0,$ABS1         # длинный прыжок по 1-му смещению - адресу метки real_stat для заполнения регистров нужными значениями
real_stat:         # метка на которую прыгнули
xorw %ax,%ax         # зануление аккумулятора
movw %ax,%ss         # зануляем регистр %ss
movw $0x2000,%sp         # определяем стек по адресу 0х2000
movw %ax,%ds         # зануляем регистр %ds
sti         # разрешаем прерывания
movw $ABS2,%si         # помещаем абсолютный адрес метки msgstart в регистр si
call message         # вызываем процедуру вывода сообщения

cli         # запрещаем прерывания
vis:         # тут у нас бесконечный цикл

jmp vis         # прыжок на бесконечный цикл
hlt         # можно вместо цикла поставить вот эту команду, поэтому я ее отсюда не убрал
lb:         # процедура вывода символа на экран
movw $0x0001,%bx         # с помощью
movb $0xe,%ah         # прерывания биос
int $0x10         # int 10h
message:         # процедура вывода сообщения
lodsb         # загрузка символа сообщения
cmpb $0,%al         # проверка не 0 ли это
jne lb         # если не 0, то вывод символа на экран
ret         # если 0, то возврат из процедуры

msgstart:         # тут наше сообщение и нолик в его конце
.ascii " hail people!"
.byte 0
other:
        # а тут окончание нашего загрузчика
. = _start + 0x1fe         # смещение на адрес 0х1fe, то есть на 510 байт
.byte 0xaa         # и последние 2 байта - сигнатура бутсектора
.byte 0x55         # чтобы наша дискета определялась как загрузочная

# ВСЕ!

Непосредственно вводимый код выделен фиолетовым цветом , все остальное(зеленым) - комментарии.

Компилируем так
as -o start.o start.s
ld --oformat binary start.o -o start.bin
--oformat binary указывает линковщику на создание бинарного(двоичного) файла.
для записи в загрузочный сектор дискеты в терминале(консоли) наберите комманду
cp     start.bin     /dev/fd0


скачать архив с исходным кодом и исполняемым файлом этого примера
zip


С уважением Pauk_pv ©

Здесь со времнем появятся ссылки дружественных и понравившихся сайтов

Информер ТИЦ

кабель ААБЛ
установка кондиционеров|дизайн интерьера Москва

Сайт создан Pauk_pv // Pauk@paukpv.pp.ru

Rambler's Top100 Каталог@MAIL.RU - каталог ресурсов интернет

При использовании информации с сайта обязательна ссылка на сайт
Pauk_pv ©