Ядро «Эверест»

Comment are off

Вместо предисловия:

«Пастух пас овец – в одиночестве. И захотелось ему повидать людей. Он и закричал, зашумел: «Волки, волки!» Люди из селения прибежали с палками и цепями. Осмотрелись, сначала удивились, потом плюнули и ушли к себе в селение.

Прошло время и заскучавший пастух снова кричит: «Волки, волки!» Люди не так скоро, но прибежали. Опять нет волков, опять обман – обругали пастуха и обратно пошли.

А вскоре слышат они с высоты голос пастуха в третий раз: «Волки, волки, волки!» Посмеялись, отмахнулись люди и не пошли – не поверили. А волки тем временем действительно набежали и съели пастуха и всех овец.»

Дабы не оказаться в роли пастуха из притчи, мы не будем говорить что процессор готов, а просто расскажем о текущем статусе разработки. Говоря «Процессор», мы подразумеваем ядро (Core) c системой команд «Эверест».

В процессе разработки мы столкнулись с одной проблемой и успешно её решили. Цена решения — добавлен допнительный такт некоторым инструкциям.

В отладочной версии прошивки ядра мы использовали одну хитрость — для отладочных целей задействовали команды обмена с регистрами сообщений. Напомним, спецификация L4 определяет 64 регистра для обмена сообщениями между задачами. Для работы с регистрами сообщений, система команд «Эверест» определяет две инструкции — SET_MR и GET_MR. Эти инструкции имеют два операнда — номер регистра сообщений (MR0..MR63) и номер регистра общего назначения (R0..R15). Хитрость заключается в том, что мы используем инструкцию SET_MR для вывода отладочной информации. Для этого мы модифицировали пример из МакроАссемблера.

верхнеуровневый модуль

Инструкция set_mr в этом примере используется лишь для вывода текущего состояния программы, что будет показано далее. Функцмя _strlen тоже подверглась модификации с добавлением инструкции set_mr.

функция strlen с отладочной информацией

Из этого примера с помощью МакроАссемблера сгенерируются файлы test.mif и test.vh для синтеза и симуляции. Так же будет сгенерирован отладочный файл test.mif_dbf. Он содержит дизассемблированный текст сгенерированной прошивки. Рассмотрим его подробнее — с его помощью можно увидеть инструкции процессора, сгенерированные из ассемблерных мнемоник.

0000: 50 00 ; LOAD R0, 0x00
0002: 51 00 ; LOAD R1, 0x00
0004: fe 77 77 77 77 ; LOAD R14, 0x77777777
0009: ff 12 34 56 78 ; LOAD R15, 0x12345678
000e: 71 ee ; LD_MR MR30, R14
0010: 71 ff ; LD_MR MR31, R15
0012: 04 ; NOTCH
0013: 91 00 19 ; LOAD R1, 0x0019
0016: 72 01 ; LD_MR MR32, R1
0018: 71 9e ; LD_MR MR25, R14
001a: 37 e0 ; DEC R14, 1
001c: 70 3e ; LD_MR MR3, R14
001e: 60 ef ; MOV (R14), R15
0020: 72 1e ; LD_MR MR33, R14
0022: 04 ; NOTCH
0023: 8f 00 19 ; JMP 0x0019
0026: 68 fe ; MOV R15, (R14)
0028: 36 e3 ; INC R14, 4
002a: 05 ; RETURN
002c: 48 65 6c 6c 6f 20 77 6f 72 6c 64 21 0d 0a 00 00 "Hello world!###"
003c: 21 00 ; XOR R0, R0
003e: 68 21 ; MOV R2, (R1)
0040: 70 02 ; LD_MR MR0, R2
0042: 32 27 ; ROL R2, 7
0044: 70 02 ; LD_MR MR0, R2
0046: 53 ff ; LOAD R3, 0xff
0048: 70 03 ; LD_MR MR0, R3
004a: 22 32 ; AND R3, R2
004c: 70 03 ; LD_MR MR0, R3
004e: 82 00 41 ; JZ 0x0041
0051: 36 00 ; INC R0, 1
0053: 70 00 ; LD_MR MR0, R0
0055: 32 27 ; ROL R2, 7
0057: 70 02 ; LD_MR MR0, R2
0059: 53 ff ; LOAD R3, 0xff
005b: 22 32 ; AND R3, R2
005d: 70 03 ; LD_MR MR0, R3
005f: 82 00 30 ; JZ 0x0030
0062: 36 00 ; INC R0, 1
0064: 70 00 ; LD_MR MR0, R0
0066: 32 27 ; ROL R2, 7
0068: 70 02 ; LD_MR MR0, R2
006a: 53 ff ; LOAD R3, 0xff
006c: 22 32 ; AND R3, R2
006e: 70 03 ; LD_MR MR0, R3
0070: 82 00 1f ; JZ 0x001f
0073: 36 00 ; INC R0, 1
0075: 70 00 ; LD_MR MR0, R0
0077: 32 27 ; ROL R2, 7
0079: 70 02 ; LD_MR MR0, R2
007b: 53 ff ; LOAD R3, 0xff
007d: 22 32 ; AND R3, R2
007f: 70 03 ; LD_MR MR0, R3
0081: 82 00 0e ; JZ 0x000e
0084: 36 00 ; INC R0, 1
0086: 70 00 ; LD_MR MR0, R0
0088: 36 13 ; INC R1, 4
008a: 70 01 ; LD_MR MR0, R1
008c: 8f ff b2 ; JMP 0xffffffb2
008f: 05 ; RETURN
0090: 00 ; NOP
0091: 00 ; NOP
0092: 00 ; NOP
0093: 00 ; NOP
0025:

