Board.KolibriOS.org
http://board.kolibrios.org/

Помогите новичку
http://board.kolibrios.org/viewtopic.php?f=2&t=684
Page 60 of 76

Author:  e-andrew [ Fri Oct 25, 2013 10:11 pm ]
Post subject:  Re: Помогите новичку

Вопрос такой: как узнать номер слота текущего потока?
Судя по справке должен быть такой код
Code:
    mcall   9, win.procinfo, -1
    mov     eax, [win.procinfo + 4]
    and     eax, 0x0000FFFF
    mov     [win.sid], eax
    dph     [win.sid]

но данный код выводит совсем не номер слота, а постоянно разные числа (можно использовать как random функцию). В чем у меня ошибка?

Из спарвки:
Code:
    * +4: word: позиция окна потока в оконном стэке
    * +6: word: (не имеет отношения к запрошенному потоку)
      номер слота потока, окно которого находится в оконном стэке
      в позиции ecx

Author:  punk_joker [ Fri Oct 25, 2013 10:19 pm ]
Post subject:  Re: Помогите новичку

eAndrew, посмотри ф18.7

Author:  e-andrew [ Fri Oct 25, 2013 10:25 pm ]
Post subject:  Re: Помогите новичку

Я имею в виду не активного, а "этого"/this/self.
Хотя такой вариант тоже подойдет, так как это это окно изначально активно. Спасибо.

Author:  Mario_r4 [ Fri Oct 25, 2013 10:28 pm ]
Post subject:  Re: Помогите новичку

eAndrew
Code:
   mcall   9,procinfo,-1
   mov   ecx,[ebx+30]   ; PID
   mcall   18,21
   mov   [active_process],eax   ; WINDOW SLOT

З.Ы. Использование ф.18.7 для запрашиваемого случая ненадежно.

Author:  e-andrew [ Fri Oct 25, 2013 10:31 pm ]
Post subject:  Re: Помогите новичку

Mario_r4
Спасибо, то что нужно. Перечитал справку, понял ошибку.

Author:  z525 [ Mon Oct 28, 2013 7:15 pm ]
Post subject:  Re: Помогите новичку

Я не могу понять как эта функция

Code:
char* strcpy(char* strDest,char* strSource)
{
        char* res;
        res=strDest;
        while(*strDest++ == strSource++) ;
        return res;     
}

которая лежит здесь http://websvn.kolibrios.org/filedetails ... 2Fstrcpy.c
может работать (в смысле правильно копировать) ?

Пробовал её использовать на Dev-C++ 4.9.9.2 но программа постоянно падает. Если у других работает то попытаюсь найти ошибку у себя. Или я просто не понимаю как она работает и как ей пользоваться

Author:  Serge [ Mon Oct 28, 2013 8:04 pm ]
Post subject:  Re: Помогите новичку

Никак.
Должно быть while(*strDest++ == *strSource++);

У Страуструпа шикарный разбор этой строчки.

Author:  SoUrcerer [ Mon Oct 28, 2013 8:42 pm ]
Post subject:  Re: Помогите новичку

libc для tcc? do not want! С tcc можно даже newlib использовать, тащемто. Зачем извращаться?

Author:  z525 [ Tue Oct 29, 2013 2:02 pm ]
Post subject:  Re: Помогите новичку

Serge wrote:
Никак.
Должно быть while(*strDest++ == *strSource++);

Никак второе - оператором сравнеия "==" копирование не получится. Всеравно спасибо за ответ.

SoUrcerer wrote:
libc для tcc? do not want! С tcc можно даже newlib использовать, тащемто. Зачем извращаться?

Не понял ни про "do not want!" ни про "Зачем извращаться?" -я не в курсе каких-то дел и мне это к сожелнию ни очем не говорит.

p.s.
Две ошибки выявилось и вроде как никого не интересует (в смысле так и осталось).

Author:  SoUrcerer [ Tue Oct 29, 2013 2:12 pm ]
Post subject:  Re: Помогите новичку

В теме про tcc я выкладывал рабочий tcc и сказал, что его можно отлично использовать с menuetlibc. На деле можно и с newlib. Зачем использовать убогую недолибу?

Author:  0CodErr [ Fri Nov 01, 2013 11:07 pm ]
Post subject:  Re: Помогите новичку

http://websvn.kolibrios.org/filedetails ... t#line-414
Quote:
Назначаемые новым потокам идентификаторы монотонно растут.
Ну и мне стало интересно.
Этот код:
Spoiler: Show
Code:
ORG 0
BITS 32
; --------------------------- ;
MENUET01       db 'MENUET01'
version        dd 1
program.start  dd START
program.end    dd END
program.memory dd END
program.stack  dd END
program.params dd 0
program.path   dd 0
; --------------------------- ;
START:
; thread.create
        mov    eax, 51
        mov    ebx, 1
        mov    ecx, THREAD
        xor    edx, edx
        int    64
        jmp    START
THREAD:
        or     eax, -1
        int    64
; --------------------------- ;
END:
И в некоторый момент
Spoiler: Show
Attachment:
1.PNG
1.PNG [ 40.16 KiB | Viewed 2414 times ]

svn4115, VirtualBox, Qemu
Attachment:
File comment: уже скомпилированный бинарник
out.kex [62 Bytes]
Downloaded 87 times

Author:  Mario_r4 [ Sat Nov 02, 2013 1:58 am ]
Post subject:  Re: Помогите новичку

Ну, так не нужно их в один стек все пихать - у тебя часть потоков тупо умирает, к тому же стек потока у тебя вообще с нулевым адресом - куда он должен уменьшаться по твоему? В несуществующую область памяти? В общем обычный указатель стека затирает код, а указатель стека потоков сразу вызывает PageFault. А CPU сортирует по слоту, а не по PID. Слот же берется первый свободный от начала.

Author:  0CodErr [ Sat Nov 02, 2013 11:32 am ]
Post subject:  Re: Помогите новичку

Mario_r4 wrote:
стек потока у тебя вообще с нулевым адресом - куда он должен уменьшаться по твоему? В несуществующую область памяти?
В моём примере стек вообще не используется.
Mario_r4 wrote:
указатель стека потоков сразу вызывает PageFault
И почему тогда это не произошло сразу же?

Author:  Mario_r4 [ Sat Nov 02, 2013 1:10 pm ]
Post subject:  Re: Помогите новичку

0CodErr wrote:
В моём примере стек вообще не используется.

O RLY?
0CodErr wrote:
И почему тогда это не произошло сразу же?

Потому что так захотел Ктулху.

Author:  0CodErr [ Sat Nov 02, 2013 1:27 pm ]
Post subject:  Re: Помогите новичку

Mario_r4 wrote:
0CodErr писал(а):
В моём примере стек вообще не используется.

O RLY?
Покажи тогда, в каком месте это происходит.

Page 60 of 76 All times are UTC+03:00
Powered by phpBB® Forum Software © phpBB Limited
https://www.phpbb.com/