Fasm на Колибри ос для новичков!
-
Не моглибы дать пример легкой программы в несколько строчек и комментарии к ней, и обьяснить как работает фасм в колибри ос! А то поставил себе эту операционку , а фака по основе нет! Или хотя бы маленькие примеры с обьяснениями в каждой строчке!
Нет, мне нужны очень маленькие примеры, бувально в пару строк с комментариями к каждой строке, а там очень большие программы!
хм... <Lrz>, дал очень правильную ссылку.. посмотри второе сообщение сверху... там самый минимум программы... с описанием для каждой строчки...
код можно уменьщить за счет макросов.. нон путаницы будет еще больше... так что легче разобраться в том коде...
код можно уменьщить за счет макросов.. нон путаницы будет еще больше... так что легче разобраться в том коде...
Нет, там очень маленькие программы, огромные программы это программы от 2 тыс. строк кода и выше.
Программ в 2-4 строчки кода на ассемблере для колибри не существует.
Программ в 2-4 строчки кода на ассемблере для колибри не существует.
Исправил и подробно разжевал пример по ссылке выше, а вообще, прежде чем что-то рекомендовать новичкам лучше лишний раз убедиться в правильности кода:
Code: Select all
;заголовок приложения (в любой программе для колибри выглядит примерно так)
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.
Возможно полезная ссылка на ресурсы по asm на sourceforgegost6678 wrote:Нет, мне нужны очень маленькие примеры, бувально в пару строк с комментариями к каждой строке, а там очень большие программы!
P.S. Есть ли отдельный топик где собраны ресурсы по asm?
Кто нибудь пробовал решить задачу создания конвертилки:
например: Asm -> Си
( или в какой нибудь высокоуровневый мнемокод? )
Это могло бы помочь лучше контролировать структуру Asm кода.
Возможно было бы и обратное однозначное преобразование.
Есть коммерческий продукт Relogix созданный для преобразования Asm в С.
Могу сделать простую конвертилку Asm -> блок схема ( результат в dot форме )
- Attachments
-
-
sci_dot.txt (4.43 KiB)Downloaded 513 times
-
Who is online
Users browsing this forum: No registered users and 17 guests