Page 18 of 29

Re: Вопрос

Posted: Fri Mar 04, 2016 11:11 pm
by ALEXS1983
dd 0x1000 ; количество памяти
dd 0x1000 ; адрес вершины стэка

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

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

Re: Вопрос

Posted: Fri Mar 04, 2016 11:57 pm
by Yason
Как-то, так!

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

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: ; метка конца программы

Re: Вопрос

Posted: Sat Mar 05, 2016 12:13 am
by 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:

Re: Вопрос

Posted: Sat Mar 05, 2016 12:13 am
by Yason
[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]

Re: Вопрос

Posted: Sat Mar 05, 2016 2:07 am
by Pathoswithin
Короче, ошибка "Файл не является исполняемым" возможно связана с неправильными значениями в заголовке. Там нужно не цифры ставить, а метки, тогда всё будет правильно. В большинстве случаев, "количество памяти" и "адрес вершины стэка" равны финальной метке, а "размер программы" указывает на конец кода / начало данных.

Re: Вопрос

Posted: Sat Mar 05, 2016 8:26 am
by ALEXS1983
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 естественно чтобы они оба доступны были.
КАК ЭТО ВСЁ ДЕЛАЕТСЯ ?

Re: Вопрос

Posted: Sat Mar 05, 2016 8:28 am
by ALEXS1983
... короче, :-) можно ли раз и навсегда сделать все модули доступные везде ? Как это делается ?

Re: Вопрос

Posted: Sat Mar 05, 2016 2:01 pm
by IgorA
ALEXS1983 писал:
> CMDLINE: rb 4096 ; буфер для параметров.
> rb 4096
> STACK_TOP: ; вершина стэка.
>
> Ну а если у меня несколько модулей (include) будет в программе и при каждом модуле
> свои данные что тогда ?
Тут имеются параметры командной строки, а не данные программы. Т.е. например есть графический редактор и при его запуске из CMDLINE можно взять путь к открываемому файлу изображения. Но при обычном запуске программы там ничего не будет.
А свои данные можно писать в любом месте программы.

Re: Вопрос

Posted: Sat Mar 05, 2016 3:19 pm
by Yason
[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, не помню).

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

Re: Вопрос

Posted: Sat Mar 05, 2016 3:22 pm
by Yason
[quote="Yason"]Только макросы надо объявлять заранее, до их использования (на счёт макро-процедур PROC, не помню).[/quote]

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

Re: Вопрос

Posted: Sat Mar 05, 2016 6:43 pm
by Pathoswithin
Короче, в ФАСМе нет такого понятия, как доступность. Если что-то где-то подключено, то оно доступно везде.
В формате Menuet01 нету секций, так что расположение данных чисто условно.

Re: Вопрос

Posted: Sat Mar 05, 2016 7:29 pm
by ALEXS1983
ну вот это для меня точно проще повесится.... :-)
Нужно скорректировать цвета для КОС путём перестановки самих байтов(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
Правильно ли ? как регулировать перемещения?
ПРОШУ ПОМОЩИ!

Re: Вопрос

Posted: Sat Mar 05, 2016 8:51 pm
by Yason
[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

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

Re: Вопрос

Posted: Sat Mar 05, 2016 8:55 pm
by Yason
Хотя .alpha, вроде вначале должно быть. Сейчас не помню.

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

Re: Вопрос

Posted: Sat Mar 05, 2016 9:06 pm
by Yason
Или так!

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

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

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