Page 1 of 1

Masm to Fasm

Posted: Sat Nov 10, 2012 7:35 pm
by Akyltist
Есть obj, который был слинкован в выходной файл com (MZ, dos)
http://diamond.kolibrios.org/hll/hll.htm
Для допилки предлогается использовать некий doexe.asm следующего содержания:

Code: Select all

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ом выдаётся ошибка:
>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: Select all

/force:unresolved /fixed /subsystem:native /base:-0x10000 /align:0x10000 /merge:.data=.text /merge:.rdata=.text /nologo
данные о файле:
Spoiler:

Code: Select all

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 )

Re: Masm to Fasm

Posted: Sat Nov 10, 2012 7:49 pm
by SoUrcerer
Не уверен, но регистр может иметь важное значение. Регистр имени файла. Еще можно попробовать ФАСМ более старой версии.

Re: Masm to Fasm

Posted: Sun Nov 11, 2012 6:40 am
by Akyltist
SoUrcerer wrote:Не уверен, но регистр может иметь важное значение. Регистр имени файла. Еще можно попробовать ФАСМ более старой версии.
Попробовал предложенный варианты, вот что выдало:

Code: Select all

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 ??? В общих чертах понимаю, что вроде как режет РЕ заголовок, но как это делает не совсем понятно.

Re: Masm to Fasm

Posted: Sun Nov 11, 2012 8:17 am
by Serge
Akyltist
А что нужно из Hellos.kos сделать ? Приложение Колибри, coff dll ?

Re: Masm to Fasm

Posted: Sun Nov 11, 2012 9:14 am
by Akyltist
Приложение колибри!

Re: Masm to Fasm

Posted: Sun Nov 11, 2012 10:33 am
by Serge
Не получится, в файле нет заголовка программы Колибри.

Советую не мучиться и использовать gnu ld и objcopy. Проверенный временем скрипт для mingw версии
Spoiler:/*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)
}
}

Re: Delphi to Masm to Fasm

Posted: Sun Nov 11, 2012 11:04 am
by Akyltist
Serge wrote:Не получится, в файле нет заголовка программы Колибри.
Логично, он ведь MZ (PE)
В общем коряво но удалось таки запустить программку на Delphi от Борланда под Kolibry OS (собственно именно по этому второй вариант не подходит)
Размер выходного файла 688 байт, без сжатия.
Image
Собственно о пригодности для кодинга говорить не приходится. Но компилирует программку:
Spoiler:

Code: Select all

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

Re: Masm to Fasm

Posted: Sun Nov 11, 2012 11:21 am
by SoUrcerer
А почему не FreePascal?

Re: Masm to Fasm

Posted: Sun Nov 11, 2012 12:46 pm
by Akyltist
SoUrcerer wrote:А почему не FreePascal?
1) компилятор от борланда лучше оптимизирует и меньше мусора даёт
2) вроде на делфи для колибри ещё ничего не создавали (может и ошибаюсь)
3) rlt на svn для fpc нерабочий, за отсутствием файла systemh.inc , собственно это поправить надо будет всего лишь

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

Re: Masm to Fasm

Posted: Sun Nov 11, 2012 7:00 pm
by Freeman
SoUrcerer wrote:А почему не FreePascal?
FPC выдает файлы непотребного размера, а его исходнки имеют сишный стиль (include на include), что совершенно не способствует изучению.
Akyltist wrote:2) вроде на делфи для колибри ещё ничего не создавали (может и ошибаюсь)
Я пробовал было потыкаться с Delphi, но понял, что Delphi 6 не умеет собирать программы с Image Base = 0, а obj-файлы у него -- уже не обычный OMF, а какой-то особый, который ни один сторонний линковщик не понимает.

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

Akyltist, версия 10.0 -- это Delphi 3?
Akyltist wrote:делфи это так, баловство.
На самом деле качественная поддержка ЯВУ -- очень хорошее дело, хоть и не совсем вписывается в концепцию ассемблерной ОС. Не все задачи можно решить на ассемблере.

Re: Masm to Fasm

Posted: Sun Nov 11, 2012 8:42 pm
by johnfound
Не все задачи можно решить на ассемблере.
Не люблю флудить, но это высказывание так безоговорочно и так совершенно не верно, что жаждет ответа. ;)
Все задачи можно (и нужно) решить на ассемблере. Я это гарантирую. :D

Re: Masm to Fasm

Posted: Mon Nov 12, 2012 12:58 am
by Mario
Можно да, нужно - не всегда. Колибри давно уже не концепция ассемблерной ОС. Маленькая и быстрая - да.