Page 4 of 10

Posted: Thu Jul 11, 2013 8:11 pm
by punk_joker
Пишу просто графический интерфейс для редактирования конфигурационного файла программы.

Re: ряд вопросов по FASM

Posted: Thu Jul 11, 2013 8:36 pm
by Asper
Ну общий смысл, думаю понятен.
1. Считал данные из файла и сохранил их в удобном виде в памяти.
2. Далее можно брать эти данные по известному адресу в памяти, и либо копировать сами данные, либо указатель на них в соответствующие элементы интерфейса.
3. После редактирования данных, все сохраняем в памяти.
4. После того как пользователь пожелал сохранить данные, пишем их обратно в файл.
Можешь посмотреть ещё MyKey, он тоже позволяет редактировать данные своего ini-файла.

Posted: Thu Jul 11, 2013 9:58 pm
by punk_joker
Немог бы показать на примере обращение к данным через jobs?

Re: ряд вопросов по FASM

Posted: Fri Jul 12, 2013 5:36 pm
by Asper
Так?

FASM
Spoiler:

Code: Select all

PATH_MAX_CHARS equ 255

struc JOB
{
  .done      db 0
  .timeH     db 0
  .timeM     db 0
  .app_path  db PATH_MAX_CHARS dup(0)
  .app_param db PATH_MAX_CHARS dup(0)
  .sizeof:
}

virtual at 0
  JOB JOB
end virtual

StartJob:
	mcall	3 ; get time
	xor	ebx, ebx
	mov	bl, al
	push	eax
	stdcall BCDToInt, ebx
	mov	dh, al
	pop	eax
	mov	bl, ah
	stdcall BCDToInt, ebx
	mov	dl, al

	movzx	ecx, byte [jobs_num]
	mov	esi, [Jobs]
  .try_next_job:
	cmp	[esi+JOB.done], 0
	jne	.skip
	cmp	dh, [esi+JOB.timeH]
	jne	.skip
	cmp	dl, [esi+JOB.timeM]
	jne	.skip

	lea	eax, [esi+JOB.app_path]
	lea	ebx, [esi+JOB.app_param]
	stdcall RunProgram, eax, ebx
	stdcall RunProgram, aNotify, eax

	mov	[esi+JOB.done], 1
	inc	[done_jobs_num]
	mov	al, [jobs_num]
	cmp	al, [done_jobs_num]
	jle	close_app
    .skip:
	add	esi, JOB.sizeof
	dec	ecx
	jnz	.try_next_job
	ret

; in: eax = job index
GetJob:
	cmp eax, [jobs_num]
	jg  .ret0
	cmp eax, 0
	jl  .ret0
	
	imul eax, JOB.sizeof
	mov  eax, [Jobs+eax]
	ret
 .ret0:
	xor eax, eax
	ret
	
;data
jobs_num      db 0  ; maximum 256 jobs
done_jobs_num db 0  ; maximum 256 jobs
Jobs	      dd 0  ; Pointer to memory location of jobs list

aNotify        db  '/rd/1/@notify',0

I_END:			  ; End of application code and data marker

app_path       rb  PATH_MAX_CHARS
ini_path       rb  PATH_MAX_CHARS
C++
Spoiler:

Code: Select all

#define PATH_MAX_CHARS 255

typedef struct job
{
  unsigned char done;
  unsigned char timeH;
  unsigned char timeM;
  unsigned char app_path[PATH_MAX_CHARS];
  unsigned char app_param[PATH_MAX_CHARS];
} JOB;

//data
int jobs_num = 255;
int done_jobs_num = 0;
JOB *Jobs = new JOB[jobs_num]; 
char *aNotify = new char[14];
strcpy(aNotify, "/rd/1/@notify\0");

