Emu8086 Запускаем программу Emu8086 и создаём новый файл через меню file new com template (Файл Новый Шаблон файла com). В редакторе исходного кода после этого мы увидим следующее Рис. Создание нового файла в Emu8086
Скачать 251.21 Kb.
|
|
Определение макроса: имя MACRO [параметры,...] <команды> ENDM |
В отличие от процедур, макрос должен быть определен перед участком кода, где он будет использоваться, например:
MyMacro MACRO p1, p2, p3 MOV AX, p1 MOV BX, p2 MOV CX, p3 ENDM ORG 100h MyMacro 1, 2, 3 MyMacro 4, 5, DX RET |
Вышеописанный код эквивалентен следующему набору команд:
MOV AX, 00001h
MOV BX, 00002h
MOV CX, 00003h
MOV AX, 00004h
MOV BX, 00005h
MOV CX, DX
Некоторые важные замечания о макросах и процедурах:
CALL MyProc
MyMacro
MyMacro 1, 2, 3
|
Макрос распаковывается непосредственно в коде, поэтому, если имеются метки внутри макроопределения, вы можете получить ошибку "Duplicate declaration" (Двойное объявление), если макрос используется два или более раз. Чтобы избежать такой проблемы, используйте директиву LOCAL, сопровождающую имена переменных, меток или имен процедур. Например:
MyMacro2 MACRO LOCAL label1, label2 CMP AX, 2 JE label1 CMP AX, 3 JE label2 label1: INC AX label2: ADD AX, 2 ENDM ORG 100h MyMacro2 MyMacro2 RET |
Если вы планируете использовать ваши макросы в нескольких программах, то лучше разместить все макросы в отдельном файле. Поместите этот файл в каталог Inc и примените директиву INCLUDEимя файла для использования макросов.
Пример такого файла можно найти в разделе Библиотека общих функций - emu8086.inc.
Как создать операционную систему
Обычно, когда компьютер стартует, он пытается загрузиться с первого 512-байтового сектора (это Цилиндр 0, Головка 0, Сектор 1) дискеты в дисководе A: в память по адресу 0000h:7C00h и передать ей управление. Если это не удается, то BIOS пытается использовать MBR первого жесткого диска.
Этот урок посвящен загрузке с дискеты. Те же принципы используются при загрузке с жесткого диска. Но использование дискеты имеет несколько преимуществ:
Вы можете сохранить существующую операционную систему неповрежденной (Windows, DOS...).
Загрузочную запись дискеты легко модифицировать.
Пример простой загрузочной программы для дискеты:
; директива для создания BOOT-файла: #MAKE_BOOT# ; Загрузочная запись помещается в 0000:7C00. ; Эту информацию нужно сообщить компилятору: ORG 7C00h ; загружаем адрес сообщения в регистр SI: LEA SI, msg ; функция телетайпа: MOV AH, 0Eh print: MOV AL, [SI] CMP AL, 0 JZ done INT 10h ; печать в режиме телетайпа. INC SI JMP print ; ожидание нажатия любой клавиши: done: MOV AH, 0 INT 16h ; записать волшебное значение в 0040h:0072h: ; 0000h - холодная загрузка. ; 1234h - горячая загрузка. MOV AX, 0040h MOV DS, AX MOV w.[0072h], 0000h ; холодная загрузка. JMP 0FFFFh:0000h ; перезагрузка! new_line EQU 13, 10 msg DB 'Hello This is My First Boot Program!' DB new_line, 'Press any key to reboot', 0 |
Скопируйте описанный выше пример в редактор исходного кодаEmu8086 и нажмите кнопку [Compile and Emulate]. Эмулятор автоматически загрузит ".boot" файл по адресу 0000h:7C00h.
Вы можете управлять им как обычной программой или использовать меню Virtual Drive -> Write 512 bytes at 7C00h to-> Boot Sectorвиртуального дисковода (файл FLOPPY_0 в каталоге, где установлен эмулятор). После записи вашей программы в Виртуальный Дисковод, вы можете выбрать Boot from Floppy из меню Virtual Drive.
Из любопытства вы можете записать виртуальную дискету (FLOPPY_0) или ".boot"-файл на реальную дискету и загрузить с нее ваш компьютер. Я рекомендую использовать "RawWrite for Windows" из:http://uranus.it.swin.edu.au/jn/linux/rawwrite.htm
(с недавнего времени работает под всеми версиями Windows!)
Примечание: Этот .boot-файл не совместим с загрузочным сектором MS-DOS (будет невозможно прочитать или записать данные на вашу дискету, пока вы ее снова не отформатируете). Фактичеки, если вы используете какие-либо "сырые" программы, такие как описанная выше, они так или иначе будут стирать все данные. Так что убедитесь, что ваша дискета не содержит важных данных.
".boot"-файлы имеют ограничение 512 байтов (размер сектора). Если ваша операционная система имеет размер, превышающий это ограничение, то вам придется использовать программу для загрузки из других секторов. Хороший пример маленькой операционной системы можно найти в каталоге "Samples":
micro-os_loader.asm
micro-os_kernel.asm
Для создания расширенной операционной системы (более 512 байтов), вы можете использовать файлы ".bin" (выберите "BIN Template" из меню "File" -> "New").
Чтобы записать файл ".bin" на виртуальный дисковод, выберите"Write .bin file to floppy..." из меню эмулятора "Virtual Drive":
Вы можете также использовать для записи ".boot"-файлов.
Сектор: Цилиндр: 0 Головка:0 Сектор: 1 это загрузочный сектор! |
Упрощенный дисковод и структура дискеты:
Для дискеты на 1440 КБ:
Дисковод имеет 2 стороны и 2 головки - по одной на каждую сторону (0..1). Головки дисковода перемещаются над поверхностью диска на каждой стороне.
Каждая сторона имеет 80 цилиндров (нумерация 0..79).
Каждый цилиндр имеет 18 секторов (1..18).
В каждом секторе 512 байтов.
Общий размер дискеты: 2 x 80 x 18 x 512 = 1474560 байтов.
Чтобы прочитать секторы с дискеты, используйте INT 13h / AH = 02h.
Управление внешними устройствами
Эмулятор имеет три встроенных виртуальных устройства: светофор, шаговый двигатель и робот. Вы можете посмотреть эти устройства, используя меню эмулятора "Virtual Devices".
Техническую информацию ищите в разделе I/O ports.
Как правило, можно использовать любые процессоры семейства х86 для управления всеми видами устройств, различающихся в основном номерами портов ввода-вывода, которые могут быть изменены с помощью хитрого электронного оборудования. Обычно ".bin"-файл записывается микросхему ПЗУ (Read Only Memory (ROM) - постоянное запоминающее устройство - ПЗУ), система читает программу из этой микросхемы, загружает программу в ОЗУ и выполняет программу. Этот принцип используется для многих современных устройств, таких как микроволновые печи и т.п.
Светофор
Обычно для управления светофором используется массив (таблица) значений. В определенный период времени значение читается из массива и отправляется в порт. Например:
; директива для создания BIN-файла: #MAKE_BIN# #CS=500# #DS=500# #SS=500# #SP=FFFF# #IP=0# ; пропустить таблицу данных: JMP start table DW 100001100001b DW 110011110011b DW 001100001100b DW 011110011110b start: MOV SI, 0 ; установить счетчик на количество ; элементов в таблице: MOV CX, 4 next_value: ; получить значение из таблицы: MOV AX, table[SI] ; установить значение в порт ввода-вывода светофора: OUT 4, AX ; следующее слово: ADD SI, 2 CALL PAUSE LOOP next_value ; начать с другого первого значения JMP start ; ========================== PAUSE PROC ; сохранить регистры: PUSH CX PUSH DX PUSH AX ; установить интервал (1 миллион микросекунд - 1 секунда): MOV CX, 0Fh MOV DX, 4240h MOV AH, 86h INT 15h ; восстановить регистры: POP AX POP DX POP CX RET PAUSE ENDP ; ========================== |
Шаговый двигатель
Двигатель может выполнить "полушаг" при помощи пары магнитов, которые поворачивают ротор двигателя на определенный угол. Затем включается следующая пара магнитов и поворачивает ротор двигателя на следующий "шаг" и т.д.
Двигатель может выполниь полный шаг, если его повернуть парой магнитов, затем другой парой магнитов и в конце - одиночным магнитом и т.п. Лучший способ осуществить полный шаг - это выполнить его как два полушага.
Полушаг - это 11.25 градусов.
Полный шаг - это 22.5 градуса.
Двигатель может вращаться как по часовой стрелке, так и против часовой стрелки.
См. stepper_motor.asm в каталоге Samples.
См. также раздел ссылок Emu8086 I/O ports.
Робот
Полный список набора команд для робота приведен в разделе I/O ports.
Для управления роботом должен быть использован набор алгоритмов для достижения максимальной эффективности. Самым простым, но очень неэффективным является алгоритм случайных перемещений (см. robot.asm в каталоге Samples).
Можно также использовать таблицу данных (как и в светофоре). Это может быть хорошо, если робот всегда работает в одной и той же среде.