Page 50 of 77

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

Posted: Sat Apr 06, 2013 8:57 am
by Artyom
Leency wrote:Пытаюсь разобраться в функции 4, пишущей прямиком в память. Выходит кривая чёрная полоса.

Code: Select all

	w = strlen(#text)*6;
	mem = malloc(w*9*4);
	for (i=0; i<w*9*4; i++) ESBYTE[mem+i]=0xFF; //делаем фон белым

	$mov eax, 4
	$mov ebx,0 << 16+0
	$mov ecx,0x88000000
	$mov edi, mem
	$mov edx, #text
	$int 0x40

	PutPaletteImage(mem,w,9,100,100,32,0); //рисуем, 32 - глубина цвета
Ссылка на Fn04 http://wiki.kolibrios.org/wiki/SysFn04/ru

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

Posted: Sat Apr 06, 2013 12:09 pm
by SoUrcerer
А кто сказал, что 32 бита в результате? Я подозреваю, что там 24 бита и формат BGR - как в 7й функции.

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

Posted: Sat Apr 06, 2013 12:33 pm
by Mario_r4
SoUrcerer wrote:А кто сказал, что 32 бита в результате? Я подозреваю, что там 24 бита и формат BGR - как в 7й функции.
Потому что я в документации написал, что там 32 бита и там на самом деле 32 бита.

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

Posted: Sat Apr 06, 2013 12:36 pm
by Mario_r4
Leency wrote:Пытаюсь разобраться в функции 4, пишущей прямиком в память. Выходит кривая чёрная полоса.

Code: Select all

   w = strlen(#text)*6;
   mem = malloc(w*9*4);
Документацию нужно читать, полностью:
Spoiler:
* C=1, глубина точки = 32 бита, область пользователя выглядит так:
dword Xsize
dword Ysize

остаток области = Xsize * Y size * 4

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

Posted: Sat Apr 06, 2013 12:46 pm
by 0CodErr
Наверное, должно быть как-то так:

Code: Select all

mem = malloc(w*9*4 + 4 + 4);
; 
mov eax, mem
mov edx, [w]
mov [eax], edx
mov [eax + 4], dword 9
;

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

Posted: Sat Apr 06, 2013 4:57 pm
by Leency
Mario_r4 wrote:Документацию нужно читать, полностью:
* C=1, глубина точки = 32 бита, область пользователя выглядит так:
dword Xsize
dword Ysize

остаток области = Xsize * Y size * 4
Я уже написал обёртки ко многим библиотекам и практически ко всем функция Колибри (кроме работы с железом), но это описание поставило меня в тупик. Я прочитал полностью, несколько раз и смотрел код icon и для меня осталось загадкой что НАПИСАНО В ЭТОМ АБЗАЦЕ. Как вычислить Xsize и почему в malloc нужно ещё +4 или +8 - вообще не понимаю.

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

Posted: Sat Apr 06, 2013 4:59 pm
by Mario_r4
Поскольку код ядра не знает размеры области (по X и Y) с которой работает, то ему нужно их как-то передать. Все регистры заняты -остается только в самой области передать.

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

Posted: Sat Apr 06, 2013 5:06 pm
by Leency
Тебе не кажется, что в функции 4 скрещено фактически две независимые функции, откуда нехватка регистров и как результат докуметация. Пока только одна программа использует рисование в память через 4 функцию можно было бы её разделить.

А пока что очень не помешал бы пример с "Hello World!".

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

Posted: Sat Apr 06, 2013 5:13 pm
by Mario_r4
Это ты еще спецификации на программирование железок не читал. Добро пожаловать в наш реальный дерьмовый мир!

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

Posted: Sat Apr 06, 2013 5:15 pm
by Leency
Ответ "потому что жизнь говно" - не ответ :)

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

Posted: Sat Apr 06, 2013 5:30 pm
by Mario_r4
Leency wrote:Пока только одна программа использует рисование в память через 4 функцию можно было бы её разделить.
"Бритва" Уильям Оккама - сатирическое произведение в жанре нео-реализма.
Leency wrote:А пока что очень не помешал бы пример с "Hello World!".
Мне некогда и неохота, и я считаю что документации достаточно. А здесь уже в ветке разжевал как никогда подробно. Если кто имеет желание - пусть напишет пример, можно даже на C--, но не я.

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

Posted: Sun Apr 07, 2013 7:17 am
by Leency
Mario
Может быть, потом я создам тему "Как выжить в жестоком холодном мире" и ты дашь мне там парочку советов :D , но эта тема называется "Помогите новичку [в программировании]" и мне нужен был пример рабочего когда или расшифровка описания функции, а не сатирические книги или жизненная философия.

0CodErr
Написал в теме код и прислал мне в личку человеческое описание за что ему огромное спасибо:
Как вычислить Xsize: это ширина области, она у тебя w
Почему в malloc нужно ещё +8: область пользователя представляет собой 2 подряд dword-a(8 байт) и далее саму область для рисования, размером Xsize * Y size * 4
В эти 2 dword-a нужно записать значения Xsize и Y size, то есть w и 9.

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

Posted: Sun Apr 07, 2013 10:56 am
by Mario_r4
Leency wrote:Mario
или расшифровка описания функции
... и она была выдана.

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

Posted: Mon Apr 08, 2013 3:27 am
by Leency
Начал читать книгу, которую мне посоветовл Mario по ассемблеру, not bad, но чувствуется, что книга расчитана на людей в теме (учащихся на факультетах IT). Я только в начале, но у меня уже over 9000 вопросов и, пожалуста, не нужно отвечать: "Ты до этого ещё дойдёшь в процессе чтения" или подобное. Только конкретика и попроще.
1. я обращал, что обработка строк (копирование например) во многих реализациях идёт через регистры ESI и EDI, почему? Они в данной задаче стравляются быстрее, чем через EAX?
2. есть у нас регистр EAX. Максимальное число, которое в него можно записать - это 2^32 степени?
3. Окей, пишем в EAX, допустим, 32000. Cколько теперь будет в AH и AL?
4. Обработка изображений в libimg идёт через обычные регистры или через MMX? Почему?

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

Posted: Mon Apr 08, 2013 6:51 am
by Insolor
Утро, на работе делать нечего, отвечу то что знаю.
1. Потому что операции обработки строк (movs и иже с ними) используют именно эти регистры как указатель источника (source index, esi) и получателя (destination index, edi).
2. Максимальное беззнаковое число 2^32-1. Итого вместе с нулем 2^32 чисел.
3. Переводим в шестнадцатеричную систему: 7D00h, отсюда в AH - 7Dh, в AL - 00h