Board.KolibriOS.org

Official KolibriOS board
It is currently Thu Dec 05, 2019 8:20 pm

All times are UTC+03:00




Post new topic  Reply to topic  [ 391 posts ]  Go to page Previous 116 17 18 19 2027 Next
Author Message
 Post subject: Re: Вопрос
PostPosted: Fri Mar 04, 2016 11:11 pm 
Offline

Joined: Sat Nov 14, 2015 11:15 am
Posts: 299
dd 0x1000 ; количество памяти
dd 0x1000 ; адрес вершины стэка

Что тут в "шапке" прописывать когда есть массив 256x256 dword ?
Будут еще массивы как вычислять "количество памяти" и "адрес вершины стэка"
Почему при больших размерах (которые дельфине например сложно называть большими) пишет KlbrInWin и QEMU пишет что это не КОСовский запускной файл ?

Ох, не любите вы новичков, ох не любите, и ваша система тоже не любит новичков,
по мозгам бьёт ну прям на каждом шагу! Когда вы уже среду Дельфи для КОС напишите?!... чтобы можно было массивы, вот такие var ImageData:array[0..400000000] of Cardinal; без проблем создавать и всяких настроек :-( :-)


Top
   
 Post subject: Re: Вопрос
PostPosted: Fri Mar 04, 2016 11:57 pm 
Offline
User avatar

Joined: Sat Sep 27, 2014 2:59 pm
Posts: 102
Как-то, так!

;---------------------------------------------------------------------;
;--- ЗАГОЛОВОК ПРОГРАММЫ. ------------------------------------------;
;---------------------------------------------------------------------;

use32 ; включить 32-битный режим ассемблера.
org 0x0 ; адресация с нуля.

db 'MENUET01' ; 8-байтный идентификатор MenuetOS.
dd 0x01 ; версия заголовка (всегда 1).
dd START ; адрес первой команды.
dd I_END ; размер программы.
dd I_END ; количество памяти.
dd STACK_TOP ; адрес вершины стэка.
dd CMDLINE ; адрес буфера для параметров.
dd 0x0 ; зарезервировано.

include "macros.inc" ; макросы облегчают жизнь ассемблерщиков!

;---------------------------------------------------------------------;
;--- КОД ПРОГРАММЫ. ------------------------------------------------;
;---------------------------------------------------------------------;

START: ; начало программы.

.exit:
mcall -1 ; иначе конец программы.

;---------------------------------------------------------------------;
;--- ДАННЫЕ ПРОГРАММЫ. ---------------------------------------------;
;---------------------------------------------------------------------;

title db 'Пример программы',0

;---------------------------------------------------------------------;

CMDLINE: rb 4096 ; буфер для параметров.
rb 4096
STACK_TOP: ; вершина стэка.

I_END: ; метка конца программы


Top
   
 Post subject: Re: Вопрос
PostPosted: Sat Mar 05, 2016 12:13 am 
Offline
User avatar

Joined: Sat Sep 27, 2014 2:59 pm
Posts: 102
Или даже так!

;---------------------------------------------------------------------;
;--- ЗАГОЛОВОК ПРОГРАММЫ. ------------------------------------------;
;---------------------------------------------------------------------;

use32 ; включить 32-битный режим ассемблера.
org 0x0 ; адресация с нуля.

db 'MENUET01' ; 8-байтный идентификатор MenuetOS.
dd 0x01 ; версия заголовка (всегда 1).
dd START ; адрес первой команды.
dd IM_END ; размер программы.
dd I_END ; количество памяти.
dd STACK_TOP ; адрес вершины стэка.
dd CMDLINE ; адрес буфера для параметров.
dd 0x0 ; зарезервировано.

include "macros.inc" ; макросы облегчают жизнь ассемблерщиков!

;---------------------------------------------------------------------;
;--- КОД ПРОГРАММЫ. ------------------------------------------------;
;---------------------------------------------------------------------;

