Board.KolibriOS.org

Official KolibriOS board
It is currently Sat Dec 14, 2019 1:18 am

All times are UTC+03:00




Post new topic  Reply to topic  [ 7 posts ] 
Author Message
PostPosted: Fri Jul 10, 2009 6:49 am 
Offline

Joined: Fri Jul 10, 2009 6:44 am
Posts: 2
Не моглибы дать пример легкой программы в несколько строчек и комментарии к ней, и обьяснить как работает фасм в колибри ос! А то поставил себе эту операционку , а фака по основе нет! Или хотя бы маленькие примеры с обьяснениями в каждой строчке!


Top
   
PostPosted: Fri Jul 10, 2009 8:15 am 
Offline
Kernel Optimizer
User avatar

Joined: Mon Jan 16, 2006 7:58 pm
Posts: 657
viewtopic.php?f=2&t=1082


Top
   
PostPosted: Fri Jul 10, 2009 8:32 am 
Offline

Joined: Fri Jul 10, 2009 6:44 am
Posts: 2
Нет, мне нужны очень маленькие примеры, бувально в пару строк с комментариями к каждой строке, а там очень большие программы!


Top
   
PostPosted: Fri Jul 10, 2009 9:16 am 
Offline
User avatar

Joined: Tue Jan 24, 2006 8:50 am
Posts: 249
хм... <Lrz>, дал очень правильную ссылку.. посмотри второе сообщение сверху... там самый минимум программы... с описанием для каждой строчки...
код можно уменьщить за счет макросов.. нон путаницы будет еще больше... так что легче разобраться в том коде...


Top
   
PostPosted: Fri Jul 10, 2009 9:18 am 
Offline
Kernel Optimizer
User avatar

Joined: Mon Jan 16, 2006 7:58 pm
Posts: 657
Нет, там очень маленькие программы, огромные программы это программы от 2 тыс. строк кода и выше.
Программ в 2-4 строчки кода на ассемблере для колибри не существует.


Top
   
PostPosted: Fri Jul 10, 2009 11:36 am 
Offline
User avatar

Joined: Fri Jan 27, 2006 3:06 pm
Posts: 1071
Исправил и подробно разжевал пример по ссылке выше, а вообще, прежде чем что-то рекомендовать новичкам лучше лишний раз убедиться в правильности кода:
Code:
;заголовок приложения (в любой программе для колибри выглядит примерно так)
use32                     ; сообщим фасму, что собираемся использовать 32 битные команды
    org 0x0               ; базовый адрес кода (всегда 0x0)
    db 'MENUET01'         ; идентификатор исполняемого файла Колибри (наследие от предка - MenuetOS - всегда 'MENUET01')
    dd 0x1                ; версия формата заголовка исполняемого файла (всегда 0x1)
    dd start              ; указывает откуда начинается сам код программы
    dd i_end              ; указывает, где этот код заканчивается
    dd i_end              ; объем используемой памяти (здесь объем памяти равен объему кода, потому строка указывает на тот же адрес, что и предыдущая)
    dd i_end+0x100        ; вершина стека (стек растет снизу вверх от указанной величины в сторону данных программы, здесь выбран размер стека 0x100)
    dd 0x0,0x0            ; через запятую: указатель на строку с параметрами и указатель на строку, куда помещается путь к данной программе на диске
                          ; тут вбиты нули - это означает, что мы не отслеживаем в программе эти данные.
;----------------------------------------------------------------------------------------

align 4                   ; выравнивание кода
start:                    ; здесь начинается сама программа
;        mov  eax,40      ; вызов системной функции 40: установить маску для ожидаемых событий (полный список функций см. в sysfuncr.txt описание событий в конце документа)
;        mov  ebx,0x7     ; программа будет реагировать только на события, которые мы разрешим этой функцией.
;        int 0x40         ; По умолчанию ( если эту функцию не вызывать) программе будут приходить сообщения о нажатии кнопки в программе,
                          ; о необходимости перерисовать окно и о нажатии какой-либо клавиши на клавиатуре,
                          ; что достаточно для этой программы, поэтому вызов функции закомментирован)

red_win:                  ; рисуем окно программы
        call draw_window  ; вызов процедуры draw_window (см. ниже)

