Page 1 of 1

символические имена функциям ядра.

Posted: Mon Jun 11, 2007 10:31 pm
by vectoroc
Наверняка многим надоело/не нравится вызывать функции ядра по номеру. Я тут поразмышлял чуток и родил это

Code: Select all

kernel_imports \
		       CreateWindow,	 0,\
		       PutPoint,	 1,\
		       GetKeyCode,	 2,\
		       GetSystemTime,	 3,\
		       PutString,	 4,\
		       ButtonService,	 8,\
		       GetMessage,	 10,\ ;wait event
		       BeginPaint,	 12 1,\
		       EndPaint,	 12 2,\
		       GetButtonId,	 17,\
		       ShutDown,	 18 1,\
		       EndThread,	 18 2,\
		       SetWindowFocus,	 18 3,\
		       GetVersionInfo,	 18 13,\
		       GetSystemColors,  48 3,\
		       ExitProcess,	 0xFFFFFFFF
По-моему так гораздо удобнее будет. Для вызова достаточно написать имя, указанное выше, и параметры через запятую.

Code: Select all

include "macros.inc"
include "kernel.inc"
MEOS_APP_START
CODE
   GetSystemColors sc, sizeof.system_colors ; get system colors
  redraw:                          ; redraw event handler
   call    draw_window             ; at first create and draw the window
  wait_event:                      ; main cycle
    GetMessage
    dec   eax                      ;   if event = 1
    jz      redraw                 ;   jump to redraw handler
    dec   eax                      ;   else if event = 2
    jz      key                    ;   jump to key handler
  button:                          ; button event handler
    GetButtonId                    ;   get button identifier
    cmp     ah, 1
    jne     wait_event             ;   return if button id != 1
    ExitProcess                    ;   exit application
  key:                             ; key event handler
    GetKeyCode                     ;   get key code
    jmp     wait_event
  draw_window:
    BeginPaint                     ; start drawing
                                   ; create and draw the window
                                   ; (window_cx)*65536+(window_sx)
                                   ; (window_cy)*65536+(window_sy)
    mov     edx, [sc.work]         ; work area color
    or      edx, 0x33000000        ; & window type 3
                                   ; window title
    CreateWindow 100*65536+200, 100*65536+100, , ,title
    EndPaint                       ; finish drawing
  ret
DATA
  title db 'Template program',0
UDATA
  sc   system_colors
MEOS_APP_END
Высказывайте выши мнения. В архиве приложена переписанная шаблонная программа (оригинал тут)

Posted: Tue Jun 12, 2007 12:59 pm
by Wildwest
Гм, посмотри исходник CPUID (файл svn://kolibrios.org/programs/system/cpuid/trunk/draw.inc). Я уже с конца 2004 года использую примерно то же самое. Если надо, то могу поискать menuett.inc (раньше лежал здесь http://menuet.narod.ru/download/menuett.rar).

Posted: Tue Jun 12, 2007 1:04 pm
by Wildwest
Уже нашел.
На сайте http://www.meosfiles.narod.ru/files/old/index.htm файл asm_book.7z и в нем есть menuett.inc.

Posted: Tue Jun 12, 2007 2:13 pm
by vectoroc
Это не то же самое. Хотя результат и похож. Поддерживать такие вещи будет геморойнее. В моём варианте чтобы добавить новую функцию ядра достаточно вписать имя функции и ещё номер функции (и номер подфункции через пробел, если есть).
Может стоит все программы перевести на подобный лад. У такого подхода много плюсов. И практически нет минусов, по сравнению с mcall

Posted: Wed Jun 13, 2007 2:23 am
by vectoroc
Какие несёт плюсы эта поделка в моём понимании:
1) программа принимает более красивый и логичный вид. BeginPaint куда понятнее, чем

Code: Select all

    mov     eax, 12
    mov     ebx, 1
    mcall
2) мне не понятна схема распределния функций в ядре по номерам и их "подномерам". В функциях вроде 18-ой черт ногу сломит. Символические имена позволят оттолкнуться от этой схемы. Будет куда проще перераспределить номера функций, сгруппировать их как-то, или вообще прийти к другому соглашению о вызове функций ядра
3) для внесения новых функций достаточно вписать одну строчку в kernel.inc (или как нибудь по другому назвать этот файл...). Не требуется никаких знаний макросов ФАСМ (хотя они никогда не помешают ;))

Побеседовав с ghost-ом, выявили один минус.

Code: Select all

macro Window xStart,yStart,xSize,ySize,bColor,gColor,fColor
{
 __mov ebx,xStart,xSize
...
При таком раскладе мы имеем самодокументируемый код. Прикладному программисту сразу будет ясно для чего нужн каждый параметр. В моём варианте сделать коментарий тоже не проблема. Единственное что, не будет контроля количества передаваемых параметров. Но и это можно решить