返回入门教程首页 主页 | 开发工具 | 应用芯片 | 核心模块  
 
   
 

Win32Forth

构建和保存应用程序

FSAVE 、 TURNKEY 和 APPLICATION 都可以在您的磁盘上创建一个新的程序,但是所创建的程序类型是不同的。

FSAVE

在您的磁盘上创建一份新 Win32Forth 拷贝,它是您正在运行的 Forth 的复制品,在新程序运行的时候它将开始运行 Forth 。 FSAVE 后随要创建的程序名。 传递给 FSAVE 的名字必须与您正在运行的 Forth 程序同名。 FSAVE 的用法如下:

FSAVE newforth <enter>

在字典中可用空间的数量与执行 FSAVE 之前一样。如果您需要为后续的程序编译而改变可用应用字典或者系统字典空间的大小,则需要执行 meta 编译,方法是运行 META.BAT 。它将提示您输入新字典的大小。

TURNKEY

创建一个不能再运行 Forth 系统的程序,因为在程序保存的过程中,首部已经被清除了。运行您的程序的那个 Forth 定义的 CFA 必须传递给 TURNKEY 。 TURNKEY 能够把新程序映象的大小减少 200K 字节以上。 TURNKEY 之后的程序不能调试。 TURNKEY 后随要创建的程序的名字。 传递给 TURNKEY 的名字必须与您当前正在运行的 Forth 同名。 TURNKEY 的使用方法如下:

' do-myprogram TURNKEY newprogram <enter>

TURNKEY 之后的程序最少有 3000 字节,这是程序启动时应用字典的可用空间,系统字典的可用空间为 0 ,因为所有的系统字典都已经被清除了。

TURNKEY 执行下面定义的默认的初始化方式:

您在上面使用的应用程序字 'do-myprogram' 被 TURNKEY 作为 deferred 字 DEFAULT-APPLICATION, 所以在初始化之后将被执行。如果您需要执行比上面更多的始化动作,就需要复制 _DEFAULT-HELLO 的原始定义,改变它并装入 deferred 字 DEFAULT-HELLO 中。

APPLICATION

在您的磁盘上创建一个应用程序,它也包含完整的 Forth 系统。执行时需要程序初始化的 Forth 定义的 CFA 必须传递给 APPLICATION 。 APPLICATION 之后的程序仍然可以调试。 APPLICATION 后随要创建的程序名。传递给 APPLICATION 的名字必须与您当前运行的 Forth 字同名。 APPLICATION 的用法如下:

4000 4000 ' do-newapplication APPLICATION newapplication <enter>

这里第一个参数是您在程序启动时希望可用的应用字典空间字节数,第二个参数是在程序启动后您希望可用的系统字典的字节数 。所有这些值现在都被忽略。 APPLICATION 是更有效的 FSAVE 的同义词。

内部细节

IMAGEMAN.F 、 IMAGERES.F 和 IMAGEHDS.F 构造 Windows EXE 映象。

支持文档

PECOFF 文档格式可参见 http://www.microsoft.com/hwdev/hardware/PECOFF.asp . ( 注意:我们没有在这里包含这个文档是由于版权的限制,但这个文档是可以自由下载的 ) ,也可以参看“ Peering Inside the PE: A Tour of the Win32 Portable Executable File Format ” by Matt Pietrek 和 “ An In-Depth Look into the Win32 Portable Executable File Format ” , 作者是同一个人,都可以在 http://msdn.microsoft.com . 上得到。它们都是很小的文档。还有一个文档是“ What Goes On Inside Windows 2000: Solving the Mysteries of the Loader ” by Russ Osterlund, 也可以在 MSDN 上得到。

这些复杂的代码有 6 个主要的部分。

Field 定义,使用 字 FLDBASE 和 FLD

处理 .IMG 和 .EXE 文件的文件处理字

构造和写入 Section 的字

构造和写入 Import 库的字

构造和写入 Header 的字

生成资源 Resource( 写入,还不完全 )

举例

DEFER CONTYPE ' GUI IS CONTYPE

: std-IMG2EXE ( addr len -- ) \ compose STD image, addr/len is name

COMPACT \ compact header

BUILD \ exe name

CONTYPE EXE SUBSYSTEM \ normally GUI

STD-LOADPOINT LOADPOINT

0x100000 0xA000 STACKSIZE

0x100000 0x8000 HEAPSIZE

IMAGE-ENTRY ENTRYPOINT

s" .code" SECTION

STD-DATA STD-CODE or SECTIONTYPE

IMAGE-CODEPTR IMAGE-CACTUAL SECTIONDATA

IMAGE-CSIZE SECTIONSIZE

ENDSECTION

s" .app" SECTION

STD-DATA SECTIONTYPE

IMAGE-APPPTR IMAGE-AACTUAL SECTIONDATA