START: ; начало программы.

.exit:
mcall -1 ; иначе конец программы.

;---------------------------------------------------------------------;
;--- ДАННЫЕ ПРОГРАММЫ. ---------------------------------------------;
;---------------------------------------------------------------------;

title db 'Пример программы',0

;---------------------------------------------------------------------;

IM_END:


CMDLINE: rb 4096 ; буфер для параметров.
rb 4096
STACK_TOP: ; вершина стэка.

I_END:


Top
   
 Post subject: Re: Вопрос
PostPosted: Sat Mar 05, 2016 12:13 am 
Offline
User avatar

Joined: Sat Sep 27, 2014 2:59 pm
Posts: 102
[quote="Yason"]Или даже так!

;---------------------------------------------------------------------;
;--- ЗАГОЛОВОК ПРОГРАММЫ. ------------------------------------------;
;---------------------------------------------------------------------;

use32 ; включить 32-битный режим ассемблера.
org 0x0 ; адресация с нуля.

db 'MENUET01' ; 8-байтный идентификатор MenuetOS.
dd 0x01 ; версия заголовка (всегда 1).
dd START ; адрес первой команды.
dd IM_END ; размер программы.
dd I_END ; количество памяти.
dd STACK_TOP ; адрес вершины стэка.
dd CMDLINE ; адрес буфера для параметров.
dd 0x0 ; зарезервировано.

include "macros.inc" ; макросы облегчают жизнь ассемблерщиков!

;---------------------------------------------------------------------;
;--- КОД ПРОГРАММЫ. ------------------------------------------------;
;---------------------------------------------------------------------;

START: ; начало программы.

.exit:
mcall -1 ; иначе конец программы.

;---------------------------------------------------------------------;
;--- ДАННЫЕ ПРОГРАММЫ. ---------------------------------------------;
;---------------------------------------------------------------------;

title db 'Пример программы',0

;---------------------------------------------------------------------;

IM_END:

CMDLINE: rb 4096 ; буфер для параметров.
rb 4096
STACK_TOP: ; вершина стэка.

I_END:[/quote]


Top
   
 Post subject: Re: Вопрос
PostPosted: Sat Mar 05, 2016 2:07 am 
Offline
Mentor/Kernel Developer
User avatar

Joined: Thu Mar 26, 2015 5:16 pm
Posts: 1264
Короче, ошибка "Файл не является исполняемым" возможно связана с неправильными значениями в заголовке. Там нужно не цифры ставить, а метки, тогда всё будет правильно. В большинстве случаев, "количество памяти" и "адрес вершины стэка" равны финальной метке, а "размер программы" указывает на конец кода / начало данных.


Top
   
 Post subject: Re: Вопрос
PostPosted: Sat Mar 05, 2016 8:26 am 
Offline

Joined: Sat Nov 14, 2015 11:15 am
Posts: 299
CMDLINE: rb 4096 ; буфер для параметров.
rb 4096
STACK_TOP: ; вершина стэка.

Ну а если у меня несколько модулей (include) будет в программе и при каждом модуле свои данные что тогда ?

2. Что-то я ничего не понял пока с подключениями модулей... в том смысле
что допустим существует Main.asm и модули допустим u1,u2,u3....
в дельфи, например, какой модуль в каком используешь в там его и подключаешь (uses) вот только если один в другом используешь (друг в друге), то зависит в какой секции его подключаешь interface или implementation, ну это не сложно....

тут в ФАСМ хрен поймёшь....
в Main.asm подключаешь u1, если в u1 уже подключён u2, то его что уже в Main.asm подключать не надо ? всё модуля u2 становится доступно для Main.asm ?
но интересное пожалуй следующее... когда мне при этом всём еще надо u1 и u2 сделать доступными друг-у-друга да и в Main.asm естественно чтобы они оба доступны были.
КАК ЭТО ВСЁ ДЕЛАЕТСЯ ?


Top
   
 Post subject: Re: Вопрос
