Здесь сгруппированы подпрограммы, которые пригодятся вам, если вы решите поработать со своей машиной на уровне машинных кодов. Предлагаемый интерфейс низкого уровня позволяет вам читать и записывать данные и код непосредственно в оперативной памяти. Это значит, что вы можете разрабатывать свои собственные подпрограммы в кодах машин 386+ и вызывать их на исполнение.
Некоторые из подпрограмм, перечисленных ниже, не являются безопасными в том смысле, что Euphoria не сможет подстраховать вас при некорректном их использовании. Вы рискуете "подвесить" свою программу, операционную систему или даже машину, если сделаете что-то не так, как следовало бы. Если под DOS32 вы обратитесь к негодным адресам в памяти, то в дело вступит расширитель DOS CauseWay, и вы получите от него на экране сообщение об ошибке плюс распечатку информации на машинной тарабарщине в файле cw.err. Под WIN32 операционная система выдаст вам обычную свою табличку о прерывании прогона вашей программы со скупым диагностическим сообщением плюс информацию из регистров процессора. Под Linux в типовом случае вы получите аварийную остановку программы и сообщение о нарушении сегментации.
Примечание: Чтобы помочь программистам в этих рискованных занятиях, мы поставляем библиотечный файл safe.e, как отладочную замену файла machine.e. Если вы скопируете safe.e из каталога euphoria\include\ в каталог, содержащий вашу программу, и переименуете safe.e как machine.e в этом вашем рабочем каталоге, ваша программа будет исполняться с использованием более безопасного, но и более медленного, варианта обычных подпрограмм низкого уровня. Этот safe.e может отловить многие ошибки, в том числе и такие, как запись в память по негодным адресам. Просмотрите комментарии в начале файла safe.e, чтобы получить полную инструкцию по его применению и оптимальному его конфигурированию под вашу программу. Подпрограммы интерфейса уровня машины очень важны для продвинутого программирования, так как они позволяют Euphoria-программистам получить доступ ко всем ресурсам, заложенным на низком уровне в ваше оборудование и вашу операционную систему. В некоторых особо ответственных случаях данная возможность может иметь решающее значение.
Подпрограммы в машинных кодах могут быть написаны вручную или же получены путем дизассемблирования выходных файлов компиляторов Си или некоторых других языков. Пит Эберлейн написал "мини-ассемблер" для использования с Euphoria. Просмотрите Архив файлов. Не забывайте, что ваш машинный код будет исполняться в 32-разрядном защищённом режиме. Просмотрите файл demo\dos32\callmach.ex, чтобы получить более конкретное представление о деталях этого дела.
peek (читать_из_памяти)
- выдаёт один или более байтов из памяти с заданного адреса
peek4s (читать_из_памяти_4_байта_и_знак)
- выдаёт 4-х байтовую величину со знаком из памяти с заданного адреса
peek4u (читать_из_памяти_4_байта_без_знака)
- выдаёт 4-х байтовую величину без знака из памяти с заданного адреса
poke (записать_в_память)
- записывает один или более байтов в память, начиная с заданного адреса
poke4 (записать_в_память_4_байта)
- записывает 4-х байтовую величину в память по заданному адресу
mem_copy (копировать_память)
- копирует в памяти последовательность байтов с одного заданного адреса по другому
mem_set (заполнить_память)
- устанавливает все байты заданного участка памяти в заданное значение
call (вызвать)
- вызывает на исполнение подпрограмму, написанную в машинных кодах
dos_interrupt (прерывание_dos)
- вызывает подпрограмму обработки прерывания DOS (DOS32)
allocate (выделить_память)
- выдаёт адрес свободного участка памяти заданного объёма
free (освободить_память)
- освобождает участок памяти, ранее выделенный по команде allocate
allocate_low (выделить_память_внизу)
- выдаёт адрес свободного участка нижней памяти (адреса менее 1Mb) (DOS32)
free_low (освободить_память_внизу)
- освобождает участок памяти, ранее выделенный по команде allocate_low (DOS32)
allocate_string (поместить_строку_в_память)
- размещает в памяти заданную строку с нуль-терминатором и выдаёт её адрес
register_block (учесть_блок)
- регистрирует в списке безопасных блоков участок памяти, ранее уже выделенный какой-либо подпрограммой
unregister_block (вычеркнуть_блок)
- вычёркивает из списка безопасных ранее зарегистрированный блок памяти (см. выше)
get_vector (получить_адрес_вектора)
- выдаёт адрес обработчика прерывания (DOS32)