С помощью этого отладочного файла можно увидеть в какие конструкции раскрываются макро-операции PUSH, POP, LEA и CALL. Как мы говорили ранее — процессор ещё не имеет инструкций для операций с разрядностью не равных ширине машинного слова (32-бита), поэтому для поиска нулевого байта, являющегося признаком конца строки, данная функция использует сдвиг и сравнение с маской.

Загрузив этот микрокода в прошивку ПЛИС, в удалённом терминале получаем дамп состояний на шинах процессора. Текущая версия тестовой прошивки, как и предыдущая, использует пошаговый режим исполнения микрокода, поэтому каждая инструкция (а точнее — каждое изменение состояния процессора, включая выборку команд и операции чтения и записи памяти) выполняется после нажатия любой клавиши в удалённом терминале. Приведём полный текст дампа состояния шин ядра, выполняющего поиск длины строки. Поскольку операция поиска длины строки использует цикл, то дамп получился весьма большой. Приводим его целиком (231 строка):

Address 0xFF000000 Control 0x000 Command 0x50005100FE Data out 0x00000000
Address 0xFF000002 Control 0x000 Command 0x5100FE7777 Data out 0x00000000
Address 0xFF000004 Control 0x000 Command 0xFE77777777 Data out 0x00000000
Address 0xFF000009 Control 0x000 Command 0xFF12345678 Data out 0x00000000
Address 0xFF00000E Control 0x000 Command 0x71EE71FF04 Data out 0x00000000
Address 0x0000001E Control 0x011 Command 0x0BADBADBAD Data out 0x77777777
Address 0xFF000010 Control 0x000 Command 0x71FF049100 Data out 0x77777777
Address 0x0000001F Control 0x011 Command 0x0BADBADBAD Data out 0x12345678
Address 0xFF000012 Control 0x000 Command 0x0491001972 Data out 0x12345678
Address 0xFF000013 Control 0x000 Command 0x9100197201 Data out 0x12345678
Address 0xFF000016 Control 0x000 Command 0x7201719E37 Data out 0x12345678
Address 0x00000020 Control 0x011 Command 0x0BADBADBAD Data out 0xFF00002C
Address 0xFF000018 Control 0x000 Command 0x719E37E070 Data out 0xFF00002C
Address 0x00000019 Control 0x011 Command 0x0BADBADBAD Data out 0x77777777
Address 0xFF00001A Control 0x000 Command 0x37E0703E60 Data out 0x77777777
Address 0xFF00001C Control 0x000 Command 0x703E60EF72 Data out 0x77777777
Address 0x00000003 Control 0x011 Command 0x0BADBADBAD Data out 0x77777776
Address 0xFF00001E Control 0x000 Command 0x60EF721E04 Data out 0x77777776
Address 0x77777776 Control 0x011 Command 0x0BADBADBAD Data out 0x12345678
Address 0xFF000020 Control 0x000 Command 0x721E048F00 Data out 0x12345678
Address 0x00000021 Control 0x011 Command 0x0BADBADBAD Data out 0x77777776
Address 0xFF000022 Control 0x000 Command 0x048F001968 Data out 0x77777776
Address 0xFF000023 Control 0x000 Command 0x8F001968FE Data out 0x77777776
Address 0xFF00003C Control 0x000 Command 0x2100682170 Data out 0x77777776
Address 0xFF00003E Control 0x000 Command 0x6821700232 Data out 0x77777776
Address 0xFF00002C Control 0x010 Command 0x48656C6C6F Data out 0x77777776
Address 0xFF000040 Control 0x000 Command 0x7002322770 Data out 0x77777776
Address 0x00000000 Control 0x011 Command 0x0BADBADBAD Data out 0x48656C6C
Address 0xFF000042 Control 0x000 Command 0x3227700253 Data out 0x48656C6C
Address 0xFF000044 Control 0x000 Command 0x700253FF70 Data out 0x48656C6C
Address 0x00000000 Control 0x011 Command 0x0BADBADBAD Data out 0x656C6C48
Address 0xFF000046 Control 0x000 Command 0x53FF700322 Data out 0x656C6C48
Address 0xFF000048 Control 0x000 Command 0x7003223270 Data out 0x656C6C48
Address 0x00000000 Control 0x011 Command 0x0BADBADBAD Data out 0x000000FF
Address 0xFF00004A Control 0x000 Command 0x2232700382 Data out 0x000000FF
Address 0xFF00004C Control 0x000 Command 0x7003820041 Data out 0x000000FF
Address 0x00000000 Control 0x011 Command 0x0BADBADBAD Data out 0x00000048
Address 0xFF00004E Control 0x000 Command 0x8200413600 Data out 0x00000048
Address 0xFF000051 Control 0x000 Command 0x3600700032 Data out 0x00000048
Address 0xFF000053 Control 0x000 Command 0x7000322770 Data out 0x00000048
Address 0x00000000 Control 0x011 Command 0x0BADBADBAD Data out 0x00000001
Address 0xFF000055 Control 0x000 Command 0x3227700253 Data out 0x00000001
Address 0xFF000057 Control 0x000 Command 0x700253FF22 Data out 0x00000001
Address 0x00000000 Control 0x011 Command 0x0BADBADBAD Data out 0x6C6C4865
Address 0xFF000059 Control 0x000 Command 0x53FF223270 Data out 0x6C6C4865
Address 0xFF00005B Control 0x000 Command 0x2232700382 Data out 0x6C6C4865
Address 0xFF00005D Control 0x000 Command 0x7003820030 Data out 0x6C6C4865
Address 0x00000000 Control 0x011 Command 0x0BADBADBAD Data out 0x00000065
Address 0xFF00005F Control 0x000 Command 0x8200303600 Data out 0x00000065
Address 0xFF000062 Control 0x000 Command 0x3600700032 Data out 0x00000065
Address 0xFF000064 Control 0x000 Command 0x7000322770 Data out 0x00000065
Address 0x00000000 Control 0x011 Command 0x0BADBADBAD Data out 0x00000002
Address 0xFF000066 Control 0x000 Command 0x3227700253 Data out 0x00000002
Address 0xFF000068 Control 0x000 Command 0x700253FF22 Data out 0x00000002
Address 0x00000000 Control 0x011 Command 0x0BADBADBAD Data out 0x6C48656C
Address 0xFF00006A Control 0x000 Command 0x53FF223270 Data out 0x6C48656C
Address 0xFF00006C Control 0x000 Command 0x2232700382 Data out 0x6C48656C
Address 0xFF00006E Control 0x000 Command 0x700382001F Data out 0x6C48656C
Address 0x00000000 Control 0x011 Command 0x0BADBADBAD Data out 0x0000006C
Address 0xFF000070 Control 0x000 Command 0x82001F3600 Data out 0x0000006C
Address 0xFF000073 Control 0x000 Command 0x3600700032 Data out 0x0000006C
Address 0xFF000075 Control 0x000 Command 0x7000322770 Data out 0x0000006C
Address 0x00000000 Control 0x011 Command 0x0BADBADBAD Data out 0x00000003
Address 0xFF000077 Control 0x000 Command 0x3227700253 Data out 0x00000003
Address 0xFF000079 Control 0x000 Command 0x700253FF22 Data out 0x00000003
Address 0x00000000 Control 0x011 Command 0x0BADBADBAD Data out 0x48656C6C
Address 0xFF00007B Control 0x000 Command 0x53FF223270 Data out 0x48656C6C
Address 0xFF00007D Control 0x000 Command 0x2232700382 Data out 0x48656C6C
Address 0xFF00007F Control 0x000 Command 0x700382000E Data out 0x48656C6C
Address 0x00000000 Control 0x011 Command 0x0BADBADBAD Data out 0x0000006C
Address 0xFF000081 Control 0x000 Command 0x82000E3600 Data out 0x0000006C
Address 0xFF000084 Control 0x000 Command 0x3600700036 Data out 0x0000006C
Address 0xFF000086 Control 0x000 Command 0x7000361370 Data out 0x0000006C
Address 0x00000000 Control 0x011 Command 0x0BADBADBAD Data out 0x00000004
Address 0xFF000088 Control 0x000 Command 0x361370018F Data out 0x00000004
Address 0xFF00008A Control 0x000 Command 0x70018FFFB2 Data out 0x00000004
Address 0x00000000 Control 0x011 Command 0x0BADBADBAD Data out 0xFF000030
Address 0xFF00008C Control 0x000 Command 0x8FFFB20500 Data out 0xFF000030
Address 0xFF00003E Control 0x000 Command 0x6821700232 Data out 0xFF000030
Address 0xFF000030 Control 0x010 Command 0x6F20776F72 Data out 0xFF000030
Address 0xFF000040 Control 0x000 Command 0x7002322770 Data out 0xFF000030
Address 0x00000000 Control 0x011 Command 0x0BADBADBAD Data out 0x6F20776F
Address 0xFF000042 Control 0x000 Command 0x3227700253 Data out 0x6F20776F
Address 0xFF000044 Control 0x000 Command 0x700253FF70 Data out 0x6F20776F
Address 0x00000000 Control 0x011 Command 0x0BADBADBAD Data out 0x20776F6F
Address 0xFF000046 Control 0x000 Command 0x53FF700322 Data out 0x20776F6F
Address 0xFF000048 Control 0x000 Command 0x7003223270 Data out 0x20776F6F
Address 0x00000000 Control 0x011 Command 0x0BADBADBAD Data out 0x000000FF
Address 0xFF00004A Control 0x000 Command 0x2232700382 Data out 0x000000FF
Address 0xFF00004C Control 0x000 Command 0x7003820041 Data out 0x000000FF
Address 0x00000000 Control 0x011 Command 0x0BADBADBAD Data out 0x0000006F
Address 0xFF00004E Control 0x000 Command 0x8200413600 Data out 0x0000006F
Address 0xFF000051 Control 0x000 Command 0x3600700032 Data out 0x0000006F
Address 0xFF000053 Control 0x000 Command 0x7000322770 Data out 0x0000006F
Address 0x00000000 Control 0x011 Command 0x0BADBADBAD Data out 0x00000005
Address 0xFF000055 Control 0x000 Command 0x3227700253 Data out 0x00000005
Address 0xFF000057 Control 0x000 Command 0x700253FF22 Data out 0x00000005
Address 0x00000000 Control 0x011 Command 0x0BADBADBAD Data out 0x776F6F20
Address 0xFF000059 Control 0x000 Command 0x53FF223270 Data out 0x776F6F20
Address 0xFF00005B Control 0x000 Command 0x2232700382 Data out 0x776F6F20
Address 0xFF00005D Control 0x000 Command 0x7003820030 Data out 0x776F6F20
Address 0x00000000 Control 0x011 Command 0x0BADBADBAD Data out 0x00000020
Address 0xFF00005F Control 0x000 Command 0x8200303600 Data out 0x00000020
Address 0xFF000062 Control 0x000 Command 0x3600700032 Data out 0x00000020
Address 0xFF000064 Control 0x000 Command 0x7000322770 Data out 0x00000020
Address 0x00000000 Control 0x011 Command 0x0BADBADBAD Data out 0x00000006
Address 0xFF000066 Control 0x000 Command 0x3227700253 Data out 0x00000006
Address 0xFF000068 Control 0x000 Command 0x700253FF22 Data out 0x00000006
Address 0x00000000 Control 0x011 Command 0x0BADBADBAD Data out 0x6F6F2077
Address 0xFF00006A Control 0x000 Command 0x53FF223270 Data out 0x6F6F2077
Address 0xFF00006C Control 0x000 Command 0x2232700382 Data out 0x6F6F2077
Address 0xFF00006E Control 0x000 Command 0x700382001F Data out 0x6F6F2077
Address 0x00000000 Control 0x011 Command 0x0BADBADBAD Data out 0x00000077
Address 0xFF000070 Control 0x000 Command 0x82001F3600 Data out 0x00000077
Address 0xFF000073 Control 0x000 Command 0x3600700032 Data out 0x00000077
Address 0xFF000075 Control 0x000 Command 0x7000322770 Data out 0x00000077
Address 0x00000000 Control 0x011 Command 0x0BADBADBAD Data out 0x00000007
Address 0xFF000077 Control 0x000 Command 0x3227700253 Data out 0x00000007
Address 0xFF000079 Control 0x000 Command 0x700253FF22 Data out 0x00000007
Address 0x00000000 Control 0x011 Command 0x0BADBADBAD Data out 0x6F20776F
Address 0xFF00007B Control 0x000 Command 0x53FF223270 Data out 0x6F20776F
Address 0xFF00007D Control 0x000 Command 0x2232700382 Data out 0x6F20776F
Address 0xFF00007F Control 0x000 Command 0x700382000E Data out 0x6F20776F
Address 0x00000000 Control 0x011 Command 0x0BADBADBAD Data out 0x0000006F
Address 0xFF000081 Control 0x000 Command 0x82000E3600 Data out 0x0000006F
Address 0xFF000084 Control 0x000 Command 0x3600700036 Data out 0x0000006F
Address 0xFF000086 Control 0x000 Command 0x7000361370 Data out 0x0000006F
Address 0x00000000 Control 0x011 Command 0x0BADBADBAD Data out 0x00000008
Address 0xFF000088 Control 0x000 Command 0x361370018F Data out 0x00000008
Address 0xFF00008A Control 0x000 Command 0x70018FFFB2 Data out 0x00000008
Address 0x00000000 Control 0x011 Command 0x0BADBADBAD Data out 0xFF000034
Address 0xFF00008C Control 0x000 Command 0x8FFFB20500 Data out 0xFF000034
Address 0xFF00003E Control 0x000 Command 0x6821700232 Data out 0xFF000034
Address 0xFF000034 Control 0x010 Command 0x726C64210D Data out 0xFF000034
Address 0xFF000040 Control 0x000 Command 0x7002322770 Data out 0xFF000034
Address 0x00000000 Control 0x011 Command 0x0BADBADBAD Data out 0x726C6421
Address 0xFF000042 Control 0x000 Command 0x3227700253 Data out 0x726C6421
Address 0xFF000044 Control 0x000 Command 0x700253FF70 Data out 0x726C6421
Address 0x00000000 Control 0x011 Command 0x0BADBADBAD Data out 0x6C642172
Address 0xFF000046 Control 0x000 Command 0x53FF700322 Data out 0x6C642172
Address 0xFF000048 Control 0x000 Command 0x7003223270 Data out 0x6C642172
Address 0x00000000 Control 0x011 Command 0x0BADBADBAD Data out 0x000000FF
Address 0xFF00004A Control 0x000 Command 0x2232700382 Data out 0x000000FF
Address 0xFF00004C Control 0x000 Command 0x7003820041 Data out 0x000000FF
Address 0x00000000 Control 0x011 Command 0x0BADBADBAD Data out 0x00000072
Address 0xFF00004E Control 0x000 Command 0x8200413600 Data out 0x00000072
Address 0xFF000051 Control 0x000 Command 0x3600700032 Data out 0x00000072
Address 0xFF000053 Control 0x000 Command 0x7000322770 Data out 0x00000072
Address 0x00000000 Control 0x011 Command 0x0BADBADBAD Data out 0x00000009
Address 0xFF000055 Control 0x000 Command 0x3227700253 Data out 0x00000009
Address 0xFF000057 Control 0x000 Command 0x700253FF22 Data out 0x00000009
Address 0x00000000 Control 0x011 Command 0x0BADBADBAD Data out 0x6421726C
Address 0xFF000059 Control 0x000 Command 0x53FF223270 Data out 0x6421726C
Address 0xFF00005B Control 0x000 Command 0x2232700382 Data out 0x6421726C
Address 0xFF00005D Control 0x000 Command 0x7003820030 Data out 0x6421726C
Address 0x00000000 Control 0x011 Command 0x0BADBADBAD Data out 0x0000006C
Address 0xFF00005F Control 0x000 Command 0x8200303600 Data out 0x0000006C
Address 0xFF000062 Control 0x000 Command 0x3600700032 Data out 0x0000006C
Address 0xFF000064 Control 0x000 Command 0x7000322770 Data out 0x0000006C
Address 0x00000000 Control 0x011 Command 0x0BADBADBAD Data out 0x0000000A
Address 0xFF000066 Control 0x000 Command 0x3227700253 Data out 0x0000000A
Address 0xFF000068 Control 0x000 Command 0x700253FF22 Data out 0x0000000A
Address 0x00000000 Control 0x011 Command 0x0BADBADBAD Data out 0x21726C64
Address 0xFF00006A Control 0x000 Command 0x53FF223270 Data out 0x21726C64
Address 0xFF00006C Control 0x000 Command 0x2232700382 Data out 0x21726C64
Address 0xFF00006E Control 0x000 Command 0x700382001F Data out 0x21726C64
Address 0x00000000 Control 0x011 Command 0x0BADBADBAD Data out 0x00000064
Address 0xFF000070 Control 0x000 Command 0x82001F3600 Data out 0x00000064
Address 0xFF000073 Control 0x000 Command 0x3600700032 Data out 0x00000064
Address 0xFF000075 Control 0x000 Command 0x7000322770 Data out 0x00000064
Address 0x00000000 Control 0x011 Command 0x0BADBADBAD Data out 0x0000000B
Address 0xFF000077 Control 0x000 Command 0x3227700253 Data out 0x0000000B
Address 0xFF000079 Control 0x000 Command 0x700253FF22 Data out 0x0000000B
Address 0x00000000 Control 0x011 Command 0x0BADBADBAD Data out 0x726C6421
Address 0xFF00007B Control 0x000 Command 0x53FF223270 Data out 0x726C6421
Address 0xFF00007D Control 0x000 Command 0x2232700382 Data out 0x726C6421
Address 0xFF00007F Control 0x000 Command 0x700382000E Data out 0x726C6421
Address 0x00000000 Control 0x011 Command 0x0BADBADBAD Data out 0x00000021
Address 0xFF000081 Control 0x000 Command 0x82000E3600 Data out 0x00000021
Address 0xFF000084 Control 0x000 Command 0x3600700036 Data out 0x00000021
Address 0xFF000086 Control 0x000 Command 0x7000361370 Data out 0x00000021
Address 0x00000000 Control 0x011 Command 0x0BADBADBAD Data out 0x0000000C
Address 0xFF000088 Control 0x000 Command 0x361370018F Data out 0x0000000C
Address 0xFF00008A Control 0x000 Command 0x70018FFFB2 Data out 0x0000000C
Address 0x00000000 Control 0x011 Command 0x0BADBADBAD Data out 0xFF000038
Address 0xFF00008C Control 0x000 Command 0x8FFFB20500 Data out 0xFF000038
Address 0xFF00003E Control 0x000 Command 0x6821700232 Data out 0xFF000038
Address 0xFF000038 Control 0x010 Command 0x0D0A000021 Data out 0xFF000038
Address 0xFF000040 Control 0x000 Command 0x7002322770 Data out 0xFF000038
Address 0x00000000 Control 0x011 Command 0x0BADBADBAD Data out 0x0D0A0000
Address 0xFF000042 Control 0x000 Command 0x3227700253 Data out 0x0D0A0000
Address 0xFF000044 Control 0x000 Command 0x700253FF70 Data out 0x0D0A0000
Address 0x00000000 Control 0x011 Command 0x0BADBADBAD Data out 0x0A00000D
Address 0xFF000046 Control 0x000 Command 0x53FF700322 Data out 0x0A00000D
Address 0xFF000048 Control 0x000 Command 0x7003223270 Data out 0x0A00000D
Address 0x00000000 Control 0x011 Command 0x0BADBADBAD Data out 0x000000FF
Address 0xFF00004A Control 0x000 Command 0x2232700382 Data out 0x000000FF
Address 0xFF00004C Control 0x000 Command 0x7003820041 Data out 0x000000FF
Address 0x00000000 Control 0x011 Command 0x0BADBADBAD Data out 0x0000000D
Address 0xFF00004E Control 0x000 Command 0x8200413600 Data out 0x0000000D
Address 0xFF000051 Control 0x000 Command 0x3600700032 Data out 0x0000000D
Address 0xFF000053 Control 0x000 Command 0x7000322770 Data out 0x0000000D
Address 0x00000000 Control 0x011 Command 0x0BADBADBAD Data out 0x0000000D
Address 0xFF000055 Control 0x000 Command 0x3227700253 Data out 0x0000000D
Address 0xFF000057 Control 0x000 Command 0x700253FF22 Data out 0x0000000D
Address 0x00000000 Control 0x011 Command 0x0BADBADBAD Data out 0x00000D0A
Address 0xFF000059 Control 0x000 Command 0x53FF223270 Data out 0x00000D0A
Address 0xFF00005B Control 0x000 Command 0x2232700382 Data out 0x00000D0A
Address 0xFF00005D Control 0x000 Command 0x7003820030 Data out 0x00000D0A
Address 0x00000000 Control 0x011 Command 0x0BADBADBAD Data out 0x0000000A
Address 0xFF00005F Control 0x000 Command 0x8200303600 Data out 0x0000000A
Address 0xFF000062 Control 0x000 Command 0x3600700032 Data out 0x0000000A
Address 0xFF000064 Control 0x000 Command 0x7000322770 Data out 0x0000000A
Address 0x00000000 Control 0x011 Command 0x0BADBADBAD Data out 0x0000000E
Address 0xFF000066 Control 0x000 Command 0x3227700253 Data out 0x0000000E
Address 0xFF000068 Control 0x000 Command 0x700253FF22 Data out 0x0000000E
Address 0x00000000 Control 0x011 Command 0x0BADBADBAD Data out 0x000D0A00
Address 0xFF00006A Control 0x000 Command 0x53FF223270 Data out 0x000D0A00
Address 0xFF00006C Control 0x000 Command 0x2232700382 Data out 0x000D0A00
Address 0xFF00006E Control 0x000 Command 0x700382001F Data out 0x000D0A00
Address 0x00000000 Control 0x011 Command 0x0BADBADBAD Data out 0x00000000
Address 0xFF000070 Control 0x000 Command 0x82001F3600 Data out 0x00000000
Address 0xFF00008F Control 0x000 Command 0x0500000000 Data out 0x00000000
Address 0xFF000026 Control 0x000 Command 0x68FE36E305 Data out 0x00000000
Address 0x77777776 Control 0x010 Command 0x0000000000 Data out 0x00000000
Address 0xFF000028 Control 0x000 Command 0x36E3050048 Data out 0x00000000
Address 0xFF00002A Control 0x000 Command 0x050048656C Data out 0x00000000
Address 0x00000000 Control 0x000 Command 0x50005100FE Data out 0x00000000
Address 0x00000002 Control 0x000 Command 0x5100FE7777 Data out 0x00000000
Address 0x00000004 Control 0x000 Command 0xFE77777777 Data out 0x00000000
Address 0x00000009 Control 0x000 Command 0xFF12345678 Data out 0x00000000

