#语言 #指令 #编译 #寄存器 #汇编 #编译器 #模拟器

应用 di ana c

为Diana编译语言提供的模拟器、编译器和解释器

1个不稳定版本

0.1.0 2024年8月20日

#57编程语言 中排名

Download history 72/week @ 2024-08-14

72 每月下载量

GPL-3.0 许可协议

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

如果有什么可以改进的地方,请告诉我

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将覆盖B
  • XNOR 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