Board.KolibriOS.org

Официальный форум KolibriOS
Текущее время: Сб ноя 18, 2017 8:37 pm

Часовой пояс: UTC+03:00




Начать новую тему  Ответить на тему  [ 1093 сообщения ]  На страницу Пред. 167 68 69 70 7173 След.
Автор Сообщение
 Заголовок сообщения: Re: Помогите новичку
СообщениеДобавлено: Пт авг 21, 2015 4:51 am 
Не в сети
Аватара пользователя

Зарегистрирован: Пн ноя 19, 2012 5:22 pm
Сообщения: 439
Нашёл я, кого сдвинул. В data32.inc есть кусок данных от метки gdts(строка 236) и до метки gdte. Вставляю строчку "times 200 db 0" перед этими данными - вылетает. Вставляю после них - всё работает. Причём если добавлю 170 байт перед gdts, то работает, добавлю 171 - нет. Найти - нашёл... И? Метка gdts ещё в ядре кое-где используется. Только всё равно не понимаю, как положение этих данных влияет на ОС.

_________________
Чем больше сыра, тем больше в нём дыр. Чем больше дыр, тем меньше в нём собственно сыра. Значит, чем больше сыра, тем меньше сыра!


Вернуться к началу
 Заголовок сообщения: Re: Помогите новичку
СообщениеДобавлено: Пт авг 21, 2015 6:58 pm 
Не в сети
Аватара пользователя

Зарегистрирован: Пн ноя 19, 2012 5:22 pm
Сообщения: 439
Методом проб и ошибок вывел, что если выровнять gdte по границе 256, то работает. По крайней мере пока не вылетел, посмотрим. Короче баг замазал, но причину вылета всё равно не понял.

_________________
Чем больше сыра, тем больше в нём дыр. Чем больше дыр, тем меньше в нём собственно сыра. Значит, чем больше сыра, тем меньше сыра!


Вернуться к началу
 Заголовок сообщения: Re: Помогите новичку
СообщениеДобавлено: Пн авг 31, 2015 8:23 pm 
Не в сети
Аватара пользователя

Зарегистрирован: Вт апр 28, 2015 11:01 pm
Сообщения: 11
Добрый вечер. Подскажите, пожалуйста. Функция #2 возвращает XT-сканкоды с любой клавиатуры? (AT/XT/USB)

Похоже я ошибся. Клавиши стрелок дают не экстишные коды. Ужс, я хотел, по табличке сделать, а придется программой "Сканкоды клавиатуры" все клавиши прозванивать.


Вернуться к началу
 Заголовок сообщения: Re: Помогите новичку
СообщениеДобавлено: Вт сен 01, 2015 1:00 pm 
Не в сети
Designer
Аватара пользователя

Зарегистрирован: Чт янв 25, 2007 3:33 pm
Сообщения: 4226
Добрый, функция возвращает и ASCII и SCANCODE. Посмотри http://websvn.kolibrios.org/filedetails ... yascii.asm

_________________
Через тернии к звездам


Вернуться к началу
 Заголовок сообщения: Re: Помогите новичку
СообщениеДобавлено: Вт сен 01, 2015 1:37 pm 
Не в сети
Аватара пользователя

Зарегистрирован: Вт апр 28, 2015 11:01 pm
Сообщения: 11
Да, я знаю.


Вернуться к началу
 Заголовок сообщения: Re: Помогите новичку
СообщениеДобавлено: Вт сен 01, 2015 7:57 pm 
Не в сети
Аватара пользователя

Зарегистрирован: Вт апр 28, 2015 11:01 pm
Сообщения: 11
И снова здрасьте. Мне опять нужна помощь. Что такое стек потока, и где взять указатель на стек нового потока?
Я гуглил, я смотрел примеры, но ничего не понял. Здесь, например, указатель стека потока взят 0x80000. Если я правильно понял, это указатель стека основного потока (в ассемблере не разбираюсь). Я пишу на С, и не знаю, на что указывает указатель стека основного потока. Как быть?
Альтернативный вопрос. Научите использовать функцию #51 из С-программы.


Все, короче. Посмотрел отладчиком. Указатель стека основного потока совпадает с размером используемой памяти. И если я правильно понимаю, размер используемой памяти вытаскивается функцией 9.


Вернуться к началу
 Заголовок сообщения: Re: Помогите новичку
СообщениеДобавлено: Чт сен 03, 2015 2:26 am 
Не в сети
Аватара пользователя

Зарегистрирован: Пн ноя 19, 2012 5:22 pm
Сообщения: 439
Вообще-то стек основного потока ровно там, где выделишь память(ну или зарезервирована) и укажешь в заголовке. Очень часто место резервируют в самом конце программы и указатель, разумеется, указывает на конец используемой памяти. Если нужен новый поток, то или зарезервируй сразу(массив какой сделай, у указатель дай ИмяМассива+РазмерМассива) или выдели функцией #68,12. Ну и указатель также вычисляется.

