Page 60 of 77

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

Posted: Fri Oct 25, 2013 10:11 pm
by e-andrew
Вопрос такой: как узнать номер слота текущего потока?
Судя по справке должен быть такой код

Code: Select all

    mcall   9, win.procinfo, -1
    mov     eax, [win.procinfo + 4]
    and     eax, 0x0000FFFF
    mov     [win.sid], eax
    dph     [win.sid]
но данный код выводит совсем не номер слота, а постоянно разные числа (можно использовать как random функцию). В чем у меня ошибка?

Из спарвки:

Code: Select all

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

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

Posted: Fri Oct 25, 2013 10:19 pm
by punk_joker
eAndrew, посмотри ф18.7

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

Posted: Fri Oct 25, 2013 10:25 pm
by e-andrew
Я имею в виду не активного, а "этого"/this/self.
Хотя такой вариант тоже подойдет, так как это это окно изначально активно. Спасибо.

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

Posted: Fri Oct 25, 2013 10:28 pm
by Mario_r4
eAndrew

Code: Select all

	mcall	9,procinfo,-1
	mov	ecx,[ebx+30]	; PID
	mcall	18,21
	mov	[active_process],eax	; WINDOW SLOT
З.Ы. Использование ф.18.7 для запрашиваемого случая ненадежно.

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

Posted: Fri Oct 25, 2013 10:31 pm
by e-andrew
Mario_r4
Спасибо, то что нужно. Перечитал справку, понял ошибку.

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

Posted: Mon Oct 28, 2013 7:15 pm
by z525
Я не могу понять как эта функция

Code: Select all

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 но программа постоянно падает. Если у других работает то попытаюсь найти ошибку у себя. Или я просто не понимаю как она работает и как ей пользоваться

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

Posted: Mon Oct 28, 2013 8:04 pm
by Serge
Никак.
Должно быть while(*strDest++ == *strSource++);

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

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

Posted: Mon Oct 28, 2013 8:42 pm
by SoUrcerer
libc для tcc? do not want! С tcc можно даже newlib использовать, тащемто. Зачем извращаться?

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

Posted: Tue Oct 29, 2013 2:02 pm
by z525
Serge wrote:Никак.
Должно быть while(*strDest++ == *strSource++);
Никак второе - оператором сравнеия "==" копирование не получится. Всеравно спасибо за ответ.
SoUrcerer wrote:libc для tcc? do not want! С tcc можно даже newlib использовать, тащемто. Зачем извращаться?
Не понял ни про "do not want!" ни про "Зачем извращаться?" -я не в курсе каких-то дел и мне это к сожелнию ни очем не говорит.

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

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

Posted: Tue Oct 29, 2013 2:12 pm
by SoUrcerer
В теме про tcc я выкладывал рабочий tcc и сказал, что его можно отлично использовать с menuetlibc. На деле можно и с newlib. Зачем использовать убогую недолибу?

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

Posted: Fri Nov 01, 2013 11:07 pm
by 0CodErr
http://websvn.kolibrios.org/filedetails ... t#line-414
Назначаемые новым потокам идентификаторы монотонно растут.
Ну и мне стало интересно.
Этот код:
Spoiler:

Code: Select all

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:
1.PNG
1.PNG (40.16 KiB)
Viewed 5527 times
svn4115, VirtualBox, Qemu
out.kex (62 Bytes)
уже скомпилированный бинарник
Downloaded 248 times

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

Posted: Sat Nov 02, 2013 1:58 am
by Mario_r4
Ну, так не нужно их в один стек все пихать - у тебя часть потоков тупо умирает, к тому же стек потока у тебя вообще с нулевым адресом - куда он должен уменьшаться по твоему? В несуществующую область памяти? В общем обычный указатель стека затирает код, а указатель стека потоков сразу вызывает PageFault. А CPU сортирует по слоту, а не по PID. Слот же берется первый свободный от начала.

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

Posted: Sat Nov 02, 2013 11:32 am
by 0CodErr
Mario_r4 wrote:стек потока у тебя вообще с нулевым адресом - куда он должен уменьшаться по твоему? В несуществующую область памяти?
В моём примере стек вообще не используется.
Mario_r4 wrote:указатель стека потоков сразу вызывает PageFault
И почему тогда это не произошло сразу же?

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

Posted: Sat Nov 02, 2013 1:10 pm
by Mario_r4
0CodErr wrote:В моём примере стек вообще не используется.
O RLY?
0CodErr wrote:И почему тогда это не произошло сразу же?
Потому что так захотел Ктулху.

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

Posted: Sat Nov 02, 2013 1:27 pm
by 0CodErr
Mario_r4 wrote:0CodErr писал(а):
В моём примере стек вообще не используется.

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