1个不稳定版本
新 0.1.0 | 2024年8月20日 |
---|
#57 在 编程语言 中排名
72 每月下载量
73KB
1.5K SLoC
Diana编译语言参考手册
为Diana-II 6位计算机编写的简单编译语言。该语言编写是为了帮助开发,提供所有基本指令,这些指令在架构上不是原生支持的。
以下文档是为已经熟悉其他类似汇编语言的程序员编写的。
致谢:以下文档强烈受到Solaris x86汇编语言参考手册的启发。
安装和帮助
从crates.io: (推荐)
cargo install dianac
从源代码
git clone https://github.com/5-pebbles/dianac.git
cd dianac
cargo install --path .
基本帮助
~ ❯ dianac --help
An emulator, compiler, and interpreter for the Diana Compiled Language
Usage: dianac <COMMAND>
Commands:
interpret Interprate a program directly from source
emulate Emulate the execution from a binary
compile Compile a binary without execution
help Print this message or the help of the given subcommand(s)
Options:
-h, --help Print help
-V, --version Print version
如果有什么可以改进的地方,请告诉我
问题:
GitHub.邮箱:
[email protected].
Diana II规范
Diana II是一种6位最小指令集计算机,设计时以使用NOR
作为通用逻辑门。
-
字节大小: 6位。
-
端序: 小端序。
-
地址大小: 12位(两个6位操作数,第一个是高位)。
-
独特指令 5.
指令
二进制 | 指令 | 描述 |
---|---|---|
00 | NOR [val] [val] |
对第一个操作数执行取反或操作。 |
01 | PC [val] [val] |
将程序计数器设置为地址 [val, val] 。 |
10 | LOAD [val] [val] |
从地址 [val, val] 加载数据到 C 。 |
11 | STORE [val] [val] |
将 C 中的值存储在地址 [val, val] 。 |
布局
每条指令都是6位,格式如下:[XX][YY][ZZ]
- X: 2位指令标识符。
- Y: 2位第一个操作数标识符。
- Z: 2位第二个操作数标识符。
NOR的第一个操作数不能是立即数,因此允许另外四个指令。
二进制 | 指令 | 描述 |
---|---|---|
001100 | --- |
预留供将来使用。 |
001101 | --- |
预留供将来使用。 |
001110 | --- |
预留供将来使用。 |
001111 | HLT |
使CPU暂停,直到下一个中断。 |
[!注意] 指令和操作数是大写,因为我的6位字符编码不支持小写...
操作数
二进制 | 名称 | 描述 |
---|---|---|
00 | A | 通用寄存器。 |
01 | B | 通用寄存器。 |
10 | C | 通用寄存器。 |
11 | - | 读取下一条指令作为值。 |
内存布局
总共有4096个唯一的地址,每个地址包含6位。
地址 | 描述 |
---|---|
0x000..=0xEFF |
通用RAM。 |
0xEFF..=0xF3D |
预留供将来使用。 |
0xF3E..=0xF3F |
程序计数器(PC)(ROM)。 |
0xF80..=0xFBF |
左旋转查找表(ROM)。 |
0xFC0..=0xFFF |
右旋转查找表(ROM)。 |
词法约定
语句
一个程序由一个或多个包含语句的文件组成。一个语句由通过空白字符分隔的标记组成,并以换行符终止。
注释
注释可以位于其自身的行中,也可以附加到语句上。注释由一个井号(#)后跟注释文本和终止换行符组成。
标签
标签可以放置在语句的开始之前。在编译过程中,标签被分配给下一个语句的地址,并可以作为关键字操作数使用。标签由LAB
关键字后跟一个标识符组成,标签的作用域是全局的,并出现在文件符号表中。
标记
有6类标记
- 标识符
- 关键字
- 寄存器
- 数值常数
- 字符常数
- 运算符
标识符
标识符是由字母、下划线和数字组成的任意长序列。第一个字符必须是字母或下划线。大小写字符等效。
关键字
关键字,如指令助记符和指令,是保留的,不能用作标识符。有关关键字列表,请参阅关键字表。
寄存器
Diana-II架构提供了三个寄存器[A, B, C],这些是保留的,不能用作标识符。大小写字符等效。
数值常数
Diana-II架构中的数字是无符号的6位整数。这些可以用几种基数表示
- 十进制。十进制整数由一个或多个十进制数字(0–9)组成。
- 二进制。二进制整数以“0b”或“0B”开头,后跟零个或多个二进制数字(0,1)。
- 十六进制。十六进制整数以“0x”或“0X”开头,后跟一个或多个十六进制数字(0–9,A–F)。十六进制数字可以是大写或小写。
字符常数
字符常数由一个支持的字符用单引号(')括起来。字符将被转换为以下支持的字符表中基于的数值表示。
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | A | B | C | D | E | F | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | = | - | + | * | / | ^ |
1x | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P |
2x | Q | R | S | T | U | V | W | X | Y | Z | 空格 | . | , | ' | " | ` |
3x | # | ! | & | ? | ; | : | $ | % | | | > | < | [ | ] | ( | ) | \ |
如果使用小写字母,它将被转换为对应的大写表示。
运算符
编译器支持以下运算符在表达式中使用。运算符没有指定的优先级。表达式可以用括号()分组以建立优先级。
! | 逻辑非 |
& | 逻辑与 |
| | 逻辑或 |
+ | 加法 |
- | 减法 |
* | 乘法 |
/ | 除法 |
>> | 右旋 |
<< | 左旋 |
除逻辑非外的所有运算符都需要两个值和括号()
(5 + 9 + 3)
= 17!0b111110
= 0b000001(2 + (2 * 5))
= 12(2 + 2 * 5)
= 20
关键字、操作数和寻址
关键字表示一个指令、一系列指令或一个指令。操作数是关键字操作的实体。地址是指定数据在内存中的位置。
操作数
关键字可以有零到三个操作数,它们由空白字符分隔。对于具有源和目的的指令,此语言使用Intel的表示法:目的(左手边)然后是源(右手边)。
有四种类型的操作数
- 立即数。一个6位常量表达式,其值是内联值。
- 寄存器。 Diana-II 架构提供的三个6位通用寄存器之一。
- 任选。立即数或寄存器操作数。
- 地址。一个单一的12位标识符或两个由空白字符分隔的6位任选操作数。
- 条件。包含一对6位操作数,由空白字符分隔,以及以下比较运算符之一的一对方括号[]
== 相等 != 不相等 > 大于 >= 大于等于 < 小于 <= 小于等于
寻址
Diana-II 架构使用12位寻址。标签可以通过附加冒号后跟1或0分为两个6位立即数。如果关键字需要地址,它可以提供为两个6位值或一个单一的12位标识符。
LOD MAIN
=LOD MAIN:0 MAIN:1
.
副作用
任何副作用都将列在关键字的备注中,请仔细阅读每个备注。如果一个关键字覆盖了一个无关的寄存器,它将选择反向字母顺序中第一个可用的,例如。
XNOR C 0x27
将覆盖BXNOR A 0x27
将覆盖C
关键字表
操作数将以方括号[ ]的形式显示,并使用以下缩写
[reg]
= 寄存器[imm]
= 立即数[eth]
= 任选[add]
= 地址[con]
= 条件
逻辑关键字
关键字 | 描述 | 备注 |
---|---|---|
NOT [reg] |
位运算逻辑非 | - |
AND [reg] [eth] |
位运算逻辑与 | 第二个寄存器将被反转;其值可以使用NOT 操作恢复。如果使用立即数,则在编译时反转。 |
NAND [reg] [eth] |
位运算逻辑NAND | 第二个寄存器将被反转;其值可以使用NOT 操作恢复。如果使用立即数,则在编译时反转。 |
OR [reg] [eth] |
位运算逻辑或 | - |
NOR [reg] [eth] |
位运算逻辑NOR | - |
XOR [reg] [eth] |
位运算逻辑XOR | 将覆盖额外的寄存器;即使使用立即数也是如此。 |
NXOR [reg] [eth] |
位逻辑非异或(NXOR) | 将覆盖额外的寄存器;即使使用立即数也是如此。 |
移位和旋转关键字
这些关键字简单地从右旋转和左旋转的对应地址加载查找表。
关键字 | 描述 | 备注 |
---|---|---|
ROL [eth] |
左旋转并将值存储在 C 中 | - |
ROR [eth] |
右旋转并将值存储在 C 中 | - |
SHL [eth] |
左移并将值存储在 C 中 | - |
SHR [eth] |
右移并将值存储在 C 中 | - |
算术关键字
关键字 | 描述 | 备注 |
---|---|---|
ADD [reg] [eth] |
加法 | 所有寄存器都将被破坏;即使使用立即值,这也是正确的。 |
SUB [reg] [eth] |
减法 | 所有寄存器都将被破坏;即使使用立即值,这也是正确的。 |
内存关键字
关键字 | 描述 | 备注 |
---|---|---|
SET [imm] |
编译为原始值 [imm] |
- |
MOV [reg] [eth] |
从第二个操作数复制到第一个 | - |
LOD [加法] |
从 [add] 加载数据到 C |
- |
STO [加法] |
在 [add] 中存储 C 的数据 |
- |
跳转关键字
关键字 | 描述 | 备注 |
---|---|---|
PC [加法] |
设置程序计数器到 [add] |
- |
LAB [idn] |
定义一个指向下一个语句的标签 | - |
杂项关键字
关键字 | 描述 | 备注 |
---|---|---|
HLT |
使CPU暂停,直到下一个中断 | - |
依赖关系
~1–12MB
~79K SLoC