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

Assembler programming questions
  • Ну общий смысл, думаю понятен.
    1. Считал данные из файла и сохранил их в удобном виде в памяти.
    2. Далее можно брать эти данные по известному адресу в памяти, и либо копировать сами данные, либо указатель на них в соответствующие элементы интерфейса.
    3. После редактирования данных, все сохраняем в памяти.
    4. После того как пользователь пожелал сохранить данные, пишем их обратно в файл.
    Можешь посмотреть ещё MyKey, он тоже позволяет редактировать данные своего ini-файла.
  • Немог бы показать на примере обращение к данным через jobs?
    to infinity and beyond
  • Так?

    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-того элемента
  • Я с этим куском и пытаюсь разобраться, да ток не выходит ничего. Попробую еще, если снова ничего не выйдет, представлю свои попытки на обозрение.
    to infinity and beyond
  • Не понятно что делает код или как работает?
  • Выводит какой-то мусор. Скорее всего я где-то ошибся. Исходник "своей программы" прилагаю.
    Attachments
    EXAMPLE.7z (3.12 KiB)
    Downloaded 233 times
    to infinity and beyond
  • В заголовке поменяй это

    Code: Select all

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

    Code: Select all

     dd	 app_path
  • Совсем уж тупой вопрос. Как изменять координату выводимого ф. 4 текста? Например мне необходимо каждую следующую строку выводить на 10 пикселей ниже.
    to infinity and beyond
  • исходники PCIDEV глянь
  • Спасибо, помогло.
    to infinity and beyond
  • 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. Очень знаете ли "приятно" узнавать что что-то ты можешь, например, править статьи, а что-то могут не все, например, добавлять новые страницы и картинки. Так что пока не будет этот вопрос, никаких телодвижений не будет.
    Всем чмоки в этом проекте! Засуньте эти 11 лет себе в жопу!
  • Снова вопрос, на сей раз по поводу адресации. Ине небходимо ввводить массив строк

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

    В место нуля должен быть номер элемента массивп. Номер хранится в переменной element. Если написать add esi, JOB.sizeof*element программа компилируется но не запускается.
    to infinity and beyond
  • А размерность ячейки массива какая? Вообще такая конструкция подходит только для одинаковых по длине строк, поскольку в процессе работы не пересчитывается размер.
    Всем чмоки в этом проекте! Засуньте эти 11 лет себе в жопу!
  • В JOB.sizeof хранится размер ячейки. Если я пишу add esi, JOB.sizeof*2 например, то все прекрасно работает.
    to infinity and beyond
  • Who is online

    Users browsing this forum: No registered users and 4 guests