Page 51 of 77

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

Posted: Mon Apr 08, 2013 8:03 am
by dunkaist
Leency wrote:1. я обращал, что обработка строк (копирование например) во многих реализациях идёт через регистры ESI и EDI, почему? Они в данной задаче стравляются быстрее, чем через EAX?
Дело в том, что цепочечные команды (cmps, movs, ...) ожидают указатели на строки именно в этих регистрах. Т.е. они не принимают регистр в качестве аргумента, как тот же add, а хотят именно esi/edi.
Leency wrote:2. есть у нас регистр EAX. Максимальное число, которое в него можно записать - это 2^32 степени?
У максимального числа все биты установлены в единицы. Для 32-битного случая это 0xffffffff = 2^32 - 1. Вообще, 2^k выглядит как единица с k нулями, а 2^k - 1 как k единиц.
Leency wrote:3. Окей, пишем в EAX, допустим, 32000. Cколько теперь будет в AH и AL?
Как уже ответили, mov eax, 0x7d00 даёт ah=0x7d, al=0. Но это при записи непосредственного значения. Будь внимателен при чтении из памяти: если по адресу my_var лежит 0xaa, 0xbb, 0xcc, 0xdd, то после чтения mov eax, [my_var] в eax будет 0xddccbbaa. В этом и заключается little endian.
Leency wrote:4. Обработка изображений в libimg идёт через обычные регистры или через MMX? Почему?
В основном через обычные. В декодере jpeg есть код fpu, потому что нужно работать с вещественными числами. В декодере xcf можно выбрать mmx или sse. Я это сделал потому что:
1. В mmx есть удобные команды, например, сложения с насыщением. В случае работы с регистрами общего назначения пришлось бы заменять каждую из таких команд целым блоком (и повторять такие блоки по четыре раза: для каждой из ARGB компонент). В результате код короче, понятнее и быстрее.
2. Команды mmx позволяют обрабатывать за раз все четыре канала ARGB изображения, т.е. целый пиксель. Тут ещё влиет 64-битность mmx регистров -- больше влазит.
3. У нас всё равно поддержка оборудования с i586, а там даже у vortex-x86 есть mmx, никого не обделяю.

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

Posted: Mon Apr 08, 2013 2:36 pm
by Leency
dunkaist, Insolor
Спасибо! Очень доступно объяснили!

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

Posted: Tue Apr 09, 2013 3:37 pm
by Leency
Продолжаю мучить 4 функцию. Переписал на православный асм и всё равно падает:

Code: Select all

	mcall 68,11
	mcall 68,12,13*6*9*4+8
	mov [eax], dword 13*6
	mov [eax + 4], dword 9
	mov edi, eax

	mov eax, 4
	mov ebx, 0
	mov ecx, 0x88fffFFF
	mov edx, caption
	mov esi, 13
	int 0x40
	add edi, 8
	mov ebx, edi

	mcall 65, , <13*6, 9>, <0, 0>, 32

caption: db 'Hello, world!', 0 

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

Posted: Tue Apr 09, 2013 3:44 pm
by Mario_r4

Code: Select all

mcall 65, draw_area
Выводит область кода начиная с draw_area, неудивительно что он падает с page fault.

Code: Select all

mcall 65, [draw_area]
должно помочь.

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

Posted: Tue Apr 09, 2013 3:52 pm
by Mario_r4
http://wiki.kolibrios.org/wiki/SysFn65/ru
ebp = байтовое смещение между концом предыдущей строки изображения и началом следующей строки

З.Ы. Первый мой ответ уже не существенен, ибо в процессе его написания данные в целевом посте были изменены автором.

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

Posted: Tue Apr 09, 2013 6:19 pm
by Mario_r4
Я обнаружил какие-то странные симптомы при повторном выводе ф.4 в область памяти, причем завязка на события какая-то странная. В ICON область выделяется, в нее копируется иконка и выводится текст ф.4, а затем она выводится ф.25 поверх фона (т.е. ф.0 не вызывается) и далее область удаляется.

В приведенном примере, если создать область и вызвать ф.4 до вызова ф.0 (хоть 100500 вызовов ф.4), то отрабатывает нормально, но как только пытаемся вызвать ф.4 с буфером после ф.0, то получаем page fault в коде ядра. Буду разбираться в общем.

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

Posted: Tue Apr 09, 2013 6:36 pm
by Leency
Я УЖЕ 3 ДНЯ БЬЮСЬ НАД ЭТИМ!!!! FFFUUUUUUUUUUUUUUU!!!!!!11 Задолбал уже наверно 0CodErr и принялся за Диму!

P.S. Также вывод строки (неправильный, у меня это пунктирная линия) зависит от положения окна, я это недавно заметил и очень удивился.

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

Posted: Tue Apr 09, 2013 6:50 pm
by Mario_r4
Leency wrote:Я УЖЕ 3 ДНЯ БЬЮСЬ НАД ЭТИМ!!!! FFFUUUUUUUUUUUUUUU!!!!!!11 Задолбал уже наверно 0CodErr и принялся за Диму!
Как я уже говорил - добро пожаловать в наш реальный дерьмовый мир. :lol:
На самом деле я не мог спрогнозировать такое поведение, к сожалению. Можешь утешиться тем, что я тоже почти три часа ломал голову, пока выявил зависимость.
Leency wrote:P.S. Также вывод строки (неправильный, у меня это пунктирная линия) зависит от положения окна, я это недавно заметил и очень удивился.
Подробности в студию, желательно со скриншотами, чтобы доходчиво.

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

Posted: Tue Apr 09, 2013 7:04 pm
by Leency
Проблема у меня при указании параметра Х. Если он 0 или 2 рисует такое. При 10 чёрный фон ("надписи" не видно). При 36, как и должно быть - падает. QEMU, последнее ядро.

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

Posted: Tue Apr 09, 2013 7:49 pm
by Mario_r4
Код сразу выкладывай. Есть подозрение на код.

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

Posted: Tue Apr 09, 2013 7:53 pm
by Leency
Всё вместе, при желании можно скомилить.

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

Posted: Tue Apr 09, 2013 7:59 pm
by Mario_r4
Кирилл, ты либо лечи свою машину от вирусов, либо не выкладывай EXE файлы в архивах Колибри. Не первый раз уже - некрасиво с твоей стороны. Хорошо у меня Avira просекла, а может у кого более дырявый антивирус или вообще нет. :?
З.Ы. Убери этот архив из поста от греха подальше.

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

Posted: Tue Apr 09, 2013 8:06 pm
by Leency
Ты уверен, что тревога не ложная, как в случае с klbrinwin?

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

Posted: Tue Apr 09, 2013 8:09 pm
by Mario_r4
Leency wrote:Ты уверен, что тревога не ложная, как в случае с klbrinwin?
У меня в системе лежит kpack.exe который прекрасно запускается и не вызывает никаких нареканий. Причем это именно тот kpack.exe который я скачивал, я для Виндовс его не допиливал.

Я не понимаю как ты получил свои скриншоты - у меня твоя программа сразу завершается едва отрисовав окно, даже когда запущена из твоего менеджера файлов.

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

Posted: Tue Apr 09, 2013 8:13 pm
by Leency
28 строка. Давай дальше общаться в чате, дабы не захламлять тему для этого не предназначенную.