Выглядит не очень понятно, не правда ли? По правде говоря, нам и самим было не очень удобно читать такие дампы, поэтому мы создали утилиту, дизассемблирующую отладочные дампы системы команд «Эверест». Далее следует результат работы дизассемблера, которому на вход был подан дамп из этой статьи.

ff000000: LOAD R0, 0x00
ff000002: LOAD R1, 0x00
ff000004: LOAD R14, 0x77777777
ff000009: LOAD R15, 0x12345678
ff00000e: LD_MR MR30, R14
Wite [0000001e] ff000010: LD_MR MR31, R15
Wite [0000001f] ff000012: NOTCH
ff000013: LOAD R1, 0x0019
ff000016: LD_MR MR32, R1
Wite [00000020] ff000018: LD_MR MR25, R14
Wite [00000019] ff00001a: DEC R14, 1
ff00001c: LD_MR MR3, R14
Wite [00000003] ff00001e: MOV (R14), R15
Wite [77777776] ff000020: LD_MR MR33, R14
Wite [00000021] Data 656c6c6f
ff000040: LD_MR MR0, R2
Wite [00000000] ff000042: ROL R2, 7
ff000044: LD_MR MR0, R2
Wite [00000000] ff000046: LOAD R3, 0xff
ff000048: LD_MR MR0, R3
Wite [00000000] ff00004a: AND R3, R2
ff00004c: LD_MR MR0, R3
Wite [00000000] ff00004e: JZ 0x0041
ff000051: INC R0, 1
ff000053: LD_MR MR0, R0
Wite [00000000] ff000055: ROL R2, 7
ff000057: LD_MR MR0, R2
Wite [00000000] ff000059: LOAD R3, 0xff
ff00005b: AND R3, R2
ff00005d: LD_MR MR0, R3
Wite [00000000] ff00005f: JZ 0x0030
ff000062: INC R0, 1
ff000064: LD_MR MR0, R0
Wite [00000000] ff000066: ROL R2, 7
ff000068: LD_MR MR0, R2
Wite [00000000] ff00006a: LOAD R3, 0xff
ff00006c: AND R3, R2
ff00006e: LD_MR MR0, R3
Wite [00000000] ff000070: JZ 0x001f
ff000073: INC R0, 1
ff000075: LD_MR MR0, R0
Wite [00000000] ff000077: ROL R2, 7
ff000079: LD_MR MR0, R2
Wite [00000000] ff00007b: LOAD R3, 0xff
ff00007d: AND R3, R2
ff00007f: LD_MR MR0, R3
Wite [00000000] ff000081: JZ 0x000e
ff000084: INC R0, 1
ff000086: LD_MR MR0, R0
Wite [00000000] ff000088: INC R1, 4
ff00008a: LD_MR MR0, R1
Wite [00000000] Data 20776f72
ff000040: LD_MR MR0, R2
Wite [00000000] ff000042: ROL R2, 7
ff000044: LD_MR MR0, R2
Wite [00000000] ff000046: LOAD R3, 0xff
ff000048: LD_MR MR0, R3
Wite [00000000] ff00004a: AND R3, R2
ff00004c: LD_MR MR0, R3
Wite [00000000] ff00004e: JZ 0x0041
ff000051: INC R0, 1
ff000053: LD_MR MR0, R0
Wite [00000000] ff000055: ROL R2, 7
ff000057: LD_MR MR0, R2
Wite [00000000] ff000059: LOAD R3, 0xff
ff00005b: AND R3, R2
ff00005d: LD_MR MR0, R3
Wite [00000000] ff00005f: JZ 0x0030
ff000062: INC R0, 1
ff000064: LD_MR MR0, R0
Wite [00000000] ff000066: ROL R2, 7
ff000068: LD_MR MR0, R2
Wite [00000000] ff00006a: LOAD R3, 0xff
ff00006c: AND R3, R2
ff00006e: LD_MR MR0, R3
Wite [00000000] ff000070: JZ 0x001f
ff000073: INC R0, 1
ff000075: LD_MR MR0, R0
Wite [00000000] ff000077: ROL R2, 7
ff000079: LD_MR MR0, R2
Wite [00000000] ff00007b: LOAD R3, 0xff
ff00007d: AND R3, R2
ff00007f: LD_MR MR0, R3
Wite [00000000] ff000081: JZ 0x000e
ff000084: INC R0, 1
ff000086: LD_MR MR0, R0
Wite [00000000] ff000088: INC R1, 4
ff00008a: LD_MR MR0, R1
Wite [00000000] Data 6c64210d
ff000040: LD_MR MR0, R2
Wite [00000000] ff000042: ROL R2, 7
ff000044: LD_MR MR0, R2
Wite [00000000] ff000046: LOAD R3, 0xff
ff000048: LD_MR MR0, R3
Wite [00000000] ff00004a: AND R3, R2
ff00004c: LD_MR MR0, R3
Wite [00000000] ff00004e: JZ 0x0041
ff000051: INC R0, 1
ff000053: LD_MR MR0, R0
Wite [00000000] ff000055: ROL R2, 7
ff000057: LD_MR MR0, R2
Wite [00000000] ff000059: LOAD R3, 0xff
ff00005b: AND R3, R2
ff00005d: LD_MR MR0, R3
Wite [00000000] ff00005f: JZ 0x0030
ff000062: INC R0, 1
ff000064: LD_MR MR0, R0
Wite [00000000] ff000066: ROL R2, 7
ff000068: LD_MR MR0, R2
Wite [00000000] ff00006a: LOAD R3, 0xff
ff00006c: AND R3, R2
ff00006e: LD_MR MR0, R3
Wite [00000000] ff000070: JZ 0x001f
ff000073: INC R0, 1
ff000075: LD_MR MR0, R0
Wite [00000000] ff000077: ROL R2, 7
ff000079: LD_MR MR0, R2
Wite [00000000] ff00007b: LOAD R3, 0xff
ff00007d: AND R3, R2
ff00007f: LD_MR MR0, R3
Wite [00000000] ff000081: JZ 0x000e
ff000084: INC R0, 1
ff000086: LD_MR MR0, R0
Wite [00000000] ff000088: INC R1, 4
ff00008a: LD_MR MR0, R1
Wite [00000000] Data 0a000021
ff000040: LD_MR MR0, R2
Wite [00000000] ff000042: ROL R2, 7
ff000044: LD_MR MR0, R2
Wite [00000000] ff000046: LOAD R3, 0xff
ff000048: LD_MR MR0, R3
Wite [00000000] ff00004a: AND R3, R2
ff00004c: LD_MR MR0, R3
Wite [00000000] ff00004e: JZ 0x0041
ff000051: INC R0, 1
ff000053: LD_MR MR0, R0
Wite [00000000] ff000055: ROL R2, 7
ff000057: LD_MR MR0, R2
Wite [00000000] ff000059: LOAD R3, 0xff
ff00005b: AND R3, R2
ff00005d: LD_MR MR0, R3
Wite [00000000] ff00005f: JZ 0x0030
ff000062: INC R0, 1
ff000064: LD_MR MR0, R0
Wite [00000000] ff000066: ROL R2, 7
ff000068: LD_MR MR0, R2
Wite [00000000] ff00006a: LOAD R3, 0xff
ff00006c: AND R3, R2
ff00006e: LD_MR MR0, R3
Wite [00000000] Data 00000000
ff000028: INC R14, 4
ff00002a: RETURN
00000000: LOAD R0, 0x00
00000002: LOAD R1, 0x00
00000004: LOAD R14, 0x77777777
00000009: LOAD R15, 0x12345678

