Board.KolibriOS.org

Official KolibriOS board
It is currently Fri Dec 06, 2019 10:54 am

All times are UTC+03:00




Post new topic  Reply to topic  [ 12 posts ] 
Author Message
 Post subject: Masm to Fasm
PostPosted: Sat Nov 10, 2012 7:35 pm 
Offline
KSoC/GSoC Student

Joined: Wed Jul 11, 2012 3:17 am
Posts: 224
Есть obj, который был слинкован в выходной файл com (MZ, dos)
http://diamond.kolibrios.org/hll/hll.htm
Для допилки предлогается использовать некий doexe.asm следующего содержания:
Code:
virtual at 0
file 'hellos.kos':3Ch,4
load pehea dword from 0
file 'hellos.kos':pehea+0F8h,28h
load physofs dword from 4+14h
load mem dword from 4+8
file 'hellos.kos':physofs+16,4
load sz dword from $-4
end virtual
file 'hellos.kos':physofs,sz
store dword mem at 14h

собственно при попытке компиляции fasmом выдаётся ошибка:
Quote:
>fasm doexe.asm
flat assembler version 1.69.31 (1570535 kilobytes memory)
doexe.asm [10]:
file 'hellos.kos':physofs,sz
error: value out of range.

Вопрос может быть только один, как быть, что править?

PS: Дополнительные сведения
параметры линковки:
Code:
/force:unresolved /fixed /subsystem:native /base:-0x10000 /align:0x10000 /merge:.data=.text /merge:.rdata=.text /nologo

данные о файле:
Spoiler: Show
Code:
TECHNICAL FILE INFORMATION : 
File Type Description :   Portable Executable (PE)

FILE CHARACTERISTICS :
      Relocation info stripped from file
      File is executable  (i.e. no unresolved external references)
      COFF line numbers have been removed
      COFF symbol table entries for local symbols have been removed
      Machine based on 32-bit-word architecture
FILE HEADER :

   Machine:                         014Ch (i386 or later, and compatible)
   Number of Sections:              0002h
   Time Date Stamp:                 509E80DEh  -> 10/11/2012  23:29:18 
   Symbols Pointer:                 00000000h
   Number Of Symbols:               00000000h
   Size Of Optional Header:         00E0h
   Flags:                           010Fh