PostPosted: Sat Mar 05, 2016 8:28 am 
Offline

Joined: Sat Nov 14, 2015 11:15 am
Posts: 299
... короче, :-) можно ли раз и навсегда сделать все модули доступные везде ? Как это делается ?


Top
   
 Post subject: Re: Вопрос
PostPosted: Sat Mar 05, 2016 2:01 pm 
Offline
User avatar

Joined: Mon Oct 27, 2008 10:10 pm
Posts: 812
ALEXS1983 писал:
> CMDLINE: rb 4096 ; буфер для параметров.
> rb 4096
> STACK_TOP: ; вершина стэка.
>
> Ну а если у меня несколько модулей (include) будет в программе и при каждом модуле
> свои данные что тогда ?
Тут имеются параметры командной строки, а не данные программы. Т.е. например есть графический редактор и при его запуске из CMDLINE можно взять путь к открываемому файлу изображения. Но при обычном запуске программы там ничего не будет.
А свои данные можно писать в любом месте программы.


Top
   
 Post subject: Re: Вопрос
PostPosted: Sat Mar 05, 2016 3:19 pm 
Offline
User avatar

Joined: Sat Sep 27, 2014 2:59 pm
Posts: 102
[quote="ALEXS1983"]... короче, :-) можно ли раз и навсегда сделать все модули доступные везде ? Как это делается ?[/quote]

Ну вот, допустим, есть main.asm и 4 модуля: module0.inc, module1.inc, module2.inc, module3.inc.

====================================================================================================
main.asm
include 'module0.inc' ; подключаем глобалльный модуль(с набором других модулей), к main.asm,
; функции и данные из которого будут доступны везде.
----------------------------------------------------------------------------------------------------
module0.inc ; глобальный модуль.
include 'module1.inc' ; подключаем 1-й модуль, к module0.inc.
include 'module2.inc' ; подключаем 2-й модуль, к module0.inc.
include 'module3.inc' ; подключаем 3-й модуль, к module0.inc.
module1.inc ; модуль с 1 и более фйнкий.
module2.inc ; модуль с 1 и более фйнкий.
module3.inc ; модуль с 1 и более фйнкий.
====================================================================================================

ИЛИ ТАК...

====================================================================================================
main.asm
; функции и данные из этих модулей будут доступны везде.
include 'module1.inc' ; подключаем 1-й глобалльный модуль.
include 'module2.inc' ; подключаем 2-й глобалльный модуль.
include 'module3.inc' ; подключаем 3-й глобалльный модуль.
----------------------------------------------------------------------------------------------------
module1.inc ; модуль с 1 и более фйнкий.
module2.inc ; модуль с 1 и более фйнкий.
module3.inc ; модуль с 1 и более фйнкий.
====================================================================================================

Include'ы можно делать в любом месте исходника. Только макросы надо объявлять заранее, до их использования (на счёт макро-процедур PROC, не помню).

Вот, кака-то так.


Top
   
 Post subject: Re: Вопрос
PostPosted: Sat Mar 05, 2016 3:22 pm 
Offline
User avatar

Joined: Sat Sep 27, 2014 2:59 pm
Posts: 102
[quote="Yason"]Только макросы надо объявлять заранее, до их использования (на счёт макро-процедур PROC, не помню).[/quote]

Макросы и Include'ы с макросами, имеется ввиду.


Top
   
 Post subject: Re: Вопрос
PostPosted: Sat Mar 05, 2016 6:43 pm 
Offline
Mentor/Kernel Developer
User avatar

Joined: Thu Mar 26, 2015 5:16 pm
Posts: 1264
Короче, в ФАСМе нет такого понятия, как доступность. Если что-то где-то подключено, то оно доступно везде.
В формате Menuet01 нету секций, так что расположение данных чисто условно.


Top
   
 Post subject: Re: Вопрос
PostPosted: Sat Mar 05, 2016 7:29 pm 
Offline