_________________
Чем больше сыра, тем больше в нём дыр. Чем больше дыр, тем меньше в нём собственно сыра. Значит, чем больше сыра, тем меньше сыра!


Вернуться к началу
 Заголовок сообщения: Re: Помогите новичку
СообщениеДобавлено: Чт сен 03, 2015 3:50 pm 
Не в сети
Аватара пользователя

Зарегистрирован: Вт апр 28, 2015 11:01 pm
Сообщения: 11
GerdtR, спасибо. Что-то я промучался, да так и не получилось. Точку входа сделал на void (cfunction(void)) функцию. После создания потока выполняется код этой функции и программа заканчивается.
Кодить под KolibriOS, однако сложно, ибо много чего не понятно, и получается тыканье пальцем в небо.


Вернуться к началу
 Заголовок сообщения: Re: Помогите новичку
СообщениеДобавлено: Чт сен 03, 2015 8:00 pm 
Не в сети
Mentor/Kernel Developer
Аватара пользователя

Зарегистрирован: Чт мар 26, 2015 5:16 pm
Сообщения: 1194
Скажу на всякий случай, что стек растёт из конца в начало. Если выделять под него память, то указывать нужно конец массива. В любом случае, перед указателем должно быть свободное место.


Вернуться к началу
 Заголовок сообщения: Re: Помогите новичку
СообщениеДобавлено: Пт сен 04, 2015 12:13 am 
Не в сети
Аватара пользователя

Зарегистрирован: Вт апр 28, 2015 11:01 pm
Сообщения: 11
Таки не осилил, как правильно сделать.
Код:
void kolibrios_DialogThread(void)
{
    //Helloworld-like code
   __asm__ __volatile__(
    "int $0x40"
    :
    :"a"(63),"b"(1),"c"((uint32_t)('a'))
    :"memory");

    __asm__ __volatile__(
    "int $0x40"
    :
    :"a"(-1)
    :"memory");
}

void DialogsShowSimpleMessageBox(int type, char *title, char *message)
{
    unsigned char *dialogStack;
    dialogStack = malloc(2048);

    __asm__ __volatile__(
    "int $0x40"
    :
    :"a"(51),"b"(1),"c"((uint32_t)kolibrios_DialogThread),"d"((uint32_t)(dialogStack + 2047))
    :"memory");
}


Хотел, чтобы при вызове функции DialogsShowSimpleMessageBox, создавался поток для еще одного окошка. Но после вызова функции, сразу 2 раза вызывается функция kolibrios_DialogThread, пишет "aa" на доске отладки, и на этом программа завершается, не знаю, почему.

А есть программы на С, где можно посмотреть, как это все правильно делается?


Вернуться к началу
 Заголовок сообщения: Re: Помогите новичку
СообщениеДобавлено: Пт сен 04, 2015 11:17 am 
Не в сети

Зарегистрирован: Чт янв 26, 2006 8:47 pm
Сообщения: 284
Если используете menuetlibc то там есть функция create_thread


У меня другое API, но выглядит примерно следующим образом
Код:
int kos_CreateThread(void *proc, void *data)
{
   uint8_t *stack = malloc(THREAD_STACK_SIZE);
   if (!stack)
      return -1;
   uint32_t *new_esp = (uint32_t *)&stack[THREAD_STACK_SIZE-sizeof(size_t)*2];
   new_esp[0] = (uint32_t)kos_ExitApp;
   new_esp[1] = (uint32_t)data;
   return syscall4(51, 1, (unsigned)proc, (unsigned)new_esp);
}

В нем аллоцируется память под стек, в последний dword пишется аргумент функции, в предпоследний пишется ret-адрес на функцию корректно завершающую поток на случай если программист не вызовет ее явно


Вернуться к началу
 Заголовок сообщения: Re: Помогите новичку
СообщениеДобавлено: Вт сен 08, 2015 9:56 pm 
Не в сети
Аватара пользователя

Зарегистрирован: Пн ноя 19, 2012 5:22 pm
Сообщения: 439
Всё таки не понимаю, почему у меня вылетает ядро: вылетает на 302 строке в kernel.asm: jmp pword os_code:high_code. В боксе смотрю код по high_code - всё нормально. Но шаг - и вылет. Данные в gdts никто не затирает. Не понимаю.

_________________
Чем больше сыра, тем больше в нём дыр. Чем больше дыр, тем меньше в нём собственно сыра. Значит, чем больше сыра, тем меньше сыра!