IMAGE-ASIZE SECTIONSIZE

ENDSECTION

IMAGE-SACTUAL IF \ might be a TURNKEY, so don't write section

s" .sys" SECTION

STD-DATA SECTIONTYPE

IMAGE-SYSPTR IMAGE-SACTUAL SECTIONDATA

IMAGE-SSIZE SECTIONSIZE

ENDSECTION

THEN

s" .idata" SECTION

S-INIT S-READ OR SECTIONTYPE

s" W32FCONSOLE.DLL" IMPLIB

0 s" c_initconsole" IMPORT

s" KERNEL32.DLL" IMPLIB

0 s" GetProcAddress" IMPORT

0 s" LoadLibraryA" IMPORT

ENDIMPORTS

SECTIONDATA

ENDSECTION

ENDBUILD

;

VIMAGE

IMAGEMAN 有它自己的词汇表 ( 因为名字可能冲突 ) ,所以使用一个分开的字典。

COMPACT

Standard file is built with 4096 (0x1000) file sections. COMPACT specifies 512 (0x200) file sections, which builds a smaller EXE file at possibly the expense of slightly longer load times.

s" name" BUILD

Identifies the new image name.

X T SUBSYSTEM

where X is CUI (DOS application) or GUI | GRAPHICAL (Windows), and T is EXE or DLL

n LOADPOINT

The loadpoint of the program (default is 0x400000). Must be aligned to a 64K boundary.

n ENTRYPOINT

The (relative) entrypoint address in the section declared CODE

N M STACKSIZE

The reserved and committed stack size. Default is 1Mb, 4K

N M HEAPSIZE

The reserved and committed heap size. Default is 1Mb, 4K

s" name" SECTION

The name of the section, case sensitive and 8 chars max.

n SECTIONTYPE   

Section characterisics; default is none. Can appear multiple times for one section

S-EXECUTE

section contains executable code

S-READ

section can be read

S-WRITE

section can be written

S-INIT

section contains initialised data

STD-CODE

is S-INIT S-CODE S-EXECUTE OR OR

STD-DATA

S-INIT S-READ S-WRITE OR OR

N M SECTIONDATA

is address and length of the section

N SECTIONRVA

Not normally used, but can set the (relative) address of the section

N SECTIONSIZE

Size of section. Must be equal to or longer than the sectiondata. When loaded, the section will zeroed and padded out to this length with zeros. Optional, set to size of the section data

ENDSECTION

Required to end a section

s" implib" IMPLIB

Import library name

N s" name" IMPORT

Import the procedure <-name-> with a hint of N. N can be zero, but the correct hint will speed (marginally) load time.

ENDIMPORTS ( -- N M )

Required to end the imports sections, follow with SECTIONDATA

ENDBUILD

Creates the image from the information given above.

其它的字           

s" name" IMAGE-COPY

Copies the current executable for subsequent saving. Sets the following words as a side effect;      

IMAGE-PTR

pointer to the loaded image

IMAGE-CODEPTR

pointer to the code section

IMAGE-CACTUAL

real size of code section

IMAGE-CSIZE

virtual size of code section

IMAGE-APPPTR
IMAGE-AACTUAL
IMAGE-ASIZE

ditto APP values

IMAGE-SYSPTR
IMAGE-SACTUAL
IMAGE-SSIZE

ditto SYS values

IMAGE-ENTRY

relative offset of entry point

 

要求和限制

关键字的顺序非常重要。下面这些字必须按下面的顺序出现

•  BUILD SECTION ENDBUILD

•  SECTION / ENDSECTION 必须关闭 SECTIONDATA 和可选的 SECTIONTYPE 以及 SECTIONRVA 关键字

•  SECTION / ENDSECTION 必须 关闭 IMPLIB 和 IMPORT

•  ENDIMPORTS 必须终止 IMPLIB 和 IMPORT ,必须在 SECTIONDATA 之后

其它的关键字可以按任何顺序在 BUILD 和 ENDBUILD 之间的任何地方出现。

Sections 总是在 4K 存储器边界对齐,每个紧 随在下一片存储器中。

入口点从最后一个 section 的开头计算,并标记为 S-CODE 或 S-EXECUTE ,没有资源 section (section .rsrc) ,准备加入,不过其格式并没有清楚的文档。

当前忽略 DLL 类型

当心!名字冲突。如果您没有编译代码,请仅将 VIMAGE 作为一个字汇表使用。

默认

BUILD

GUI EXE SUBSYSTEM

0x400000 LOADPOINT

0x100000 0x1000 STACKSIZE

0x100000 0x1000 HEAPSIZE

n SECTIONRVA

n SECTIONSIZE

 

 
   

(C) ForthChina.com 版权所有 2004-2010
Email:forthchina@163.com