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, потом переделаю свои проги под неё.