Вернуться к началу
 Заголовок сообщения: Re: Помогите новичку
СообщениеДобавлено: Вс окт 04, 2015 2:52 am 
Не в сети
Аватара пользователя

Зарегистрирован: Сб сен 27, 2014 2:59 pm
Сообщения: 102
Судя по описанию с.ф. 4, можно делать вывод строки, в область пользователя.
Спойлер: Показать
======================================================================
============== Функция 4 - вывести строку текста в окно. =============
======================================================================
Параметры:
* eax = 4 - номер функции
* ebx = [координата по оси x]*65536 + [координата по оси y]
* ecx = 0xXYRRGGBB, где
* RR, GG, BB задают цвет текста
* X=ABFF (биты):
* A=1 - выводить ASCIIZ-строку
* B=1 - закрашивать фон цветом edi
* FF задает шрифт и кодировку:
0 = 6x9 cp866
2 = 8x16 UTF-16LE
3 = 8x16 UTF-8
* Y=CDDD (биты):
* C=1 перенаправить вывод в область пользователя, задано в edi
* DDD = (множитель размера)-1, то-есть 0 = x1, 7 = x8
* edx = указатель на начало строки
* esi = для A=0 длина строки, для A=1 игнорируется
* edi = если B=1, цвет для закраски фона,
если C=1, указатель на область пользователя

Возвращаемое значение:
* функция не возвращает значения
Замечания:
* C=1, цвет = 32 бита, область пользователя выглядит так:
Xsize = dword
Ysize = dword
остаток области = Xsize*Ysize*4
* Нельзя одновременно использовать B=1 и C=1,
поскольку в обоих случаях используется регистр edi.

======================================================================
Область пользователя, насколько я понял - буфер, в котором будет сформирована строка. Так вот, пробовал сделать вывод одного символа, таким образом...
Спойлер: Показать
Код:
char_coord_x = 10
char_coord_y = 10
char_width  = 6
char_height = 9

        ; draw one char in buffer.
        xor     eax, eax
        mov      al, 4
        mov     ebx, char_coord_x
        shl     ebx, 16
        add     ebx, char_coord_y
        xor     ecx, ecx
        mov      cl, 00001000b    ; XY ; X = font type 6x9 cp866 ; Y = output in buffer.
        ror     ecx, 8
        add     ecx, 0x00ff0000   ; char color is red.
        mov     edx, string       ; edx = char start address (H character).
        mov     esi, 1            ; use one char.
        mov     edi, char_addr    ; edi = buffer address for char.
        int     0x40

        ; draw character image.
        xor     eax, eax
        mov      al, 65
        mov     ebx, char_addr    ; ebx = buffer address with char.
        mov     ecx, char_width
        shl     ecx, 16
        add     ecx, char_height
        mov     edx, char_coord_x
        shl     edx, 16
        add     edx, char_coord_y
        mov     esi, 32           ; 32 bits per pixel.
        mov     edi, 0
        mov     ebp, 0
        int     0x40
но тщетно :cry: , символ не выводится, либо вообще всё виснет. Не могу понять, в чём дело. Может быть я, что-то делаю не так? :? Как сделать вывод одного символа, через буфер? Прошу помощи!

Полный тестовый файл прикрепил.


Вложения:
CharTest.7z [2.09 КБ]
26 скачиваний
Вернуться к началу
 Заголовок сообщения: Re: Помогите новичку
СообщениеДобавлено: Вс окт 04, 2015 3:25 am 
Не в сети
Аватара пользователя

Зарегистрирован: Чт ноя 27, 2014 1:24 am
Сообщения: 72
Yason, а ты обратил внимание на вот эти строки?
Цитата:
область пользователя выглядит так:
Xsize = dword
Ysize = dword
остаток области = Xsize*Ysize*4

То есть, для функции 4 в первых 8 байтах буфера должны быть указаны ширина и высота, а потом уже идут данные о пикселях.

Но в код я особо не вникал, возможно, что проблема в чем-то другом :)


Вернуться к началу
 Заголовок сообщения: Re: Помогите новичку
СообщениеДобавлено: Вс окт 04, 2015 3:44 am 
Не в сети
Аватара пользователя

Зарегистрирован: Сб сен 27, 2014 2:59 pm
Сообщения: 102
Буфер выделял вот так...
Код:
char_addr:  db  char_width*char_height*4  dup (0x33)


Вернуться к началу
Показать сообщения за:  Поле сортировки  
Начать новую тему  Ответить на тему  [ 1093 сообщения ]  На страницу Пред. 167 68 69 70 7173 След.

Часовой пояс: UTC+03:00


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Создано на основе phpBB® Forum Software © phpBB Limited
Русская поддержка phpBB