Skip to content

fhlt/Compile

Repository files navigation

Compile

Sample语言编译器

包括Sample语言词法分析、语法分析、语义分析、中间代码生成、汇编代码生成 并将生成的汇编代码在简单虚拟机内运行。 抽象计算机的虚拟硬件配置如下所述:

1、内存为256×256个单元(64K),一个单元成为一个字,一个字有两个字节,地址为0——65535。单元可以存放置零,也可以存放数据。内存单元若存放数据,则数据范围为-32768~+32767或0~65535。一条机器指令占用一个单元,若不考虑数据占用的内存单元,程序最大长度为256×256。

2、虚拟机具有四个通用寄存器(2字节)、一个标志寄存器FlagReg和一个堆栈寄存器TopReg。4个通用寄存器分别标记为R0、R1、R2、R3,除可用于存放操作数和计算结果外,还可用于变址寻址。标志寄存器FlagReg用于保存cmp指令比较结果。堆栈寄存器TopReg用作系统栈顶指针。

寻址方式及寄存器功能说明

  • 内存单元若存放指令,高四位(第15、14、13、12位)为操作码、低12位(11——0)用于描述地址。第11、10位表征第一地址,第一地址只能是寄存器。 00:表示第一地址为R0; 01:表示第一地址为R1; 02:表示第一地址为R2; 03:表示第一地址为R3;

第9、8位表征第二地址的寻址方式,第二地址可以是内存直接地址、寄存器或变址寻址,还可以是0——255范围内的直接数。 00:表示直接地址寻址(M),第二操作数在内存低地址区域,地址范围为0255,70位表示内存地址。 01:表示寄存器寻址,3——0位的值可为0——3,分别表示R0——R3(实际上是用第一位和第0位)。7——4位或为0,或为1(实际上使用第5位)。0表示寄存器直接寻址(Ri), 第二操作数在寄存器Ri中;1表示寄存器间址寻址(@Ri),在寄存器Ri中存放的是第二操作数地址。 10:表示直接数访问立即寻址(D),7——0位表示直接数,直接数范围为0——255。 11:表示以C255为基址,以R3为位移的变址寻址(C[R3],0≤C≤FFh),7——0位表示C。C相当于段号或页号,R3相当于段内位移或页内位移。当R3用于变址寻址时,R3仅低8位有效,地址计算公式为:C256+(R3&0x00ff)。因二进制位有限,这里约定只有R3可以作为变址寄存器。

  • 堆栈寄存器TopReg(2字节)的初始值为0,系统堆栈从内存地址65535开始(0-1=65535)。执行call指令时,TopReg减1,系统将断点存入TopReg所指的内存单元,入口由call指令的第二地址确定;当执行ret指令时,从TopReg所指的单元获取断点,系统将TopReg增1。用户程序从地址0开始存放,CPU模拟器从该地址开始执行程序指令。在编制用户程序时,应注意和堆栈存储区域的冲突。

  • 输入输出指令无第二地址,由于第一地址只能是寄存器,故输入输出指令只能对寄存器进行操作。jmp、jmpneg、jmppos、jmpzero和call指令无第一地址。因断点在堆栈中,故ret指令无第一、第二地址。

  • 对于某些指令,某些二进制位可能不使用,在编写机器语言程序时,统一将其置位0。

机器语言指令描述

  • read(0h):从键盘读一个字到第一地址。等待用户从键盘输入一个十进制数据,数值范围为-32768~+32767。数据可以空格、Tab和回车结束。在输入过程中,可利用Backspace键删除已输入的字符,也可键入Esc键终止程序执行。若输入数据中存在非法字符,则虚拟裸机拒绝接受,要求用户重新输入。

  • write(1h):从第一地址写一个字到屏幕。

  • load(2h):从第二地址将字装入第一地址。

  • store(3h):将第一地址中的字存放到第二地址。

  • call(4h):转移到第二地址指定的内存单元,执行子程序,断点保留在系统堆栈中。

  • ret(5h):由系统堆栈获得断点,返回。

  • add(6h):将第一地址中的字加上第二地址中的字,结果保留在第一地址中。

  • sub(7h):将第一地址中的字减去第二地址中的字,结果保留在第一地址中。

  • mul(8h):将第一地址中的字乘以第二地址中的字,结果保留在第一地址中。

  • div(9h):将第一地址中的字除以第二地址中的字,结果保留在第一地址中。

  • cmp(Ah):将第一地址中的字和第二地址中的字比较,由系统置位标志寄存器FlagReg。 标志寄存器FlagReg=-1,表示第一地址中的字小于第二地址中的字。 标志寄存器FlagReg=1,表示第一地址中的字大于第二地址中的字。 标志寄存器FlagReg=0,表示第一地址中的字等于第二地址中的字。

  • jmp(Bh):无条件转移到第二地址指定的内存单元。

  • jmpneg(Ch):若标志寄存器FlagReg中的值为-1,转移到第二地址指定的内存单元。

  • jmppos(Dh):若标志寄存器FlagReg中的值为1,转移到第二地址指定的内存单元。

  • jmpzero(Eh):若标志寄存器FlagReg中的值为0,转移到第二地址指定的内存单元。

  • halt(Fh):终止程序执行。

About

Sample语言编译器

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages