AsMasteR писал(а): ↑02.04.2009 22:51
О_о я же не виноват, если некоторые при слове ассемблер со стула падают..
Кто тебе сказал, что мне нужен калькулятор?? Особенно в качестве бажного гугл кода... А нужный алг. я уже почерпнул из вышеперечисленных алгов. Кста, почти уже прогу закодил..
Что касается ассемблера, я планировал заменить все действия функции соответствуыщими асм эквивалентами и ф-циями (попутно избавившись от скобок) непосредственно в строке, а после передать управление в ячейку памяти, где находится эта строка.. ну и jmp домой.. конешн.. ну и что тут бредового?
никто от слова ассемблер со стула не падает.
если я правильно понял, вы хотите сделать что-то вроде преобразования "2 + 15*4" в следующую форму(для моего удобства будем называть этот код
шеллом):
Код: Выделить всё
movl $2, %ecx
movl $15, %edx
movl $4, %eax
imulq %rdx, %rax
movl %eax, %edx
movl %ecx, %eax
leal (%rdx,%rax), %eax
или в следующий машинный код:
unsigned char shell[] = {0xb9, 0x02, 0x00, 0x00, 0x00, 0xba, 0x0f, 0x00, 0x00, 0x00, 0xb8, 0x04, 0x00, 0x00, 0x00, 0x48, 0x0f, 0xaf, 0xc2, 0x89, 0xc2, 0x89, 0xc8, 0x8d, 0x04, 0x02 };
вопрос лишь в том, зачем все ЭТО? мало того, что вам придется анализировать строку на количество в ней чисел, потом расчитывать количество необходимого объма памяти для всех неопходимых ассемблерных команд, предварительно позаботившись о способе возвращения из шелла итогового значения, подготовке стека и регистров вызывающей функции к передаче управления (регистры нужно будет сохранить); следом нужно будет расположить все это в правильном порядке в памяти(читайте "в массиве"), передать управление в код (что проще простого) и молиться о том чтобы все это монструозное, корявое и непереносимое на другие архитектуры поделие работало. Весь выигрыш в скорости, который вам давал асм испарится вместе со всеми предварительными приготовлениями. И я еще не коснулся арифметики с плавающей точкой =)
на мой взгляд, проще уж организовать пайп с каким-нибудь интерпретатором (можно взять Python) и передать эту строку ему, получить и обработать результат. Как вариант можно использовать Qt+QScript - тоже очень удобная штука.
но если вам неймется, вы не боитесь трудностей, вам не жалко собственные нервы - пишите все с использованием асма.