Forums » Программное обеспечение »
Функциональная модель
Added by Natalia_multiclet over 11 years ago
Обсуждение, предложения, замечания
Replies (14)
RE: Функциональная модель - Added by qewerty over 11 years ago
Можете прояснить ситуацию? Какая-то проблема с размещением значений в памяти данных либо я чего-то недопонимаю.
Исходник:
int x = 0x47;
int y = 0x23;
int z;
void main()
{
int r;
z = x + y;
r = z * z;
}
Makefile:
1.b: 1.o
mc-ld -M -o1.b ${PATH_TO_MULTICLET_SDK}/lib/MCp0411100101/crt0.o 1.o
1.i: 1.c
mc-mcpp 1.c 1.i
1.s: 1.i
mc-rcc -target=mcp 1.i 1.s
1.o: 1.s
mc-as --arch=MCp0411100101 1.s -o1.o
clean:
rm *.o *.i *.s 1.b
Вывод линковщика:
File 1.o
section .text
LOCAL main.P0 0x00000074
LOCAL main.P1 0x00000075
LOCAL main.P2 0x00000077
LOCAL main.P3 0x00000078
LOCAL main.1L 0x0000007B
LOCAL main.P4 0x0000007A
LOCAL main.PF 0x0000007B
GLOBAL main 0x00000072
section .data
GLOBAL x 0x00000088
GLOBAL y 0x0000008C
section .bss
GLOBAL z 0x00000090
Т.е. переменная x расположена по адресу 0x00000088, а y по адресу 0x0000008C. Однако вывод mc-model такой:
Команда: mc-model -dump-raw -dump-addr -dump-byte -dump-length 4 -dump-from 0x00000088 1.b
00000088 : 00 00 00 00
0000008C : 47 00 00 00
Т.е. по адресу 0x00000088 расположен 0, а по адресу то, что должно быть по 0x00000088. Далее в памяти ничего нет, по крайней мере ничего не выводится.
Если запустить модель так: mc-model -inst-asm -inst-strange -dump-raw -dump-addr -dump-byte -dump-length 4 -dump-from 0x00000088 1.b
То можно увидеть параграф:
0.0000000000000077 <= 0000000000000090, 0000000000000077 : jmp 0x77
0.0000000000000047 <= 0000000000000090, 000000000000008c : rdsl 0x8C
1.0000000000000000 <= 0000000000000090, 0000000000000088 : rdsl 0x88
0.0000000000000047 <= 0000000000000000, 0000000000000047 : addsl @1, @2 ; <--- вот тут видно, что считалось в коммутатор из этих адресов
0.0000000000000047 <= 0000000000000000, 000000000001ffec : rdl #BP(38), 0xFFFFFFF8
0.0000000000000047 <= 0000000000000047, 0000000000000000 : wrsl @2, @1
Где действительно по адресу 0x8C лежит 0x47 и ноль по адресу 0x88.
Забавно, что в hex-редакторе в конечном бинарнике видно оба числа (0x47 и 0x23) друг за другом.
RE: Функциональная модель - Added by krufter_multiclet over 11 years ago
У меня вот такая картина:
0.0000000000000077 <= 0000000000000090, 0000000000000077 : jmp 0x77 0.0000000000000023 <= 0000000000000090, 000000000000008c : rdsl 0x8C 0.0000000000000047 <= 0000000000000090, 0000000000000088 : rdsl 0x88 0.000000000000006a <= 0000000000000047, 0000000000000023 : addsl @1, @2 0.0000000000000090 <= 0000000000000047, 000000000001ffec : rdl #BP(38), 0xFFFFFFF8 0.0000000000000090 <= 000000000000006a, 0000000000000090 : wrsl @2, @1
У вас последние версии ассемблера, линковщика?
Могу завтра проверить что выдаст плата в результате.
P.S. Постараюсь побыстрее закончить страничку использования отладчика. С моделью я так понимаю вы разобрались.
RE: Функциональная модель - Added by qewerty over 11 years ago
Сверил (дата/время и дифф) то, что у меня c тем, что сейчас для Linux здесь - http://multiclet.com/index.php/ru/support/technical-documents
Одно и тоже от 14 июня. Не думаю, что есть смысл проверять на плате. Слишком примитивный пример. Инструменты запускаю на Ubuntu 12.04 64-bit. Попробую ещё на 32-bit и на Windows.
RE: Функциональная модель - Added by krufter_multiclet over 11 years ago
Попробуйте вот эти набором собрать. Я собирал под Windows, над под Ubuntu собрать.
RE: Функциональная модель - Added by qewerty over 11 years ago
Спасибо! Попробую чуть позже. То, что на сайте скачать предлагается, проверил и на Ubuntu 32-bit и на Windows XP - та же самая проблема.
RE: Функциональная модель - Added by qewerty over 11 years ago
Да, с этими работает. Запускал в wine, всё отлично. Проблема в as и ld одновременно, замена чего-то одного не помогает. Остальные тулзы работают и из старой сборки, даже старая mc-model корректно выполняет их результат.
Получается, SDK, которое лежит у вас тут на сайте (http://multiclet.com/index.php/ru/support/technical-documents), сломаное.
RE: Функциональная модель - Added by krufter_multiclet over 11 years ago
Поправили линковщик SDK, теперь всё должно работать.
RE: Функциональная модель - Added by sprin over 11 years ago
Здравствуйте.
В "РУКОВОДСТВО ПОЛЬЗОВАТЕЛЯ. ПО" для команды "wr" написано, что если второй аргумент записан в виде "@S", то игнорируются с 32 по 63 разряды.
Что-то не хочет работать:
Пример¶
Show HideТак не работает: (см. "0.000a000000000000 <= 00000000c2feb9e8, 000a000000000000 : wrl @9, @4") похоже берёт все 64 разряда
--- complete --------------------- 8.00000000c2feb9e8 <= 0000000000000000, 00000000c2feb9e8 : getl #3 8.0009fffffffffff4 <= 0000000000000000, 0009fffffffffff4 : getl #SP(39) 0.0009fffffffffff4 <= 0000000000000000, 00000000fffffffd : rdl #SP(39) 0.0000000003000000 <= 0000000000000000, 0000000000000001 : rdl #SP(39), 0x4 0.00000000f7f26b83 <= 0000000000000000, 0000000000000005 : rdl #SP(39), 0x8 0.000a000000000000 <= 0009fffffffffff4, 000000000000000c : addl @4, 0xC 0.000a000000000000 <= 0000000000000003, 0000000000000000 : setl #3, @4 0.000a000000000000 <= 0000000000000002, 0000000003000000 : setl #2, @4 0.000a000000000000 <= 0000000000000001, 00000000f7f26b83 : setl #1, @4 0.000a000000000000 <= 00000000c2feb9e8, 000a000000000000 : wrl @9, @4 0.000a000000000000 <= 0000000000000027, 000a000000000000 : setl #SP(39), @5 0.000a000000000000 <= 0000000000000027, 000a000000000000 : jmp @6 --- complete ---------------------
Так работает (см. "0.000a000000000000 <= 00000000c2feb9e8, 0000000000000000 : wrl @9, 0x0")
--- complete --------------------- 8.00000000c2feb9e8 <= 0000000000000000, 00000000c2feb9e8 : getl #3 8.0009fffffffffff4 <= 0000000000000000, 0009fffffffffff4 : getl #SP(39) 0.0009fffffffffff4 <= 0000000000000000, 00000000fffffffd : rdl #SP(39) 0.0000000003000000 <= 0000000000000000, 0000000000000001 : rdl #SP(39), 0x4 0.00000000f7f26b83 <= 0000000000000000, 0000000000000005 : rdl #SP(39), 0x8 0.000a000000000000 <= 0009fffffffffff4, 000000000000000c : addl @4, 0xC 0.000a000000000000 <= 0000000000000003, 0000000000000000 : setl #3, @4 0.000a000000000000 <= 0000000000000002, 0000000003000000 : setl #2, @4 0.000a000000000000 <= 0000000000000001, 00000000f7f26b83 : setl #1, @4 0.000a000000000000 <= 00000000c2feb9e8, 0000000000000000 : wrl @9, 0x0 0.000a000000000000 <= 0000000000000027, 000a000000000000 : setl #SP(39), @5 0.000a000000000000 <= 0000000000000027, 000a000000000000 : jmp @6 --- complete ---------------------
Использую: MultiCletSDK_ru.20130814.exe
RE: Функциональная модель - Added by krufter_multiclet over 11 years ago
На плате всё отрабатывается верно, сейчас посмотрим вывод модели.
RE: Функциональная модель - Added by sprin over 11 years ago
По поводу "wr" в функциональной модели.
Сделал пример (см. ниже).
В процессе выяснилось что:- get(q,l,b...) берёт 64 бита не зависимо от модификатора для аргумента типа IR
- В "РУКОВОДСТВО ПОЛЬЗОВАТЕЛЯ. ПО" для "wr" указано, что можно использовать GPR, но выдаёт ошибку " error: invalid register type for operation 'wr...' "
- В "РУКОВОДСТВО ПОЛЬЗОВАТЕЛЯ. ПО" для "wr" надо уточнить момент, что у второго аргумента берутся только первые 4 байта (в описании написано только про "@S", а про регистры неясно)
- В "РУКОВОДСТВО ПОЛЬЗОВАТЕЛЯ. ПО" для "wr" указано, что если второй аргумент "@S"(ссылка на коммутатор), то из него берутся только первые 32 бита, но в функциональной модели берётся больше чем 32 бита.
Пример: TestWR¶
Show Hide.text .global testWR testWR: l0 := getl 0x00000A00 l1 := sllq @l0, 32 l2 := addl @l1, 0x00001000 setq #3, @l2 ; = 0x00000A0000001000 setq #32, @l2 ; = 0x00000A0000001000 jmp testWR.P1 complete .local testWR.P1 testWR.P1: l0 := getl 1234567890 ; OK ; Этот блок работает нормально l1 := getq 0x00000A0000000100 ; OK Обрезает до 32 бит l2 := getl 0x00000000000000F0 ; OK l3 := getb 0x0000000000000010 ; OK ; Этот блок работает нормально l4 := getq #3 ; OK берёт 8 байт l5 := getl #3 ; OK берёт 4 байта l6 := getb #3 ; OK берёт 1 байт ; !!! Тут надо уточнить. get(q,l,b...) берёт 64 бита не зависимо от модификатора для аргумента типа IR l7 := getq #32 ; OK l8 := getl #32 ; <-!!! берёт не 4, а 8 байт l9 := getb #32 ; <-!!! берёт не 1, а 8 байт ; Этот блок работает нормально ; wrl @l0, 0x04 ; OK ; wrl @l0, @l1 ; OK ; wrl @l0, @l2 ; OK ; wrl @l0, @l3 ; OK ; !!! В "РУКОВОДСТВО ПОЛЬЗОВАТЕЛЯ. ПО" для "wr" указано, что можно использовать GPR, но: ; wrq @l0, #3 ;выдаёт ошибку " error: invalid register type for operation 'wrq' " ; wrl @l0, #3 ;выдаёт ошибку " error: invalid register type for operation 'wrl' " ; wrb @l0, #3 ;выдаёт ошибку " error: invalid register type for operation 'wrb' " ; !!! В "РУКОВОДСТВО ПОЛЬЗОВАТЕЛЯ. ПО" для "wr" надо уточнить момент, что у второго аргумента ; берутся только первые 4 байта (в описании только про "@S", а про регистры неясно) ; wrq @l7, #32 ; OK записывает 8 байт по адресу в 0-31 бит ; wrl @l0, #32 ; OK записывает 4 байта по адресу в 0-31 бит ; wrb @l0, #32 ; OK записывает 1 байт по адресу в 0-31 бит ; !!! В "РУКОВОДСТВО ПОЛЬЗОВАТЕЛЯ. ПО" для "wr" указано, что если второй аргумент "@S"(ссылка на коммутатор), то ; из него берутся только первые 32 бита, но: wrq @l7, @l4 ; <-!!! из @l4 берёт не 32, а 64 бита wrl @l0, @l4 ; <-!!! из @l4 берёт не 32, а 64 бита wrb @l0, @l4 ; <-!!! из @l4 берёт не 32, а 64 бита complete
RE: Функциональная модель - Added by krufter_multiclet over 11 years ago
l8 := getl #32 ; <-!!! берёт не 4, а 8 байт
Команда get при работе с индексными регистрами всегда получает 8 байт, в новом процессоре команда get будет работать с индексными регистрами согласно типам команд.
wrq @l0, #3 ;выдаёт ошибку " error: invalid register type for operation 'wrq' "
Поправили, скоро выложим новый ассемблер.
wrq @l7, @l4 ; <-!!! из @l4 берёт не 32, а 64 бита
Поправили модель, запись проходит по адресу в 32-х младших разрядах.
RE: Функциональная модель - Added by Natalia_multiclet about 11 years ago
Выложили на сайт обновленное "РУКОВОДСТВО ПОЛЬЗОВАТЕЛЯ. ПО" - http://www.multiclet.com/index.php/ru/support/technical-documents
RE: Функциональная модель - Added by sprin about 11 years ago
- Мне казалось, что логика работы "slr"(b, l) следующая:
1. Берём 1 или 4 байта
2. Сдвигаем на количество указанное во втором аргументе
3. Записываем результат в коммутатор 1 или 4 байта (остальное заполняется нулями)но по модели выходит следующее:
1. Берём 8 байт
2. из п.1 сдвигаем на количество указанное во втором аргументе в первом или 1-4 байтах
3. Записываем результат в коммутатор из п.2
... 0.499602d249960200 <= 499602d2499602d2, 0000000000000008 : slrb @5, 0x8 0.499602d200004996 <= 499602d2499602d2, 0000000000000010 : slrl @6, 0x10 0.499602d200000049 <= 499602d2499602d2, 0000000000000018 : slrl @7, 0x18 ...
- Аналогично с "add"(b, l)
... 8.499602d2499602d2 <= 499602d200000000, 00000000499602d2 : addl @1, 0x499602D2 ...
2. По поводу функциональной модели:
- Падает при попытке выполнить код типа: "or @S, #IR" или "and @S, #IR" (Пример ниже)
- Поправьте, пожалуйста, вывод для команд с одним аргументом:
krufter_multiclet wrote:
Выводит два аргумента команды и полученное в коммутаторе значение, после выполнения команды.
8.00000000bf800000 <= 003e000077c1c024, 00000000ffffffff : cslf 0xFFFFFFFF00000000bf800000 - значение в коммутаторе после операции cslf, 003e000077c1c024 - мусор в первом аргумента(должен быть ноль раз команда имеет только один аргумент - скоро поправим и будет 0), 00000000ffffffff - второй аргумент (значение аргумента одноаргументной команды помещается во второй аргумент); cslf 0xFFFFFFFF - команда с аргументом
3. По поводу "РУКОВОДСТВО ПОЛЬЗОВАТЕЛЯ. ПО для P1"
- Для "and" и "or" мне кажется надо уточнить, что операция всегда производится над 64 битами (@S1) и возвращает 64 бит вне зависимости от размерности второго аргумента, а для "V8,32" старшие 32 разряда (с 32 по 63) заполняются нулями.
- Для "wr" лучше написать короче и понятнее: "Во втором аргументе (ARG2), используются только первые 32 бита для всех доступных реализаций в команде (вне зависимости от типа ARG2), старшие 32 разряда (с 32 по 63) игнорируются". Или что-то вроде этого.
- Для "get" надо поправить пример, для IR и CR там указан оператор с "l", а надо "q" (согласно схеме), и теоретически компилятор должен вывести ошибку (надеюсь этот момент учтут в следующих релизах компилятора).
Пример¶
Show Hide.text .global TestShiftOrAnd TestShiftOrAnd: l0 := getl 1234567890 ; OK l1 := sllq @l0, 32 ; OK l2 := addl @l1, 1234567890 ; !!! 0x499602d2499602d2 <- Это такая фишка или баг модели? setq #3, @l2 ; OK = 0x499602d2499602d2 setq #32, @l2 ; OK = 0x499602d2499602d2 jmp TestShiftOrAnd.P1 complete .local TestShiftOrAnd.P1 TestShiftOrAnd.P1: l0 := getl 987654321 ; OK l1 := sllq @l0, 32 ; OK l2 := getq #3 ; OK ;Этот блок работает нормально ; or @l0, 12345678901234567890 ; ОК Второй параметр обрезает до 32 бит ; or @l1, 12345678901234567890 ; ОК Второй параметр обрезает до 32 бит ; and @l0, 12345678901234567890 ; ОК Второй параметр обрезает до 32 бит ; and @l1, 12345678901234567890 ; ОК Второй параметр обрезает до 32 бит ; or @l0, @l2 ; ОК ; or @l1, @l2 ; ОК ; and @l0, @l2 ; ОК ; and @l1, @l2 ; ОК or @l0, #3 ; ОК берёт все 64 бита or @l1, #3 ; ОК берёт все 64 бита and @l0, #3 ; ОК берёт все 64 бита and @l1, #3 ; ОК берёт все 64 бита ; or @l0, #32 ;!!! на этом модель падает, В "РУКОВОДСТВО ПОЛЬЗОВАТЕЛЯ. ПО" для "or" указано, что можно использовать IR. ; or @l1, #32 ;!!! на этом модель падает, В "РУКОВОДСТВО ПОЛЬЗОВАТЕЛЯ. ПО" для "or" указано, что можно использовать IR. ; and @l0, #32 ;!!! на этом модель падает, В "РУКОВОДСТВО ПОЛЬЗОВАТЕЛЯ. ПО" для "and" указано, что можно использовать IR. ; and @l1, #32 ;!!! на этом модель падает, В "РУКОВОДСТВО ПОЛЬЗОВАТЕЛЯ. ПО" для "and" указано, что можно использовать IR. slrb @l2, 8 ;!!! <- Это такая фишка или баг модели? slrl @l2, 16 ;!!! <- Это такая фишка или баг модели? slrl @l2, 24 ;!!! <- Это такая фишка или баг модели? slrq @l2, 8 ; OK slrq @l2, 16 ; OK slrq @l2, 24 ; OK slrq @l2, 32 ; OK slrq @l2, 40 ; OK slrq @l2, 48 ; OK slrq @l2, 56 ; OK sllb @l2, 8 ; OK slll @l2, 16 ; OK slll @l2, 24 ; OK sllq @l2, 8 ; OK sllq @l2, 16 ; OK sllq @l2, 24 ; OK sllq @l2, 32 ; OK sllq @l2, 40 ; OK sllq @l2, 48 ; OK sllq @l2, 56 ; OK complete
RE: Функциональная модель - Added by krufter_multiclet about 11 years ago
1) Из коммутатора берутся 64 бита и дальше сдвигаются в зависимости от типа, старшие биты нулями не заполняются.
2) Модель поправим
3) Документацию проверим и поправим в ближайшее время, спасибо.