void StartJob()
{
	Time dx = BCDToInt(getBCDTime());
	
	for (int i=0; i<jobs_num; i++){
		if (Jobs[i].done == 0)
			continue;
		if (Jobs[i].timeH !== dx.h)
			continue;
		if (Jobs[i].timeM !== dx.m)
			continue;
		
		char *app_path = Jobs[i].app_path;
		char *app_param = Jobs[i].app_param;
		RunProgram(app_path, app_param);
		RunProgram(aNotify, app_path);
		
		Jobs[i].done = 1;
		done_jobs_num++;
		if (jobs_num <= done_jobs_num)
			CloseApp();
	}
}

JOB GetJob(int i){
	if (i > jobs_num || i < 0)
		return NULL;
	return Jobs[i];
}
StartJob - обработка всего массива
GetJob - получение i-того элемента

Posted: Fri Jul 12, 2013 9:05 pm
by punk_joker
Я с этим куском и пытаюсь разобраться, да ток не выходит ничего. Попробую еще, если снова ничего не выйдет, представлю свои попытки на обозрение.

Re: ряд вопросов по FASM

Posted: Sun Jul 14, 2013 6:51 pm
by Asper
Не понятно что делает код или как работает?

Re: ряд вопросов по FASM

Posted: Sun Jul 14, 2013 8:16 pm
by punk_joker
Выводит какой-то мусор. Скорее всего я где-то ошибся. Исходник "своей программы" прилагаю.

Re: ряд вопросов по FASM

Posted: Sun Jul 14, 2013 9:58 pm
by Asper
В заголовке поменяй это

Code: Select all

 dd	 0x0	     ; зарезервировано
на это

Code: Select all

 dd	 app_path

Posted: Tue Jul 16, 2013 9:20 pm
by punk_joker
Совсем уж тупой вопрос. Как изменять координату выводимого ф. 4 текста? Например мне необходимо каждую следующую строку выводить на 10 пикселей ниже.

Re: ряд вопросов по FASM

Posted: Tue Jul 16, 2013 9:48 pm
by Wildwest
исходники PCIDEV глянь

Posted: Tue Jul 16, 2013 10:35 pm
by punk_joker
Спасибо, помогло.

Re: ряд вопросов по FASM

Posted: Wed Jul 17, 2013 7:24 am
by Mario_r4
punk_joker
Рекомендую все же смотреть документацию. Если у тебя есть скачанный репозиторий SVN, то в Kolibri_SVN\kernel\trunk\docs есть файлы sysfuncs.txt (английский) и sysfuncr.txt (русский). В них содержится самая актуальная версия документации API ядра, если конечно авторы правок ядра почесались над внесением изменений в документацию, а не забили болт (такое редко, но все же бывает).
Также на wiki есть http://wiki.kolibrios.org/wiki/Ru/api/kernel однако там актуальность ниже чем в репозитории SVN. В частности ф.4 про которую ты спрашивал все еще содержит старую версию.

З.Ы. Чтобы на меня вдруг не погнали сторонники wiki, сразу поясню - я не буду вносить в нее изменения, пока не будет сделана синхронизация аккаунтов с SVN. Очень знаете ли "приятно" узнавать что что-то ты можешь, например, править статьи, а что-то могут не все, например, добавлять новые страницы и картинки. Так что пока не будет этот вопрос, никаких телодвижений не будет.

Posted: Wed Jul 17, 2013 11:27 pm
by punk_joker
Снова вопрос, на сей раз по поводу адресации. Ине небходимо ввводить массив строк

mov esi, [Jobs]
add esi, JOB.sizeof*0

В место нуля должен быть номер элемента массивп. Номер хранится в переменной element. Если написать add esi, JOB.sizeof*element программа компилируется но не запускается.

Re: ряд вопросов по FASM

Posted: Wed Jul 17, 2013 11:37 pm
by Mario_r4
А размерность ячейки массива какая? Вообще такая конструкция подходит только для одинаковых по длине строк, поскольку в процессе работы не пересчитывается размер.

Posted: Wed Jul 17, 2013 11:44 pm
by punk_joker
В JOB.sizeof хранится размер ячейки. Если я пишу add esi, JOB.sizeof*2 например, то все прекрасно работает.