Joined: Sat Nov 14, 2015 11:15 am
Posts: 299
ну вот это для меня точно проще повесится.... :-)
Нужно скорректировать цвета для КОС путём перестановки самих байтов(1,2,3,4) PutPixel_color `а который dword (т.е. PutPixel_color rd 1).
Нужна процедура в которой можно регулировать перестановку,
т.е. (С 1 на 3, с 3 на 1 байт) или (с 2 на 4, с 4 на 2 байт) и т.д.
В общем для понятности выложу код на дельфи

var PutPixel_color:Cardinal;

Procedure TMainForm.ConvToColor; // Преобразование цветов
Var B:Byte;
Var byte_: array[1..4] of byte; cardinal_:cardinal absolute byte_;
begin
cardinal_:= PutPixel_color;
B:=Byte_[1];Byte_[1]:=Byte_[3]; Byte_[3]:=b; PutPixel_color:=Cardinal_;
end;


На асме получилось вот такое....
B rd 4
PutPixel_color rd 1
convColorToKOS:
mov eax,B
mov edx,[PutPixel_color]
mov [eax],edx
mov dl,[eax]
mov byte [B],dl
mov dl,[eax+$02]
mov [eax],dl
mov dl,byte [B]
mov [eax+$02],dl
mov eax,[eax]
mov [PutPixel_color],eax
ret
Правильно ли ? как регулировать перемещения?
ПРОШУ ПОМОЩИ!


Top
   
 Post subject: Re: Вопрос
PostPosted: Sat Mar 05, 2016 8:51 pm 
Offline
User avatar

Joined: Sat Sep 27, 2014 2:59 pm
Posts: 102
[quote="ALEXS1983"]ну вот это для меня точно проще повесится.... :-)
Нужно скорректировать цвета для КОС путём перестановки самих байтов(1,2,3,4) PutPixel_color `а который dword (т.е. PutPixel_color rd 1).
Нужна процедура в которой можно регулировать перестановку,
т.е. (С 1 на 3, с 3 на 1 байт) или (с 2 на 4, с 4 на 2 байт) и т.д.
ПРОШУ ПОМОЩИ![/quote]

Всё, очень просто (если, я правильно тебя понял)! Вот.

;-----------------------------------------------------;

PIXEL:
.red db 0
.green db 0
.blue db 0
.alpha db 0

pixel_color: dd 0xff332211

;-----------------------------------------------------;

pixel.convert_bgr_to_rgb.32bit:
mov eax, dword [pixel_color]
bswap eax
ror eax,8
mov [PIXEL.blue], byte al
mov [PIXEL.green], byte ah
ror eax,16
mov [PIXEL.red], byte al
mov [PIXEL.alpha], byte ah
ret

;-----------------------------------------------------;


Top
   
 Post subject: Re: Вопрос
PostPosted: Sat Mar 05, 2016 8:55 pm 
Offline
User avatar

Joined: Sat Sep 27, 2014 2:59 pm
Posts: 102
Хотя .alpha, вроде вначале должно быть. Сейчас не помню.

PIXEL:
.alpha db 0
.red db 0
.green db 0
.blue db 0


Top
   
 Post subject: Re: Вопрос
PostPosted: Sat Mar 05, 2016 9:06 pm 
Offline
User avatar

Joined: Sat Sep 27, 2014 2:59 pm
Posts: 102
Или так!

;-----------------------------------------------------;

pixel_color1: dd 0xff332211
pixel_color2: dd 0x00000000

;-----------------------------------------------------;

convert_bgr_to_rgb.32bit:
mov eax, dword [pixel_color1]
rol eax, 8
mov [pixel_color2], dword eax ; [pixel_color2] = 0xff112233
ret

;-----------------------------------------------------;


Top
   
Display posts from previous:  Sort by  
Post new topic  Reply to topic  [ 391 posts ]  Go to page Previous 116 17 18 19 2027 Next

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