dd 0x1000 ; количество памяти
dd 0x1000 ; адрес вершины стэка
Что тут в "шапке" прописывать когда есть массив 256x256 dword ?
Будут еще массивы как вычислять "количество памяти" и "адрес вершины стэка"
Почему при больших размерах (которые дельфине например сложно называть большими) пишет KlbrInWin и QEMU пишет что это не КОСовский запускной файл ?
Ох, не любите вы новичков, ох не любите, и ваша система тоже не любит новичков,
по мозгам бьёт ну прям на каждом шагу! Когда вы уже среду Дельфи для КОС напишите?!... чтобы можно было массивы, вот такие var ImageData:array[0..400000000] of Cardinal; без проблем создавать и всяких настроек :-( :-)
Вопрос
Как-то, так!
;---------------------------------------------------------------------;
;--- ЗАГОЛОВОК ПРОГРАММЫ. ------------------------------------------;
;---------------------------------------------------------------------;
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: ; метка конца программы
;---------------------------------------------------------------------;
;--- ЗАГОЛОВОК ПРОГРАММЫ. ------------------------------------------;
;---------------------------------------------------------------------;
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: ; метка конца программы
Или даже так!
;---------------------------------------------------------------------;
;--- ЗАГОЛОВОК ПРОГРАММЫ. ------------------------------------------;
;---------------------------------------------------------------------;
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:
;---------------------------------------------------------------------;
;--- ЗАГОЛОВОК ПРОГРАММЫ. ------------------------------------------;
;---------------------------------------------------------------------;
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="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]
;---------------------------------------------------------------------;
;--- ЗАГОЛОВОК ПРОГРАММЫ. ------------------------------------------;
;---------------------------------------------------------------------;
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]
Короче, ошибка "Файл не является исполняемым" возможно связана с неправильными значениями в заголовке. Там нужно не цифры ставить, а метки, тогда всё будет правильно. В большинстве случаев, "количество памяти" и "адрес вершины стэка" равны финальной метке, а "размер программы" указывает на конец кода / начало данных.
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 естественно чтобы они оба доступны были.
КАК ЭТО ВСЁ ДЕЛАЕТСЯ ?
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 естественно чтобы они оба доступны были.
КАК ЭТО ВСЁ ДЕЛАЕТСЯ ?
... короче, :-) можно ли раз и навсегда сделать все модули доступные везде ? Как это делается ?
ALEXS1983 писал:
> CMDLINE: rb 4096 ; буфер для параметров.
> rb 4096
> STACK_TOP: ; вершина стэка.
>
> Ну а если у меня несколько модулей (include) будет в программе и при каждом модуле
> свои данные что тогда ?
Тут имеются параметры командной строки, а не данные программы. Т.е. например есть графический редактор и при его запуске из CMDLINE можно взять путь к открываемому файлу изображения. Но при обычном запуске программы там ничего не будет.
А свои данные можно писать в любом месте программы.
> CMDLINE: rb 4096 ; буфер для параметров.
> rb 4096
> STACK_TOP: ; вершина стэка.
>
> Ну а если у меня несколько модулей (include) будет в программе и при каждом модуле
> свои данные что тогда ?
Тут имеются параметры командной строки, а не данные программы. Т.е. например есть графический редактор и при его запуске из CMDLINE можно взять путь к открываемому файлу изображения. Но при обычном запуске программы там ничего не будет.
А свои данные можно писать в любом месте программы.
[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, не помню).
Вот, кака-то так.
Ну вот, допустим, есть 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, не помню).
Вот, кака-то так.
[quote="Yason"]Только макросы надо объявлять заранее, до их использования (на счёт макро-процедур PROC, не помню).[/quote]
Макросы и Include'ы с макросами, имеется ввиду.
Макросы и Include'ы с макросами, имеется ввиду.
Короче, в ФАСМе нет такого понятия, как доступность. Если что-то где-то подключено, то оно доступно везде.
В формате Menuet01 нету секций, так что расположение данных чисто условно.
В формате Menuet01 нету секций, так что расположение данных чисто условно.
ну вот это для меня точно проще повесится.... :-)
Нужно скорректировать цвета для КОС путём перестановки самих байтов(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
Правильно ли ? как регулировать перемещения?
ПРОШУ ПОМОЩИ!
Нужно скорректировать цвета для КОС путём перестановки самих байтов(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
Правильно ли ? как регулировать перемещения?
ПРОШУ ПОМОЩИ!
[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
;-----------------------------------------------------;
Нужно скорректировать цвета для КОС путём перестановки самих байтов(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
;-----------------------------------------------------;
Хотя .alpha, вроде вначале должно быть. Сейчас не помню.
PIXEL:
.alpha db 0
.red db 0
.green db 0
.blue db 0
PIXEL:
.alpha db 0
.red db 0
.green db 0
.blue db 0
Или так!
;-----------------------------------------------------;
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
;-----------------------------------------------------;
;-----------------------------------------------------;
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
;-----------------------------------------------------;
Who is online
Users browsing this forum: No registered users and 5 guests