Page 2 of 2

Re: Код для преобразования данных.

Posted: Sun Oct 28, 2012 10:15 am
by Leency
Serge wrote:Потому что shell и eolite забывают поменять рабочий каталог ?
Может быть, как это сделать? Просто в коде
char os_name[8] = {'M','E','N','U','E','T','0','1'};
dword os_version = 0x00000001;
dword start_addr = #main;
dword final_addr = #stop+32;
dword alloc_mem = #0x00100000;
dword x86esp_reg = #0x00100000;
dword I_Param = #param;
dword I_Path = #program_path;
char param[4096];
char program_path[4096];
program_path = param?

Re: Код для преобразования данных.

Posted: Sun Oct 28, 2012 10:47 am
by johnfound
Leency wrote:Может быть, как это сделать?
Надо вызывать ф.30.1 когда меняется текущая директория.

Re: Код для преобразования данных.

Posted: Sun Oct 28, 2012 11:54 am
by Serge
Leency
Текущий рабочий каталог определяется через 30.1 и устанавливается через 30.2
Это не то же, что путь к исполняемому файлу.

Re: Код для преобразования данных.

Posted: Sun Oct 28, 2012 1:54 pm
by Leency
В первый раз слышу)) А на что этот каталог влияет?

Re: Код для преобразования данных.

Posted: Sun Oct 28, 2012 2:13 pm
by Mario
Leency wrote:В первый раз слышу)) А на что этот каталог влияет?
В ф.70 вызов файла без пути "/"? например просто filename.kex, приводит по умолчанию к обращению /rd/1/filename.kex - если же установить другой путь ф. 30, например /pathname, то при обращении просто filename.kex будет происходить обращение /pathname/filename.kex на уровне драйвера файловой системы.

Другими словами часть головной боли прикладного программиста перекладывается на драйвер файловой системы, хотя с точки зрения производительности дисковой операции ничего не меняется. Это просто удобство, типа макроса mcall вместо int 0x40, для сравнения.

Re: Код для преобразования данных.

Posted: Sun Oct 28, 2012 3:32 pm
by Leency
Ясно, спасибо.

Re: Код для преобразования данных.

Posted: Tue Oct 30, 2012 3:39 pm
by CleverMouse
johnfound wrote:Кстати, сделал в FreshLib, чтобы программа устанавливала текущую директорию там где находится исполнимый файл.
И возникает вопрос - а не лучше ли это сделать в ядре?
Версии под Windows и Linux делают так же?

Текущая директория предназначена не для программы, а для пользователя. Чтобы пользователь мог запустить команду fasm example.asm bin/example вместо fasm /absolute/path/to/example.asm /absolute/path/to/bin/example. Упражнение на понимание: что будет с первой командой, если fasm первым делом будет менять текущую директорию на папку с бинарником, а потом открывать и создавать файлы?

Re: Код для преобразования данных.

Posted: Tue Oct 30, 2012 4:22 pm
by johnfound
CleverMouse, теперь ясно, что надо менять файловые менажеры и shell, чтобы они правильно устанавливали текущую директорию. Конечно, я этот код не буду включать в библиотеку.

Таймеры...

Posted: Tue Oct 30, 2012 9:29 pm
by johnfound
Я только что сделал очень плохую имитацию таймеров:

Code: Select all

proc __TimerThreadProc
begin
.main_timer_loop:
        cmp     [__timer_stop], 0
        jne     .end_thread

        mov     eax, 5
        mov     ebx, 1
        int     $40

; do something on every 10ms :D

        jmp     .main_timer_loop

.end_thread:
        mov     eax, -1
        int     $40
endp
Можно ли сделать лучше и как?
Мне необходимо чтобы вызывалась некоторая процедура каждые 10мс, независимо от время выполнения этой процедуре. (конечно время должно быть меньше 10мс).

Re: Код для преобразования данных.

Posted: Tue Oct 30, 2012 10:24 pm
by art_zh
лучше использовать ф 68.1

Re: Код для преобразования данных.

Posted: Tue Oct 30, 2012 10:31 pm
by johnfound
Хм, а как собственно сделать так что поток получит управление ровно 10мс после этого? Или проверять ф.26.9?

Re: Код для преобразования данных.

Posted: Sat Nov 03, 2012 1:55 pm
by johnfound
Наконец сделал и получилось как всегда неплохо. :) Использую ф.26.9 для измерение времени и ф.68.1 чтобы разгружать процессор. Процедура таймера будет вызываться всегда правильное количество раз, даже и если поток не сумел вовремя исполнится:
Spoiler:

Code: Select all

proc __TimerProc
begin

        mov     eax, sys_getsetup
        mov     ebx, 9
        int     $40
        mov     edi, eax

.main_timer_loop:
        cmp     [__timer_stop], 0
        jne     .end_thread

        mov     eax, sys_getsetup
        mov     ebx, 9
        int     $40

        cmp     edi, eax
        jne     .process_timers

        mov     eax, sys_f68
        mov     ebx, 1
        int     $40
        jmp     .main_timer_loop

.process_timers:
        mov     ebx, eax
        sub     ebx, edi
        imul    ebx, __sys_time_slice
        mov     edi, eax

        lea     eax, [__ptrFirstTimer]

.loop:
        mov     eax, [eax+TTimer.next]
.loop2:
        test    eax, eax
        jz      .main_timer_loop

        test    [eax+TTimer.flags], tmfRunning
        jz      .loop

        mov     ecx, [eax+TTimer.value]
        add     ecx, ebx
        mov     [eax+TTimer.value], ecx

        cmp     ecx, [eax+TTimer.interval]
        jl      .loop

.exploop:
        inc     [eax+TTimer.Expired]

        mov     ecx, [eax+TTimer.interval]
        sub     [eax+TTimer.value], ecx
        cmp     [eax+TTimer.value], ecx
        jge     .exploop

        cmp     [eax+TTimer.Callback], 0
        je      .end_event

        mov     ecx, [eax+TTimer.flags]
        and     ecx, $0f
        cmp     ecx, tmfDoNothing
        je      .end_event

; call the callback procedure.
.execloop:
        pushad
        stdcall [eax+TTimer.Callback], eax
        popad

        sub     [eax+TTimer.Expired], 1
        jg      .execloop

.end_event:
        test    [eax+TTimer.flags], tmfSyncDestroy
        jz      .loop

        push    eax
        mov     eax, [eax+TTimer.next]  ; after the destruction, this pointer will be lost.
        stdcall TimerDestroy ; pointer from the stack.
        jmp     .loop2

.end_thread:
        mov     [__timer_stop], 0
        mov     eax, sys_end
        int     $40
endp

Re: Код для преобразования данных.

Posted: Wed Nov 07, 2012 3:02 pm
by Leency
Начал юзать 30.1, потом переделаю свои проги под неё.