跳转到内容

Oberon/V5

来自维基教科书,开放世界中的开放书籍

有关在 FPGA 机器上安装,请参阅 N. WirthP. Reed 的文档。Oberon RISC 模拟器在当代 MS Windows、类 Unix 系统和 macOS 上运行。请参阅您感兴趣的模拟器作者的说明。有关 Android 的附加说明可用。在某些机器上,块随机存取内存(BRAM)的大小可能会限制开发目标。

V2 中的文本 相比。

Text 类型
类型 TextDesc 的字段 字段类型 笔记
Texts.Text,指向 Texts.TextDesc 的指针 len INTEGER[1] 文本长度,以字节为单位。
changed BOOLEAN 标志 指示修订版。
notify Texts.Notifier 指向 方法 的指针,用于通知对状态更改感兴趣的客户端。
trailer Texts.Piece 指向 哨兵节点 的指针,位于 列表 的片段中。
pce Texts.Piece 最后找到的片段。
org INTEGER 最后找到片段中第一个字符的偏移量,范围为 [0,len)。
Texts.Piece
类型 PieceDesc 的字段 字段类型 笔记
Texts.Piece,指向 Texts.PieceDesc 的指针 f Files.File 指针,指向文件。
off INTEGER 整数 偏移量,表示文本中片段的第一个字符。
len INTEGER 片段中的字节数。
fnt Fonts.Font 指向字体的指针。
col INTEGER  
voff INTEGER 字符的垂直偏移量,以像素为单位。
prev Texts.Piece 指向文本的先前片段的指针。
next Texts.Piece 指向文本的下一个片段的指针。

模块的编译会生成 分支,其中 地址 相对于模块的基地址。修补是将这些地址转换为绝对地址的过程。扩展 Oberon 在符号文件中取消了修补;对象文件中的修补列表中则没有。

请参阅 Project Oberon(2013 年新版)。修补由模块加载器 Modules.Load 执行,如第 6.1 节所述。链接和加载,第 79 页。另请参阅 邮件列表,地址为 2019-11-182020-12-16..18

在“6.3. 链接加载器”部分,有一个以“在文件的最末尾,读取三个名为 fixorgP、fixorgD 和 fixorgT 的整数。”开头的段落。
a) 在代码生成器模块 ORG 中搜索“fixorgP”,您将在 ORG.Call 中找到此行。

Put3(BL, 7, ((-x.r) * 100H + x.a) * 1000H + pc-fixorgP); fixorgP := pc-1

此外,此行位于 ORG.Put3 中。

code[pc] := ((op+12) * 10H + cond) * 1000000H + (off MOD 1000000H); INC(pc)

b) 对于过程 x,项 x 中的 -x.r 是模块编号 mno,而 x.a 是过程的条目编号 pno。

c) 从 ORG.Call 和 ORG.Put3 推断出,

the 4 bits [20..23]  = -x.r (= the module number, mno)
the 8 bits [12..19]  =  x.a (= the entry number for the procedure, pno) 
the 12 bits [0..11]  =  pc-fixorgP (= the displacement between 2 instructions in the fixup chain)

通过步骤 (a-c),编译器生成此指令前驱。

| BL (4) | cond (4) | mno (4) | pno (8) | pc-fixorgP (12) |

前驱没有格式化为指令,但长度与一个指令相同,即 32 位。

d) (c) 中的行对应于 Modules.Load 中的这些行。

mno := inst DIV 100000H MOD 10H;
pno := inst DIV 1000H MOD 100H;
disp := inst MOD 1000H;

Modules.Load 将前驱转换为 RISC-Arch.pdf 第 3 节的第二种 (u=1) F3 格式。

| BL (4) | cond (4) | offset relative to PC (24) |
已发布的 V5 变体 笔记
Files.Mod    
  Out.Mod 允许使用标志变量延迟执行 Append。
  Out1.Mod 允许使用过程变量延迟执行 Append。
Texts.Mod    
  1. 在 V5 中,唯一整数类型是 INTEGER。cf. V2 中的 LONGINT。
华夏公益教科书