OPTIONAL HEADER :
   Magic                            010Bh ( PE32 : normal 32-bit )
   Linker version                   5.12
   Size of code                     00000200h
   Size of initialized data         00000200h
   Size of uninitialized data       00000000h
   Address of Entry Point (RVA)     00000000h
   Base of code                     00010000h
   Base of data                     00020000h
   Image base                       FFFF0000h
   Section Alignment                00010000h
   File Alignment                   00000200h
   Required OS version              4.00
   Image version                    0.00
   Subsystem version                4.00
   Reserved1                        0
   Size of image                    00030000h ( 196608 bytes)
   Size of headers                  00000200h
   Checksum                         00005C15h
   Subsystem                        0001h (Native : Image doesn't require a subsystem)
   DLL Characteristics              0000h
   Size of Stack Reserve            00100000h
   Size of Stack Commit             00001000h
   Size of Heap Reserve             00100000h
   Size of Heap Commit              00001000h
   loader flags                     00000000h (obsolete)
   Number of Data Directory         00000010h

DATA DIRECTORY (Virtual Address and Size)
   Export Directory     rva: 00000000h     size: 00000000h
   Import Directory     rva: 00000000h     size: 00000000h
   Resource Directory     rva: 00000000h     size: 00000000h
   Exception table     rva: 00000000h     size: 00000000h
   Security table     rva: 00000000h     size: 00000000h
   Base Relocation table     rva: 00000000h     size: 00000000h
   Debug Directory     rva: 00000000h     size: 00000000h
   Architecture Specific Data     rva: 00000000h     size: 00000000h
   Global Pointer     rva: 00000000h     size: 00000000h
   TLS Directory     rva: 00000000h     size: 00000000h
   Load config table     rva: 00000000h     size: 00000000h
   Bound Import table     rva: 00000000h     size: 00000000h
   Import Address Table     rva: 00000000h     size: 00000000h
   Delay import descriptor     rva: 00000000h     size: 00000000h
   COM descriptor     rva: 00000000h     size: 00000000h
   unused           rva: 00000000h     size: 00000000h

SECTION TABLE
01 .text     
   VirtSize:    00000048h  VirtAddr:         00010000h
   raw data offs:      00000200h  raw data size:    00000200h
   relocation offs:    00000000h  relocations:      00000000h
   line # offs:        00000000h  line #'s:         00000000h
   characteristics:    60000020h
   CODE  EXECUTE  READ  ALIGN_DEFAULT(16) 
02 _INIT_   
   VirtSize:    00000006h  VirtAddr:         00020000h
   raw data offs:      00000400h  raw data size:    00000200h
   relocation offs:    00000000h  relocations:      00000000h
   line # offs:        00000000h  line #'s:         00000000h
   characteristics:    C0000040h
   INITIALIZED_DATA  READ  WRITE  ALIGN_DEFAULT(16) 


DOS HEADER
Header Information :

   Signature :   5A4Dh
   Bytes on last page of file :   0090h
   Total Pages in File :   0003h
   Relocation Items :   0000h
   Size of header in paragraphs :   0004h
   Minimum Extra Paragraphs :   0000h
   Maximum Extra Paragraphs :   FFFFh
   Initial Stack Segment :   0000h
   Initial Stack Pointer :   00B8h
   Complemented Checksum :   0000h
   Initial Instruction Pointer :   0000h
   Initial Code Segment :   0000h
   Relocation Table Offset :   0040h
   Overlay Number :   0000h

Extra Header Information :
   Reserved WORD 0:   0000h
   Reserved WORD 1:   0000h
   Reserved WORD 2:   0000h
   Reserved WORD 3:   0000h
   OEM identifier :   0000h
   OEM information :   0000h
   Reserved WORD 0:   0000h
   Reserved WORD 1:   0000h
   Reserved WORD 2:   0000h
   Reserved WORD 3:   0000h
   Reserved WORD 4:   0000h
   Reserved WORD 5:   0000h
   Reserved WORD 6:   0000h
   Reserved WORD 7:   0000h
   Reserved WORD 8:   0000h
   Reserved WORD 9:   0000h
   New Header Address :   000000A8h
   Memory Needed :   1680 B ( 1 KB )


Attachments:
masmtofasm.zip [648 Bytes]
Downloaded 363 times
Top
   
 Post subject: Re: Masm to Fasm
PostPosted: Sat Nov 10, 2012 7:49 pm 
Offline

Joined: Mon Sep 24, 2007 11:11 am
Posts: 2814
Не уверен, но регистр может иметь важное значение. Регистр имени файла. Еще можно попробовать ФАСМ более старой версии.


Top
   
 Post subject: Re: Masm to Fasm
PostPosted: Sun Nov 11, 2012 6:40 am 
Offline
KSoC/GSoC Student

Joined: Wed Jul 11, 2012 3:17 am
Posts: 224
SoUrcerer wrote:
Не уверен, но регистр может иметь важное значение. Регистр имени файла. Еще можно попробовать ФАСМ более старой версии.

Попробовал предложенный варианты, вот что выдало:
Code:
fasm doexe.asm
flat assembler  version 1.67.26  (1511235 kilobytes memory)
doexe.asm [10]:
file 'Hellos.kos':physofs,sz
error: error reading file.

мне кажется это просто косяк в структуре Hellos.kos, что построчно делает doexe.asm ??? В общих чертах понимаю, что вроде как режет РЕ заголовок, но как это делает не совсем понятно.


Top
   
 Post subject: Re: Masm to Fasm
PostPosted: Sun Nov 11, 2012 8:17 am 
Offline
Kernel Developer

Joined: Wed Mar 08, 2006 6:25 pm
Posts: 3952
Akyltist
А что нужно из Hellos.kos сделать ? Приложение Колибри, coff dll ?


Top
   
 Post subject: Re: Masm to Fasm
PostPosted: Sun Nov 11, 2012 9:14 am 
Offline
KSoC/GSoC Student

Joined: Wed Jul 11, 2012 3:17 am
Posts: 224
Приложение колибри!


Top
   
 Post subject: Re: Masm to Fasm
PostPosted: Sun Nov 11, 2012 10:33 am 
Offline
Kernel Developer

Joined: Wed Mar 08, 2006 6:25 pm
Posts: 3952
Не получится, в файле нет заголовка программы Колибри.

Советую не мучиться и использовать gnu ld и objcopy. Проверенный временем скрипт для mingw версии
Spoiler: Show
/*OUTPUT_FORMAT("binary")*/

ENTRY(__start)
SECTIONS
{
.text 0x000000:
{
LONG(0x554e454D);
LONG(0x32305445);
LONG(1);
LONG(__start);
LONG(___iend);
LONG(___memsize);
LONG(___stacktop);
LONG(___cmdline);
LONG(___pgmname); /* full path */
LONG(0); /*FIXME tls data */

*(.init)
*(.text)
*(SORT(.text$*))
*(.text.*)
*(.glue_7t)
*(.glue_7)
___CTOR_LIST__ = .; __CTOR_LIST__ = . ;
LONG (-1);*(.ctors); *(.ctor); *(SORT(.ctors.*)); LONG (0);
___DTOR_LIST__ = .; __DTOR_LIST__ = . ;
LONG (-1); *(.dtors); *(.dtor); *(SORT(.dtors.*)); LONG (0);
*(.fini)
/* ??? Why is .gcc_exc here? */
*(.gcc_exc)
PROVIDE (etext = .);
*(.gcc_except_table)
}

.rdata ALIGN(16) :
{
*(.rdata)
*(SORT(.rdata$*))
___RUNTIME_PSEUDO_RELOC_LIST__ = .;
__RUNTIME_PSEUDO_RELOC_LIST__ = .;
*(.rdata_runtime_pseudo_reloc)
___RUNTIME_PSEUDO_RELOC_LIST_END__ = .;
__RUNTIME_PSEUDO_RELOC_LIST_END__ = .;
}
.CRT ALIGN(16) :
{
___crt_xc_start__ = . ;
*(SORT(.CRT$XC*)) /* C initialization */
___crt_xc_end__ = . ;
___crt_xi_start__ = . ;
*(SORT(.CRT$XI*)) /* C++ initialization */
___crt_xi_end__ = . ;
___crt_xl_start__ = . ;
*(SORT(.CRT$XL*)) /* TLS callbacks */
/* ___crt_xl_end__ is defined in the TLS Directory support code */
___crt_xp_start__ = . ;
*(SORT(.CRT$XP*)) /* Pre-termination */
___crt_xp_end__ = . ;
___crt_xt_start__ = . ;
*(SORT(.CRT$XT*)) /* Termination */
___crt_xt_end__ = . ;
}

.data ALIGN(16) :
{
__data_start__ = . ;
*(.data)
*(.data2)
*(SORT(.data$*))
*(.jcr)
__CRT_MT = .;
LONG(0);
__data_end__ = . ;
*(.data_cygwin_nocopy)
}

.eh_frame ALIGN(16) :
{
*(.eh_frame)
___iend = . ;
}

bss ALIGN(16):
{
*(.bss)
*(COMMON)
. = ALIGN(16);
___cmdline = .; Командная строка
. = . + 256;
___pgmname = .; Путь к программе
. = . + 1024 + 16; Здесь надо установить необходимый размер стека.
___stacktop = .;
___memsize = . ;
}

/DISCARD/ :
{
*(.debug$S)
*(.debug$T)
*(.debug$F)
*(.drectve)
*(.note.GNU-stack)
*(.comment)
*(.debug_abbrev)
*(.debug_info)
*(.debug_line)
*(.debug_frame)
*(.debug_loc)
*(.debug_pubnames)
*(.debug_aranges)
*(.debug_ranges)
}
}


Top
   
PostPosted: Sun Nov 11, 2012 11:04 am 
Offline
KSoC/GSoC Student

Joined: Wed Jul 11, 2012 3:17 am
Posts: 224
Serge wrote:
Не получится, в файле нет заголовка программы Колибри.

Логично, он ведь MZ (PE)
В общем коряво но удалось таки запустить программку на Delphi от Борланда под Kolibry OS (собственно именно по этому второй вариант не подходит)
Размер выходного файла 688 байт, без сжатия.
Image
Собственно о пригодности для кодинга говорить не приходится. Но компилирует программку:
Spoiler: Show
Code:
unit demo;
interface
procedure main;
implementation

procedure main;
label xstart,xdraw,xstill,xkey,xbutton,xexit;
begin
asm

xstart:
    call    xdraw

xstill:
    mov     eax,10                        // функция 10 - ждать события
    int     $40                           // Прерывание
    cmp     eax,1                         // перерисовать окно ?
    je      xstart                        // если да - на метку xstart
    cmp     eax,2                         // нажата клавиша ?
    je      xkey                          // если да - на key
    cmp     eax,3                         // нажата кнопка ?
    je      xbutton                       // если да - на button
    jmp     xstill                        // если другое событие - в начало цикла

xkey:
    mov     eax,10                        // функция 2 - считать код символа (в ah) (тут в принципе не нужна)
    int     $40                           // Прерывание
    jmp     xstill                        // вернуться к началу цикла

xbutton:
    mov     eax,17                        // функция 17 - получить идентификатор нажатой кнопки
    int     $40                           // Прерывание
    cmp     ah, 1                         // если нажата кнопка с номером 1,
    jz      xexit                         // выходим
    jmp     xstill                        // вернуться к началу цикла
  xexit:
    mov     eax,-1                        // функция -1 - выход
    int     $40                           // Прерывание

  xdraw:
    mov     eax,12                        // функция 12: означает, что будет рисоваться окно
    mov     ebx,1                         // 1,начало рисования
    int     $40                           // Прерывание

    xor     eax,eax                       // Очищаем eax (mov eax,0) (Функция 0)
    mov     ebx,200 shl 16+317            // [координата по оси x]*65536 + [размер по оси x]
    add     ecx,200 shl 16+116            // Высота скина + [координата по y]*65536 + [размер по y]
    mov     edx,$33FFFFFF
    //or      edx,$34000000                 // Или окно со скином фиксированных размеров
    int     $40                           // Прерывание

    mov     eax,12                        // функция 12: означает, что будет рисоваться окно
    mov     ebx,2                         // 1,начало рисования
    int     $40                           // Прерывание
    ret
end;

end;

begin
  main;
end.


Сорцы и утилиты прилогаются 630kb. (всё делает build.bat)
http://akyltist.ucoz.org/asm/delphi.zip


Attachments:
delphi.zip [630.03 KiB]
Downloaded 311 times
Top
   
 Post subject: Re: Masm to Fasm
PostPosted: Sun Nov 11, 2012 11:21 am 
Offline

Joined: Mon Sep 24, 2007 11:11 am
Posts: 2814
А почему не FreePascal?


Top
   
 Post subject: Re: Masm to Fasm
PostPosted: Sun Nov 11, 2012 12:46 pm 
Offline
KSoC/GSoC Student

Joined: Wed Jul 11, 2012 3:17 am
Posts: 224
SoUrcerer wrote:
А почему не FreePascal?

1) компилятор от борланда лучше оптимизирует и меньше мусора даёт
2) вроде на делфи для колибри ещё ничего не создавали (может и ошибаюсь)
3) rlt на svn для fpc нерабочий, за отсутствием файла systemh.inc , собственно это поправить надо будет всего лишь

