Вот решил дополнить тему сказом о системе оманд...
Эххх.... И почему табуляция на этом форуме гуляет?
И почему нельзя использовать HTML разметку?
Напрягает...
В общем ниже приведён текст, с ним и ознакамливайтесь.
Если возникнут вопросы - пишите
Приведённый мнемонический код есть MicroAssembler. Это микроинструкции процессора для написания POST, CMOS и BIOS. Можно и не писать POST, CMOS и BIOS, а сразу забадяжить Ось. Ось будет дико шустрой, но писать её - содомия... 0000 0 nop [NOP] Путой операнд. Не делает ничего. 0001 1 ret [RET] Операнд возврата. Извлекается адрес возврата из стэка. 0010 2 loop [LOOP REG] Операнд циклического выполнения с сылкой на адрес, указанный регистром. 0011 3 inc [INC REG] Операнд уменьшения числа в регистре, или переменной по адресу. 0100 4 dec [DEC REG] Операнд увеличения числа в регистре, или переменной по адресу. 0101 5 int [INT REG] Выполнение прерывания с номером в регистре, или согласно коду. 0110 6 mov [MOV REG, REG] Операнд присвоения значения одной переменной в другую. 0111 7 add [ADD REG, REG] Операнд сложения двух значений. 1000 8 sub [SUB REG, REG] Операнд вычитания двух значений. 1001 9 cmp [CMP REG, REG] Операнд сравнения двух значений. 1010 A jx [JX_ REG] Операнд условного/безусловного перехода. 1011 B not [NOT REG] Операнд логической иверсии. 1100 C and [AND REG] Операнд логического умножения. 1101 D or [OR REG] Операнд логического сложения. 1110 E movs [MOVS REG] Операнд работы с внешними устройствами.** 1111 F equ [EWU REG] Операнд логической эквивалентности. 0000 0 jmp [JMP REG] Безусловный переход. 0001 1 je [JE REG] Переход, если еквивалент ef = 1 0010 2 jne [JNE REG] Переход, если неэквивалент ef = 0 0011 3 jg [JG REG] Переход, если больше gf = 1 0100 4 jng [JNG REG] Переход, если не больше gf = 0 0101 5 jl [JL REG] Переход, если меньше lf = 1 0110 6 jnl [JNL REG] Переход, если не меньше lf = 0 0111 7 jge [JGE REG] Переход, если больше, или равно gf = 1 OR ef = 1 1000 8 jnge [JNGE REG] Переход, если не больше и не равно gf = 0 AND ef = 0 1001 9 jle [JLE REG] Переход, если меньше, или равно lf = 1 OR ef = 1 1010 A jnle [JNLE REG] Переход, если не меньше и не равно lf = 0 AND ef = 0 1011 B jp [JP REG] Переход, если значение чётное pf = 1 1100 C jnp [JNP REG] Переход, если значение нечётное pf = 0 1101 D js [JS REG] Переход, если меньше нуля sf = 1 1110 E jns [JNS REG] Переход, если больше, или == нулю sf = 0 1111 F jer [JER REG] Переход, если ошибка zf = 1 0000 0 ax 0001 1 bx 0010 2 cd 0011 3 dx 0100 4 cs 0101 5 ds 0110 6 es 0111 7 ss 1000 8 ec 1001 9 Address Пара регистров, образующих 32-разрядный адрес 1010 A ip 1011 B sp 1100 C ep 1101 D dp 1110 E Flags Флаги, 16 штук (4 бита) 1111 F Number Последовательность из 16-и бит, составляющая число (0 - 65'535) 0000 0 nf (Null) [Нуль, вместо z(erro)]* 0001 1 gf (Grater) [Больше] 0010 2 lf (Lower) [меньше] 0011 3 ef (Equal) [Эквивалентность] 0100 4 pf (Parity) [Чётность] 0101 5 sf (Sign) [Флаг отрицательного значения] 0110 6 of (Overflow) [Переполнение] 0111 7 zf (_Error) [Ошибка, вместо err]* 1000 8 f1 (Free 1) [Свободный 1] 1001 9 f2 (Free 2) [Свободный 2] 1010 A f3 (Free 3) [Свободный 3] 1011 B f4 (Free 4) [Свободный 4] 1100 C f5 (Free 5) [Свободный 5] 1101 D f6 (Free 6) [Свободный 6] 1110 E f7 (Free 7) [Свободный 7] 1111 F f8 (Free 8) [Свободный 8] 0000 0 CS:ip 0001 1 DS:dp 0010 2 ES:ep 0011 3 SS:sp 0100 4 ax:bx 0101 5 ax:cx 0110 6 ax:dx 0111 7 bx:cx 1000 8 bx:dx 1001 9 cx:dx 1010 A CS:ax 1011 B DS:ax 1100 C ES:ax 1101 D SS:ax 1110 E DS:dx 1111 F Number Последовательность из 32-х бит, составляющая число (0 - 4'294'967'295) -------------------------------------------------------------------------------- * - Влаг нуля переименован с Zero (zf) на Null (nf), чтобы отдать [zf] флагу ошибки. REG - Регистр, переменная, или адрес в памяти. Если переменная, или адрес то занимает 4 + 16 бит (указатель 4 на регистровый блок с указателем [9 - Адрес] [F - Число] и 16 бит - само число в коде). JX_ - 4 дополнительных бита - указатель инструкции условного/безусловного перехода. Пример кода с дизассемблированными инструкциями. Числа указаны максимальные (65535 - 16 бит). Код бредовый, исключительно для примера. Строка Бинарное представление команд Инструкции ---------------------------------------------------------------- 1 0110 0000 1111 1111 1111 1111 1111 MOV AX, 65535 2 0110 0001 0000 MOV BX, AX 3 0110 0010 1111 1111 1111 1111 1111 MOV CX, 65535 4 0111 0010 0001 ADD CX, BX 5 0011 0001 INC BX 6 1001 0001 0010 CMP BX, CX 7 1010 0010 1111 1111 1111 1111 1111 JNE 65535 8 0110 1101 1111 1111 1111 1111 1111 MOV DP, 65535 9 1010 0110 1001 0001 JNL DS:DP A 0111 1111 1111 1111 1111 1111 0000 ADD 65535, AX B 0111 1001 0001 1001 0101 ADD DS:DP, AX:CX C 0000 NOP D 0010 1111 1111 1111 1111 1111 LOOP 65535 E 0101 1111 0000 0000 0010 0000 INT 20h F 1110 1111 1111 1111 1111 1111 MOVS 65535 А теперь построчно-поблочно разберём что к чему: Строка 1 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 0110 Операнд MOV 0000 Регистр AX 1111 Число, занесённое в код (следующие 16 бит кода) 1111 1111 1111 1111 Число 65535 - 16 бит, все еденицы Строка 2 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 0110 Операнд MOV 0001 Регистр BX 0000 Регистр AX Строка 3 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 0110 Операнд MOV 0010 Регистр CX 1111 Число, занесённое в код (следующие 16 бит кода) 1111 1111 1111 1111 Число 65535 - 16 бит, все еденицы Строка 4 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 0111 Операнд ADD 0010 Регистр CX 0001 Ренистр BX Строка 5 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 0011 Операнд INC 0001 Регистр BX Строка 6 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 1001 Операнд CMP 0001 Регистр BX 0010 Регистр CX Строка 7 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 1010 Операнд условного/безусловного перехода 0010 Операнд JNE 1111 Число, занесённое в код (следующие 16 бит кода) 1111 1111 1111 1111 Число 65535 - 16 бит, все еденицы Строка 8 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 0110 Операнд MOV 1101 Регистр DP 1111 Число, занесённое в код (следующие 16 бит кода) 1111 1111 1111 1111 Число 65535 - 16 бит, все еденицы Строка 9 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 1010 Операнд условного/безусловного перехода 0110 Операнд JNL 1001 Пара регистров, или 32 разрядное число 0001 Пара регистров DS:DP Строка 10 (A) >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 0111 Операнд ADD 1111 Число, занесённое в код (следующие 16 бит кода) 1111 1111 1111 1111 Число 65535 - 16 бит, все еденицы 0000 Регистр AX Строка 11 (B) >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 0111 Операнд ADD 1001 Пара регистров, или 32 разрядное число 0001 Пара регистров DS:DP 1001 Пара регистров, или 32 разрядное число 0101 Пара регистров AX:CX Строка 12 (C) >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 0000 Операнд NOP Строка 13 (D) >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 0010 Операнд LOOP 1111 Число, занесённое в код (следующие 16 бит кода) 1111 1111 1111 1111 Число 65535 - 16 бит, все еденицы Строка 14 (E) >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 0101 Операнд INT 1111 Число, занесённое в код (следующие 16 бит кода) 0000 0000 0010 0000 Число 32, или 20h - 16 бит Строка 15 (F) >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 1110 Операнд MOVS 1111 Число, занесённое в код (следующие 16 бит кода) 1111 1111 1111 1111 Число 65535 - 16 бит, все еденицы Как видно из приведённого кода и подробного его разбора - даже при 50% нагружености кода сырозаписанными значениями (по 16 бит) код имеет сравнительно малый объём. Разработаны инструкции так и согласно такой архитектуре, что он максимально быстро интерпретируется процессором. Ко всему этому инструкции собраны в объединяющие блоки, что не только позволяет процессору быстро и просто их обрабатывать, но и программисту легко и просто их читать. Расширение числа команд процессора с 16 до 255/4095 производится путём банального добавления блока по 4/8 бит. Плюс блочной системы - гибкость в вопросе добавления новых команд. Чтобы программы, написаные на 4 бит-команда процессор работали на 8/12 бит-команда достаточно одной из 16 команд поставить значение считывания расширенной команды, а заменяемую команду (если она нужна) разместить в числе расширенных. А в коде заменить все простые вызовы команды на расширеные. Либо можно использовать один из свободных флагов как определитель режима работы процессора - простой (4 бит-команда), или расширенный (8/12 бит-команда). Это зависит от поставляемых перед процессором задач. ** Работа с внешними устройствами. ::::::::::::::::::::::::::::::::::::::::::::: Операндом MOVS совершаются манипуляции с данными внешних устройств. ES:SP указывают адрес устройства в машине (IRQ:DMA) DX содержит передаваемые в устройство 16 бит. BX содержит 16 бит ответа устройства (если таковой имеется). EC содержит значение состояния выполнения запроса: - 00 операция завершена успешно; - 01 данное устройство не предоставляет выходные данные (BX не изменяется);*** - 02 неизвестная инструкция (устройство "заклинило". Для программируемых устройств); - 03 устройство не готово (выполняется иная операция); - 04 устройство не отвечает (превышен интервал ожидания отклика); - 05 устройство сообщает о внутренней ошибке (self-test выдал ошибку); - FF неизвестная ошибка. Запрос из устройства данных, объёмом свыше 16 бит осуществляется в несколько подходов. Для этого само устройство должно содержать буффер и инструкцию чтения из буфера (устройство должно быть хотя-бы полу-программируемым). Для непрограммируемых устройств программист должен знать специфику получения поточных/порционных данных. *** Это не ошибка, скорее предупреждение для программы, что содержащееся в BX значение оставлено не устройством.