Page 9 of 77

Re: Помогите новичку

Posted: Mon Feb 08, 2010 7:22 pm
by art_zh
Sorcerer wrote: Подскажите, пожалуйста :) Как мне ввести число, используя консоль?
То есть я в принципе знаю, что нужно ввести строку (или же используя con_getch считывать символы).И даже могу отрубить ненужное - то есть оставить строку, состоящую только из цифр.

Как перевести всё это дело в число?
Интересно и для целых чисел, и особенно для float-point..
Перевод целых десятичных чисел в двоичные - проще простого (если только уверен, что в твоей цепочке - только символы от '0' до '9'):

Code: Select all

0) обнулить аккумулятор (xor eax,eax)
1) ввести первую (самую старшую) цифру в байтовый регистр (mov bl, byte [string]);
2) вычесть код символа '0' (sub bl, '0') - там останется голая десятичная цифра
3) прибавить эту цифру к аккумулятору;
4) если конец строки - на выход, 
5) если нет - умножить аккумулятор на 10
6) ввести в bl след. цифру - и на шаг 2)
для дробной части надо немножко поплясать с бубном.
Для начала надо таким же манером перевести дробную часть в двоичное число и запомнить сколько всего было разрядов после запятой (включая нули слева и справа). Например, .234 - это 234/1000, а .0234 означает, что число 234 надо делить на 10000. Это вроде бы всем понятно, но многие почему-то до пенсии с этим путаются.

Теперь перейдем к двоичному представлению дробной части. Ее хранят в отдельной структуре фиксированной длины (например, 12 битов), причем старший бит соответствует 1/2, следующий 1/4, ..., самый младший - 1/4096. Короче, .110000000000 = 3/4, а .000000000011 = 3/4096

Осталось только решить пропорцию: Х/(2^b) = D/(10^d),
где Х-наша неизвестная двоичная дробная часть,
b - число бит в двоичной дробной части,
D - известная десятичная дробная часть (уже в двоичной записи!),
d - число цифр в десятичной дробной части
(я специально оставил формулу в виде нерешённой пропорции - её можно использовать и для обратного преобразования двоичных дробей в десятичные)

В FPU вещественные числа представляются в двоичной записи с плавающей точкой. У плавающих чисел целой части вообще нет, есть только дробная часть (мантисса) и показатель - степень двойки, на которую надо умножить мантиссу чтобы получилось данное число. Общий формат числа с плавающей точкой: smmmmmmSppp,
где s - знак мантиссы, S - знак показателя (степень двойки тоже может быть отрицательной!) mmmmm, ppp - биты мантиссы и показателя. Конкретное число бит в этих полях зависит от формата точности (single, float, double, extended) - см доки на FPU.

Re: Помогите новичку

Posted: Mon Feb 08, 2010 9:18 pm
by SoUrcerer
Спасибо огромное, буду разбираться.
Если смогу реализовать, значит, все будет гораздо проще. Надеюсь, и с выводом тоже проблем после этого не будет.

Re: Помогите новичку

Posted: Mon Feb 08, 2010 9:43 pm
by Albom
ой как libc не хватает... atoi, atof...

Re: Помогите новичку

Posted: Mon Feb 15, 2010 5:11 am
by Leency

Code: Select all

    mov eax, 48 ;получаем высоту скина
    mov ebx, 4
    mcall

    mov eax, skin_width ;записываем её в переменную - правильно записываем?

    xor eax,eax ;рисуем окно
    mov ebx,(100 shl 16)+(WND_SIZE_X+9)
    mov ecx,(100 shl 16)+(WND_SIZE_Y+skin_width) ;ставим не 29, а skin_width. Только так.
    mov edx,0x74000000
    mov edi,title
    mcall

...

  skin_width dd 0 ;или лучше "?"?
В итоге skin_width получается какой-то запредельно большой. Где ошибка?

Re: Помогите новичку

Posted: Mon Feb 15, 2010 7:41 am
by Albom
Leency wrote: mov eax, skin_width ;записываем её в переменную - правильно записываем?
а не

Code: Select all

mov dword [skin_width], eax
?
и смущает строка
Leency wrote: mov ecx,(100 shl 16)+(WND_SIZE_Y+skin_width) ;ставим не 29, а skin_width. Только так.

Re: Помогите новичку

Posted: Tue Feb 16, 2010 11:38 pm
by Asper
Albom wrote:ой как libc не хватает... atoi, atof...
О какой libc речь?

Re: Помогите новичку

Posted: Wed Feb 17, 2010 12:14 am
by Mario

Re: Помогите новичку

Posted: Wed Feb 17, 2010 12:22 am
by Asper
Это-то понятно. Только вот реализаций этой самой библиотеки для Колибри существует несколько. Вот я и спрашиваю, о какой конкретно реализации идёт речь?

Re: Помогите новичку

Posted: Wed Feb 17, 2010 12:42 am
by Mario
Реализации этой библиотеки для Колибри как раз не существует.
Потому что даже компилятора Си для Колибри не существует.

Re: Помогите новичку

Posted: Wed Feb 17, 2010 1:01 am
by Asper
Если не портировали компилятор языка C, это ещё не значит, что не портировали libc. Не забываем о кроссплатформенной разработке.
Пара примеров:
http://new.kolibrios.org/browser/progra ... trunk/clib
http://diamond.kolibrios.org/menuetlibc.7z

Re: Помогите новичку

Posted: Wed Feb 17, 2010 1:19 am
by Mario
Ужаснах! Половое извращение в особо жесткой форме. Как и зачем портировать в Колибри библиотеку, которую в самой Колибри не собрать ничем... Мой моск повис.

Re: Помогите новичку

Posted: Wed Feb 17, 2010 1:41 am
by turbanoff
: тут читал историю создания первого компилятора pascal. Его создавали Вирт и 2 студента. писали компилятор сразу на... паскале (они создавали первый компилятор). Так вот после того как компилятор был написан "они отправили одного из студентов на 2 недели напрямую переводить код компилятора в машинный" :D
так что теоретически библиотеку можно пользовать

Re: Помогите новичку

Posted: Wed Feb 17, 2010 6:22 am
by Asper
Mario
Doom, Quake, FCEU, DosBox, ...

Re: Помогите новичку

Posted: Wed Feb 17, 2010 8:38 am
by Mario
Asper
Это игры. Эмулятор тоже не компилятор. Если уж портируется библиотека то логично, что должен быть инструмент который ее использует.

Re: Помогите новичку

Posted: Wed Feb 17, 2010 10:33 am
by Albom
Asper wrote:Albom писал(а):ой как libc не хватает... atoi, atof...О какой libc речь?
Проясню, что я имел в виду... Было бы неплохо иметь динамическую libc.obj, экспортируемые функции которой можно было бы использовать, как из программ на ЯВУ, так и ассемблере. Включать в каждую программу свои реализации функций для работы со строками (strcpy, strcmp, strcat, strncmp, atoi, atof, sprintf, ...), с математическими функциями (fsin, fcos, ...), с памятью (malloc, free, ...), с вводом выводом (putc, frpintf, fscanf...) не рационально - и не только из соображений размера, а в основном для ускорения разработки приложений и уменьшения глюков. К libc.obj при этом должен идти макрос загрузки (для ассемблера и ЯВУ, того же Си).