Задачка о новом процессоре

Тема в разделе "WASM.A&O", создана пользователем Black_mirror, 6 июн 2008.

  1. Black_mirror

    Black_mirror Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2002
    Сообщения:
    1.035
    При разработке нового процессора, компания MegaRISC решила отказаться от обратной совместимости и сделать его совместимым лишь частично с процессорами серии x86.

    Основные особенности нового процессора:

    Только два флага Z и С!
    Только 7 команд переходов JMP, JZ, JNZ, JC, JNC, CALL и RET!
    Полное отсутствие FPU, MMX, 3DNow, SSE, SSE2 и так далее!
    Отсутствие команд умножения и деления!
    Отсутствие команды вычитания и производных! То есть нету команд SUB, SBB, CMP, NOT, NEG, XOR.

    Ну а в остальном новый процессор практически ничем не отличается от существующих.

    Правда при написании компилятора с языка Cи у компании MegaRISC возникли некоторые проблемы:
    1) Не придуман эффективный способ выполнения вычитания
    2) Не написаны функции SUB, CMP, NOT, NEG, XOR.
    3) Не написана функция для преобразования ASCIIZ-строки в число(в формат пригодный для решения первой проблемы)
    4) Не написана функция для преобразования числа в ASCIIZ-строку

    Быть может вы знаете как их решить?!

    [add]
    Видимо я очень плохо сформулировал условие.
    Первая задача которую нужно решить - это используя MOV, ADD, AND и OR построить инструкцию NOT (числа пока в обычном виде). Потребуется не более 8 команд. А дальше уже можно думать как хранить числа так, чтобы NOT, ADD, SUB, NEG, XOR можно было выполнить не более чем за 8 команд (если один из операндов и результат находятся в регистрах).
    [/add]
     
  2. UbIvItS

    UbIvItS Well-Known Member

    Публикаций:
    0
    Регистрация:
    5 янв 2007
    Сообщения:
    6.243
    Black_mirror
    это что шутка??? - что на нём делать-то можно :rolleyezzzzzz: и, вообще, такие вопрсы до разработки задавать надо:)))))
     
  3. Black_mirror

    Black_mirror Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2002
    Сообщения:
    1.035
    UbIvItS
    Зато у него есть команды ADD, ADC, AND, OR, TEST, SHR, SHL, RCL, RCR, ROL, ROR, MOV и другие. Неужели этих команд не хватит чтобы заменить вычитание? К тому же после реализации недостающих функций всё остальное можно будет писать на Си, не задумываясь от том, как в памяти хранятся числа и делается вычитание.

    Это задачка на сообразительность.
     
  4. UbIvItS

    UbIvItS Well-Known Member

    Публикаций:
    0
    Регистрация:
    5 янв 2007
    Сообщения:
    6.243
    Black_mirror
    странно ты пишешь, что нет команды sub и в тоже время, что вычитание есть, но оно не эффективно.
     
  5. Black_mirror

    Black_mirror Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2002
    Сообщения:
    1.035
    UbIvItS
    Код (Text):
    1.   mov eax,A
    2.   mov ebx,B
    3.   jmp .c
    4. .m:
    5.   add eax,$FFFFFFFF
    6.   add ebx,$FFFFFFFF
    7. .c:
    8.   test ebx,ebx
    9.   jnz .m
    Наверно не самая лучшая замена для SUB A,B?!
     
  6. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    Black_mirror
    Реализуем Not как цикл. А остальное легко получить.

    1)
    Если константа
    add r, -imm
    Если регистр
    SUB

    neg r1
    add r2,r1

    2)
    NEG
    not r1
    add r1,1 //inc r1

    NOT
    тут цикл

    XOR
    push r1
    push r2
    push r3
    push r4

    not r1
    not r2
    mov r3,r2
    and r3, esp-12
    mov r4,r1
    and r4, esp-8
    or r1,r4
    pop r4
    pop r3
    pop r2
    add esp,4


    CMP

    push r1
    sub r1,r2
    pop r1
     
  7. _basmp_

    _basmp_ New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2005
    Сообщения:
    2.939
    Такое пойдет?

    sub eax,ebx
    ==
    mov edx,ebx
    mov ecx,0ffffffffh
    jmp short sub_loop_start
    sub_loop_b:
    shl ecx
    sub_loop_start:
    test edx,edx
    jz short sub_loop_e
    shr edx
    jnc short sub_loop_b
    add eax,ecx
    jmp short sub_loop_b
    sub_loop_e:
     
  8. UTeX

    UTeX New Member

    Публикаций:
    0
    Регистрация:
    19 окт 2007
    Сообщения:
    584
  9. _basmp_

    _basmp_ New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2005
    Сообщения:
    2.939
  10. Mikl_

    Mikl_ New Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2006
    Сообщения:
    907
    Замена SUB reg,imm
    XOR reg,0FFFFFFFFh/ADD reg,1+imm
     
  11. Black_mirror

    Black_mirror Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2002
    Сообщения:
    1.035
    NOT ввиде цикла это конечно хорошо, но если числа хранить немного иначе, то SUB, NOT, NEG, XOR можно будет реализовать не более чем за 10-12 команд.

    А что касатеся SUB reg,imm, можете считать что компилятор это заменит на ADD reg,-imm.
     
  12. Mikl_

    Mikl_ New Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2006
    Сообщения:
    907
    Black_mirror
    Достаточно было оставить команду XOR (NAND=NOT+AND или NOR=NOT+OR) смотри здесь
    для простоты 4 разряда r1=1011b r2=0000b сделать r2=not r1
    Код (Text):
    1.       test r1,1
    2.       jnz a1
    3.       add r2,1
    4. a1: test r1,2
    5.       jnz a2
    6.       add r2,2
    7. a2:  test r1,4
    8.       jnz a3
    9.       add r2,4
    10. a3:  test r1,8
    11.       jnz a4
    12.       add r2,8
    13. a4:  r2=not r1
     
  13. Black_mirror

    Black_mirror Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2002
    Сообщения:
    1.035
    В этой задаче совершенно не обязательно чтобы число хранилось в двоичном виде, может удобнее хранить его побайтно, а вычисления делать по таблицам, или вообще в десятичном виде его держать. То есть тут главное придумать удобный для вычислений отсутствующих функций(SUB, NOT, NEG, XOR) формат и способ перевода чисел из него в строковое представление и обратно.
     
  14. SWR

    SWR New Member

    Публикаций:
    0
    Регистрация:
    11 май 2006
    Сообщения:
    226
    Адрес:
    Russia
    Ну если в проц сложно сделать NOT и XOR то в топку такое (а разрабов уволить).
    Без NOT изначально мертвый проц.
     
  15. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    Black_mirror
    Я тут подумал NOT и XOR проще реализовать таблицей.
     
  16. AssemblerIA64

    AssemblerIA64 New Member

    Публикаций:
    0
    Регистрация:
    7 окт 2007
    Сообщения:
    160
    Здесь нужно будет находить остаток от деления на 10, а деления нет.
    Тогда сделаем его.

    Деление x/10:
    Пусть результат умножения возвращается в двух регистрах <r9:r8>.
    Тогда умножим число x на 0xcccccccccccccccd (0,8 умноженное на 2^64, а затем округлённое), а затем сдвинем r9 на 3 разряда вправо:
    Код (Text):
    1. <r9,r8> = x * 0xcccccccccccccccd
    2. r9 = r9 shr 3               ; r9 = x/10
    Теперь найдём остаток (остаток - это разница между делимым и неполным частным, умноженным на делитель):
    Код (Text):
    1. r3 = r9 shl 2               ; r3 = r9 * 4
    2. r3 = r3 + r9                ; r3 = r9 * 5      
    3. r3 = r3 + r3                ; r3 = r3 * 10
    4. r3 = x - r3                 ; r3 = x mod 10
    А умножение на 0xcccccccccccccccd можно реализовать при помощи алгоритма беззнакового умножения Бута:
    [​IMG]
     
  17. Black_mirror

    Black_mirror Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2002
    Сообщения:
    1.035
    AssemblerIA64
    Чтобы не делить на 10, можно просто вычитать, или складывать:
    Код (Text):
    1. itoa:;(str +4, num +8)
    2.     push ebp
    3.     push edi
    4.     push esi
    5.     push ebx    ;+16
    6.     mov edi,[16+esp+4]
    7.     mov ebx,[16+esp+8]
    8.     mov ecx,10
    9.     mov esi,.table-4
    10.     .l2:;этот цикл нужен только для того, чтобы убрать лишние нолики
    11.     add esi,4
    12.     mov edx,ebx
    13.     add edx,[esi]
    14.     jc .l0
    15.     add ecx,-1
    16.     jnz .l2
    17.     add ecx,1
    18.     .l0:
    19.     mov al,'0'-1
    20.     .l1:   
    21.     add al,1
    22.     mov edx,ebx
    23.     add ebx,[esi]
    24.     jc .l1
    25.     mov ebx,edx
    26.     stosb  
    27.     add esi,4
    28.     add ecx,-1
    29.     jnz .l0
    30.     mov al,0
    31.     stosb
    32.     pop ebx
    33.     pop esi
    34.     pop edi
    35.     pop ebp
    36.     ret 8
    37.     .table dd -1000000000,-100000000,-10000000,-1000000,-100000,-10000,-1000,-100,-10,-1
    Еще раз обращаю внимание на то, того для эффективного выполнения операций SUB, NOT, NEG, XOR нужен нестандартный формат хранения чисел. И ваша задача его придумать :)
     
  18. Black_mirror

    Black_mirror Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2002
    Сообщения:
    1.035
    Несмотря на заявления критиков о том, что процессор без NOT нужно в топку, а разработчиков уволить, компания MegaRISC сумела реализовать функцию NOT всего за 8 команд. Также упоминалось о том, что как только будет реализован новый формат для хранения чисел, для выполнения операции сложения или вычитания будет достаточно не более 7 инструкций!
     
  19. UTeX

    UTeX New Member

    Публикаций:
    0
    Регистрация:
    19 окт 2007
    Сообщения:
    584
  20. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Black_mirror
    Это не процессор, а кусок говна, мягко сказано.
    Эти примитивные операции реализуются аппаратно с помощью регистров.
    Убейся апстену!