В результате работы этого кода в при выходе из подпрограммы strlen в регистре R0 должна находится длина строки «Hello world!\r\n». Найдём последнее упоминание регистра R0 при выводе отладочной информации:

ff000064: LD_MR MR0, R0
Wite [00000000]

Таким образом, при выходе из подпрограммы strlen, в регистре R0 будет шестнадцатеричное число 0xe, что является десятичным числом 14. Это есть искомая длина строки, в чём можно убедиться, пересчитав число симоволов (в т.ч. символов CR and LF) в строке.

Пусть вас не пугает кажущаяся громоздкость этого примера. Во первых, значительную часть кода заняла отладочная информация, которая нам потребовалась для отладки «железа». Во вторых, мы использовали базовый (минимальный) набор команд, необходимый для выполнения операции расчёта длины строки. В будущих версиях мы могли бы ввести команды для работы с байтами и пример бы уменьшился ещё вчетверо. В третьих, мы могли бы микрокод операции сопоставить какой либо инструкции, тем самым уменьшив этот пример до одной ассемблерной инструкции. Наконец, не упускайте из вида факт, что последний дамп и его дизассемблированный листинг показывают не исходный код, а пример работы программы, использующей цикл — т.е. показано полное состояние программы от начала её работы и до её останова.

Счастливые обладатели платы «Марсоход2» могут провести вышеописанный эксперимент самостоятеьно, скачав тестовую прошивку с форума «Марсохода».


Оставить комментарий