still:                    ; нарисовали - переходим в основной цикл программы
        mov eax,10        ; функция 10: ждем события, которые мы выше определили функцией 40
        int 0x40
                          ; событие произошло, теперь проверяем, какое именно
        cmp al,0x1        ; если система говорит, что нужно перерисовать окно (изменились его размер или положение)
        jz  red_win       ; перепрыгиваем на процедуру red_win (перерисовываем окно) и ждем события дальше
        cmp al,0x3        ; если была нажата кнопка в программе,
        jz  button        ; то прыгаем на процедуру button

key:                      ; если это и не кнопка и не перерисовка, значит остается одно - клавиша на клавиатуре
        mov  eax,2        ; функция 2: считываем код нажатой клавиши и забываем, потому как мы не используем клавиатуру в этой программе
        int  0x40
        jmp still         ; сделали свое дело и опять возвращаемся в основной цикл программы и ждем событий

button:                   ; процедура обрабоки кнопок в программе
        mov eax,17        ; функция 17: получить номер нажатой кнопки
        int  0x40
        shr  eax,8        ; сдвигаем регистр eax на 8 бит вправо, чтобы получить номер нажатой кнопки

        cmp eax,1
        jne  no_exit      ; если это не кнопка 1 (зарезервирована системой как кнопка закрытия программы), пропускаем 2 следующие строчки кода

        or   eax,-1       ;(равносильно команде mov eax,-1, но более оптимально - функция -1: завершение программы)
        int  0x40

 no_exit:                  ; и переходим сюда, где проверяем, какая же все таки кнопка была нажата (в этой программе других кнопок нет,
        jmp  still        ; поэтому возвращаемся в основной цикл программы и опять ждем событий)

draw_window:              ; процедура отрисовки окна приложения
        mov eax,12        ; функция 12,
        mov ebx,1         ; подфункция 1: сообщить системе, что мы хотим нарисовать окно
        int 0x40

       xor  eax,eax             ; обнуляет регистр eax (по сути - то же, что и mov eax,0, но более оптимально) - функция 0: нарисовать окно
       mov  ebx,50*65536+180    ; [координата окна по оси x]*65536 + [размер по оси x]
       mov  ecx,30*65536+100    ; [координата по оси y]*65536 + [размер по оси y]
       mov  edx,0x33AABBCC      ; цвет рабочей области окна RRGGBB, первые 2 цифры (33) определяют тип и параметры окна,
                                ; тут - 3 тип (окно со скином изменяемого размера) и координнаты окна отсчитываются он клиентской области
       mov  edi,hed             ; заголовок программы
       int 0x40
       
; здесь рисуются все основные элементы программы, если они есть, в нашем случае это просто пустое окно

       mov eax,12          ; функция 12,
       mov ebx,2           ; подфункция 2 - сообщить системе, что мы закончили отрисовку окна.
       int 0x40
    ret

hed db 'Hello World',0     ; название программы

i_end:


Last edited by Heavyiron on Tue Jul 14, 2009 12:38 pm, edited 1 time in total.

Top
   
PostPosted: Tue Jul 14, 2009 8:32 am 
Offline

Joined: Mon Mar 27, 2006 6:33 am
Posts: 674
gost6678 wrote:
Нет, мне нужны очень маленькие примеры, бувально в пару строк с комментариями к каждой строке, а там очень большие программы!


Возможно полезная ссылка на ресурсы по asm на sourceforge

P.S. Есть ли отдельный топик где собраны ресурсы по asm?

Кто нибудь пробовал решить задачу создания конвертилки:
например: Asm -> Си
( или в какой нибудь высокоуровневый мнемокод? )
Это могло бы помочь лучше контролировать структуру Asm кода.
Возможно было бы и обратное однозначное преобразование.
Есть коммерческий продукт Relogix созданный для преобразования Asm в С.

Могу сделать простую конвертилку Asm -> блок схема ( результат в dot форме )
Attachment:
sci.dot.jpg
sci.dot.jpg [ 185.63 KiB | Viewed 7323 times ]
Attachment:
sciex.txt [1.9 KiB]
Downloaded 333 times


Attachments:
sci_dot.txt [4.43 KiB]
Downloaded 312 times
Top
   
Display posts from previous:  Sort by  
Post new topic  Reply to topic  [ 7 posts ] 

All times are UTC+03:00


Who is online

Users browsing this forum: No registered users and 2 guests


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
Powered by phpBB® Forum Software © phpBB Limited