При разработке нового процессора, компания 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]
Black_mirror это что шутка??? - что на нём делать-то можно :rolleyezzzzzz: и, вообще, такие вопрсы до разработки задавать надо))))
UbIvItS Зато у него есть команды ADD, ADC, AND, OR, TEST, SHR, SHL, RCL, RCR, ROL, ROR, MOV и другие. Неужели этих команд не хватит чтобы заменить вычитание? К тому же после реализации недостающих функций всё остальное можно будет писать на Си, не задумываясь от том, как в памяти хранятся числа и делается вычитание. Это задачка на сообразительность.
Black_mirror странно ты пишешь, что нет команды sub и в тоже время, что вычитание есть, но оно не эффективно.
UbIvItS Код (Text): mov eax,A mov ebx,B jmp .c .m: add eax,$FFFFFFFF add ebx,$FFFFFFFF .c: test ebx,ebx jnz .m Наверно не самая лучшая замена для SUB A,B?!
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
Такое пойдет? 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:
NOT ввиде цикла это конечно хорошо, но если числа хранить немного иначе, то SUB, NOT, NEG, XOR можно будет реализовать не более чем за 10-12 команд. А что касатеся SUB reg,imm, можете считать что компилятор это заменит на ADD reg,-imm.
Black_mirror Достаточно было оставить команду XOR (NAND=NOT+AND или NOR=NOT+OR) смотри здесь для простоты 4 разряда r1=1011b r2=0000b сделать r2=not r1 Код (Text): test r1,1 jnz a1 add r2,1 a1: test r1,2 jnz a2 add r2,2 a2: test r1,4 jnz a3 add r2,4 a3: test r1,8 jnz a4 add r2,8 a4: r2=not r1
В этой задаче совершенно не обязательно чтобы число хранилось в двоичном виде, может удобнее хранить его побайтно, а вычисления делать по таблицам, или вообще в десятичном виде его держать. То есть тут главное придумать удобный для вычислений отсутствующих функций(SUB, NOT, NEG, XOR) формат и способ перевода чисел из него в строковое представление и обратно.
Ну если в проц сложно сделать NOT и XOR то в топку такое (а разрабов уволить). Без NOT изначально мертвый проц.
Здесь нужно будет находить остаток от деления на 10, а деления нет. Тогда сделаем его. Деление x/10: Пусть результат умножения возвращается в двух регистрах <r9:r8>. Тогда умножим число x на 0xcccccccccccccccd (0,8 умноженное на 2^64, а затем округлённое), а затем сдвинем r9 на 3 разряда вправо: Код (Text): <r9,r8> = x * 0xcccccccccccccccd r9 = r9 shr 3 ; r9 = x/10 Теперь найдём остаток (остаток - это разница между делимым и неполным частным, умноженным на делитель): Код (Text): r3 = r9 shl 2 ; r3 = r9 * 4 r3 = r3 + r9 ; r3 = r9 * 5 r3 = r3 + r3 ; r3 = r3 * 10 r3 = x - r3 ; r3 = x mod 10 А умножение на 0xcccccccccccccccd можно реализовать при помощи алгоритма беззнакового умножения Бута:
AssemblerIA64 Чтобы не делить на 10, можно просто вычитать, или складывать: Код (Text): itoa:;(str +4, num +8) push ebp push edi push esi push ebx ;+16 mov edi,[16+esp+4] mov ebx,[16+esp+8] mov ecx,10 mov esi,.table-4 .l2:;этот цикл нужен только для того, чтобы убрать лишние нолики add esi,4 mov edx,ebx add edx,[esi] jc .l0 add ecx,-1 jnz .l2 add ecx,1 .l0: mov al,'0'-1 .l1: add al,1 mov edx,ebx add ebx,[esi] jc .l1 mov ebx,edx stosb add esi,4 add ecx,-1 jnz .l0 mov al,0 stosb pop ebx pop esi pop edi pop ebp ret 8 .table dd -1000000000,-100000000,-10000000,-1000000,-100000,-10000,-1000,-100,-10,-1 Еще раз обращаю внимание на то, того для эффективного выполнения операций SUB, NOT, NEG, XOR нужен нестандартный формат хранения чисел. И ваша задача его придумать
Несмотря на заявления критиков о том, что процессор без NOT нужно в топку, а разработчиков уволить, компания MegaRISC сумела реализовать функцию NOT всего за 8 команд. Также упоминалось о том, что как только будет реализован новый формат для хранения чисел, для выполнения операции сложения или вычитания будет достаточно не более 7 инструкций!
Black_mirror Это не процессор, а кусок говна, мягко сказано. Эти примитивные операции реализуются аппаратно с помощью регистров. Убейся апстену!