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

  • Библиотека общих функций - emu8086.inc

  • Emu8086

  • Virtual Drive

  • Boot from Floppy

  • BIN Template

  • 1440 КБ : Дисковод имеет 2 стороны и 2 головки - по одной на каждую сторону (0..1

  • 0..79 ). Каждый цилиндр имеет 18 секторов (1..18 ). В каждом секторе 512

  • Virtual Devices

  • 11.25

  • Emu8086 Запускаем программу Emu8086 и создаём новый файл через меню file new com template (Файл Новый Шаблон файла com). В редакторе исходного кода после этого мы увидим следующее Рис. Создание нового файла в Emu8086


    Скачать 251.21 Kb.
    НазваниеEmu8086 Запускаем программу Emu8086 и создаём новый файл через меню file new com template (Файл Новый Шаблон файла com). В редакторе исходного кода после этого мы увидим следующее Рис. Создание нового файла в Emu8086
    Дата05.04.2018
    Размер251.21 Kb.
    Формат файлаdocx
    Имя файлаEmu8086.docx
    ТипДокументы
    #40430
    страница10 из 10
    1   2   3   4   5   6   7   8   9   10

    Макросы


    Макросы - это те же процедуры, только виртуальные. Макросы подобны процедурам, но они выполняются только во время компиляции. После компиляции все макросы заменяются реальными командами. Если вы объявите макрос и никогда не будете использовать его в вашем коде, компилятор просто проигнорирует его. emu8086.inc содержит хорошие примеры использования макросов. Этот файл содержит несколько макросов, которые делают создание кода более легким. 


    Определение макроса: 
    имя 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, например:

    CALL MyProc

    • Если вы хотите использовать макрос, вы можете просто напечатать его имя. Пример:

    MyMacro

    • Процедура располагается по определенному адресу в памяти. Если вы воспользуетесь процедурой 100 раз, процессор будет передавать управление в эту часть памяти. Возвращение из процедуры выполняется командой RET. Для хранения адреса возврата используется стек. Команда CALLзанимает 3 байта, так что размер исполнимого файла увеличивается очень незначительно, независимо от того, сколько раз вызывается процедура.

    • Макрос выполняется непосредственно в коде программы. Поэтому если вы используете один и тот же макрос 100 раз, то компилятор будет распаковывать этот макрос также 100 раз, делая исполнимый файл все больше и больше, каждый раз вставляя в программу команды макроса.

    • Вы должны использовать стек или регистры общего назначения для передачи параметров процедуре. 

    • Для передачи параметров макросу, вам достаточно просто напечатать их после имени макроса. Например:

    MyMacro 1, 2, 3

    • Чтобы обозначить конец макроса, достаточно директивыENDM.

    • Чтобы обозначить конец процедуры, вы должны напечатать имя процедуры перед директивой ENDP.



    Макрос распаковывается непосредственно в коде, поэтому, если имеются метки внутри макроопределения, вы можете получить ошибку "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). 

    Можно также использовать таблицу данных (как и в светофоре). Это может быть хорошо, если робот всегда работает в одной и той же среде. 
    1   2   3   4   5   6   7   8   9   10


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