MOV X,[X] // Помещаем в X данные по вектору X ADD X,() // Отменяем помещение в X, складывая X с прочитанными данными MOV [],() // Помещаем данные в текущий вектор из X, отменяя его изменение
-----000|PREV
-----001|WORD|XXXX
-----010|SLAB |--XX
-----011|SLAB1|XX--
-----100|CHAR |---X
-----101|CHAR1|--X-
-----110|CHAR2|-X--
-----111|CHAR3|X---
--000---|SNAP |SnapShot
--001---|SNAP1
--010---|SNAP2
--011---|SNAP3
--100---|SNAP4
--101---|SNAP5
--110---|SNAP6
--111---|SNAP7
Помнится, существовала литература, по типу "Электронника для домохозяек".
Меня очень давно волновал вопрос возможности спроектировать такое процессорное устройство, система команд которого была простой и интуитивно понятной. Да, существуют различные MISC-процессоры и т.д. Но, боюсь, не каждая домохозяйка осилит программирование на нём.
Код | Инструкция | Описание |
00 | BREAK | Прерывание текущей ветви процесса |
80 | NOP | Холостая операция |
Иные системы команд, где на код выделяется по 16 или 32 бита, имеют такое же простейщее устройство, наподобии:
Код | Инструкция | Описание |
0000 | BREAK | Прерывание текущей ветви процесса |
8000 | NOP | Холостая операция |
8001…FFFF | VAL n | Холостая операция; Промежуточное занесение числа -32767…-1 |
00000000 | BREAK | |
00000001 | ||
00000010 | ||
00000011 | ||
0000010x | D08 | 00…FF |
0000011x | I08 | -128…+127 |
000010xx | D16 | 0000…FFFF |
000011xx | I16 | -32768…+32767 |
00010xxx | D24 | 000000…FFFFFF |
00011xxx | I24 | -8388608…+8388607 |
0010xxxx | D32 | 00000000…FFFFFFFF |
0011xxxx | I32 | -2147483648…+2147483647 |
010xxxxx | ||
011xxxxx | ||
1xxxxxxx | NOP |
Так как я на досуге не оставляю попыток разработать свой идеальный процессор, я решил взять это на вооружение.
В моей архитектуре каждый регистр представляется отдельным стеком. Поэтому, если иметь всего четыре регистра, но с глубиной до 4 уровней, виртуально получаем 16 регистров.
Ещё одна интересная особенность такой техники в том, что один из регистров можно использовать как стек аргументов при вызове подпрограммы. А в теле самой подпрограммы этот регистр может хранить произвольные промежуточные данные, когда сам регистр не требует никакого сохранения и восстановления. Так, черновой регистр.
Вот допустим, с помощью префиксов, мы ввели в IA32-архитектуру подобную особенность.
Все регистры (eax/ecx/edx/ebx/esp/ebp/esi/edi) стали стеками до 16 уровней. Получаем виртуально аж 128 ячеек!
Можно спокойно портить указатели стека esp/ebp для временных операций, а затем просто откатить их значения обратно.
mixxxxxx: m - memory access i - immediate data
Процессор имеет всего 4 регистра общего назначения по 2048 разрядов каждый. Одномоментно доступны только от 8 до 64 битов любого из 4 выбранного регистра. Все 4 регистра имеют стековую организацию и при записи их текущее состояние не теряется, а сдвигается в "прошлое" и всего доступно до четырёх квантов времени для доступа к прошлым значениям, условно названных периодами суток: M, D, E, N соответственно Утро, День, Вечер и Ночь. Где текущим моментом является N-ночь. Ширина слова регистра определяется условными обозначениями: CHAR 8 Буква SLAB 16 Слог WORD 32 Глагол NOTE 64 Заметка TEXT 128 Текст PAGE 256 Лист BOOK 512 Книга HEAP 1024 Пакет FILE 2048 Файл Распледеление байтов в регистрах и их условное символическое обозначение: Источники (доступно четыре кванта времени):
╔════════╤════════════════╤════════════════╗╔════════╤════════════════╤════════════════╗ ║Receiver│ Using parts │ Identification ║║ Source │ Using parts │ Identification ║ ╟────────┼────────────────┼────────────────╢╟────────┼────────────────┼────────────────╢ ║00000001│░░░░░░░░░░░░░░░░│ ║║00000001│░░░░░░░░░░░░░░░░│ ║ ║0000001M│░░░░░░░░░░░░░░░░│ ║║0000001M│░░░░░░░░░░░░░░░░│ ║ ║000001MM│░░░░░░░░░░░░░░░░│ ║║000001MM│░░░░░░░░░░░░░░░░│ ║ ║00001MMM│░░░░░░░░░░░░░░░░│ ║║00001MMM│░░░░░░░░░░░░░░░░│ ║ ║0001SQRR│▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓│NOTE 0:Z0-3 --EN║║0001QQRR│▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓│NOTE 0:Z0-3 MDEN║ ║0010SQRR│░░░░░░░░▓▓▓▓▓▓▓▓│WORD 0:X0-3 --EN║║0010QQRR│░░░░░░░░▓▓▓▓▓▓▓▓│WORD 0:X0-3 MDEN║ ║0011SQRR│▓▓▓▓▓▓▓▓░░░░░░░░│WORD 4:Y0-3 --EN║║0011QQRR│▓▓▓▓▓▓▓▓░░░░░░░░│WORD 4:Y0-3 MDEN║ ║0100SQRR│░░░░░░░░░░░░▓▓▓▓│SLAB 0:I0-3 --EN║║0100QQRR│░░░░░░░░░░░░▓▓▓▓│SLAB 0:I0-3 MDEN║ ║0101SQRR│░░░░░░░░▓▓▓▓░░░░│SLAB 2:J0-3 --EN║║0101QQRR│░░░░░░░░▓▓▓▓░░░░│SLAB 2:J0-3 MDEN║ ║0110SQRR│░░░░▓▓▓▓░░░░░░░░│SLAB 4:K0-3 --EN║║0110QQRR│░░░░▓▓▓▓░░░░░░░░│SLAB 4:K0-3 MDEN║ ║0111SQRR│▓▓▓▓░░░░░░░░░░░░│SLAB 6:L0-3 --EN║║0111QQRR│▓▓▓▓░░░░░░░░░░░░│SLAB 6:L0-3 MDEN║ ║10001QRR│░░░░░░░░░░░░░░▓▓│CHAR 0:A0-3 --EN║║1000QQRR│░░░░░░░░░░░░░░▓▓│CHAR 0:A0-3 MDEN║ ║10011QRR│░░░░░░░░░░░░▓▓░░│CHAR 1:B0-3 --EN║║1001QQRR│░░░░░░░░░░░░▓▓░░│CHAR 1:B0-3 MDEN║ ║10101QRR│░░░░░░░░░░▓▓░░░░│CHAR 2:C0-3 --EN║║1010QQRR│░░░░░░░░░░▓▓░░░░│CHAR 2:C0-3 MDEN║ ║10111QRR│░░░░░░░░▓▓░░░░░░│CHAR 3:D0-3 --EN║║1011QQRR│░░░░░░░░▓▓░░░░░░│CHAR 3:D0-3 MDEN║ ║11001QRR│░░░░░░▓▓░░░░░░░░│CHAR 4:E0-3 --EN║║1100QQRR│░░░░░░▓▓░░░░░░░░│CHAR 4:E0-3 MDEN║ ║11011QRR│░░░░▓▓░░░░░░░░░░│CHAR 5:F0-3 --EN║║1101QQRR│░░░░▓▓░░░░░░░░░░│CHAR 5:F0-3 MDEN║ ║11101QRR│░░▓▓░░░░░░░░░░░░│CHAR 6:G0-3 --EN║║1110QQRR│░░▓▓░░░░░░░░░░░░│CHAR 6:G0-3 MDEN║ ║11111QRR│▓▓░░░░░░░░░░░░░░│CHAR 7:H0-3 --EN║║1111QQRR│▓▓░░░░░░░░░░░░░░│CHAR 7:H0-3 MDEN║ ╚════════╧════════════════╧════════════════╝╚════════╧════════════════╧════════════════╝
MOV SEX1,DJ2 //│░░░░░░░░▓▓▓▓▓▓▓▓│=│░░░░░░░░▓▓▓▓░░░░│ MOVE Daily J2 to Existing Signed X1 ADD SEA1,EX2 //│░░░░░░░░▓▒▓▒▓▒▓▒│+│░░░░░░░░▓▒▓▒▓▒▓▒│ ADD Evening X2 with Existing Signed four A1,B1,C1,D1 SUB SNI2,MY3 //│░░░░░░░░▓▓▒▒▓▓▒▒│-│▓▓▒▒▓▓▒▒░░░░░░░░│ SUB Monday Y3 from New Signed two I2,J2
Достаточно интересно дело обстоит с передачей аргументов вызываемым процедурам
без явного использования стека. Существует правило, по которому все регистры с
индексом 0 не подлежат сохранению и нужны для любых промежуточных действий. Их
можно изменять в подпрограммах как угодно. Но они также используются для того,
чтобы передать данные вызываемой подпрограмме. Достаточно многократно записать
в регистр #0 ряд нужных значений, соблюдая его предельную глубину.
Например:
MOV +V0T,1
MOV +U0T,2
MOV H0T,-1
MOV N0T,-2
MOV +X0W,3
MOV +Y0T,-3
Где везде используется T(вторник), что откатывает стек назад для того, чтобы в
один "день" поместить четыре значения. И лишь однажды W(среда), чтобы сместить
стек на один уровень. Так как в зоне видимости оказываются лишь четыре дня для
чтения, необходимо перемещение по стеку с выполнением операций Drop. Для этого
используется операция:
MOV Z0W,Z0W
Эквивалентно для DUP:
MOV D08-128…+127
Тема в архиве.