собственно все не принципиально, т.к. кодить на фасм все равно буду учиться кодить. а делфи это так, баловство.


Top
   
 Post subject: Re: Masm to Fasm
PostPosted: Sun Nov 11, 2012 7:00 pm 
Offline
User avatar

Joined: Tue May 08, 2007 12:44 am
Posts: 346
SoUrcerer wrote:
А почему не FreePascal?

FPC выдает файлы непотребного размера, а его исходнки имеют сишный стиль (include на include), что совершенно не способствует изучению.

Akyltist wrote:
2) вроде на делфи для колибри ещё ничего не создавали (может и ошибаюсь)

Я пробовал было потыкаться с Delphi, но понял, что Delphi 6 не умеет собирать программы с Image Base = 0, а obj-файлы у него -- уже не обычный OMF, а какой-то особый, который ни один сторонний линковщик не понимает.

Короче, я потыкался-потыкался и понял, что с наскока тут разобраться не получится, а на серьезные исследования времени нет. Да и никому это не надо было, поскольку второго паскалиста не было.

Akyltist, версия 10.0 -- это Delphi 3?

Akyltist wrote:
делфи это так, баловство.

На самом деле качественная поддержка ЯВУ -- очень хорошее дело, хоть и не совсем вписывается в концепцию ассемблерной ОС. Не все задачи можно решить на ассемблере.

_________________
Разработчик языка программирования Кантор


Top
   
 Post subject: Re: Masm to Fasm
PostPosted: Sun Nov 11, 2012 8:42 pm 
Offline

Joined: Fri Feb 18, 2011 3:13 pm
Posts: 201
Quote:
Не все задачи можно решить на ассемблере.

Не люблю флудить, но это высказывание так безоговорочно и так совершенно не верно, что жаждет ответа. ;)
Все задачи можно (и нужно) решить на ассемблере. Я это гарантирую. :D


Top
   
 Post subject: Re: Masm to Fasm
PostPosted: Mon Nov 12, 2012 12:58 am 
Можно да, нужно - не всегда. Колибри давно уже не концепция ассемблерной ОС. Маленькая и быстрая - да.


Top
   
Display posts from previous:  Sort by  
Post new topic  Reply to topic  [ 12 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