Skip to content

Latest commit

 

History

History
197 lines (135 loc) · 6.13 KB

README.md

File metadata and controls

197 lines (135 loc) · 6.13 KB
  • asm | acc | neum | hw | instr | binary | trap | mem | pstr | prob5 | spi

asm编程设计

  • 指令本身不区分大小写,但是符号声明除外。例如 ld #1 等于 LD #1

  • 第一个函数是_start,即输入.

  • 指令按顺序执行。指令操作释义如下:

    • @ 参数 -- 加载。它的作用是将一个数据从内存中加载到寄存器中

    • ! 参数 -- 卸载。将值从寄存器卸载到内存

    • + 参数 -- 将指定的值添加到寄存器中

    • - 参数 -- 从寄存器中去掉指定的值

    • * 参数 -- 将寄存器乘以指定的值

    • / 参数 -- 将寄存器除以指定的

    • if 参数 -- 将寄存器值与指定值进行比较并设置状态值

    • do -- 循环的起始。

    • loop -- 循环的结束。

    • leave -- 退出循环。

    • ; -- 程序结束,退出程序

    • . "字符串 -- 输出字符串内容

  • 支持符号编码。符号以数字形式存储在内存中:


' ':0, 'a':1, 'b':2, 'c':3, 'd':4, 'e':5, 'f':6, 'g':7, 'h':8, 'i':9, 'j':10,
'k':11, 'l':12, 'm':13, 'n':14, 'o':15, 'p':16, 'q':17, 'r':18, 's':19, 't':20,
'u':21,'v':22, 'w':23, 'x':24, 'y':25, 'z':26, 'A':27, 'B':28, 'C':29, 'D':30, 
'E':31, 'F':32,'G':33, 'H':34, 'I':35, 'J':36, 'K':37, 'L':38, 'M':39, 'N':40, 
'O':41, 'P':42, 'Q':43,'R':44, 'S':45, 'T':46, 'U':47, 'V':48, 'W':49, 'X':50, 
'Y':51, 'Z':52, '':53, '0':54,'1':55, '2':56, '3':57, '4':58, '5':59, '6':60, 
'7':61, '8':62, '9':63, '!':64, ',':65,'.':66, '-':67, '*':68, '?':69, '+':70, 
'/':71, '@':72, '\0':73, '\n':74

  • 控件标签:
  • 'variable var_name var_value' - 表示声明变量并赋值。 如variable limit 4000000标识声明变量limit并赋值4000000
  • 代码&执行:

    • 代码定义如下: :执行代码以 ": _start"开始 以 ";"结束

    函数与标签的不同之处在于标签以"."开头。当我们想跳转到某个标签时,我们需要通过以下方式使用: jmp .label_name

  • 地址寻找(参数格式):

    • 纯数字:如果参数数字,则将其视为地址。也就是说,ld 29 - 表示将第30个单元格的值加载到累加器中
    • 只是一个值:如果参数有一个“#”并且后跟一个数字,则该参数被视为一个值。即ld #29就是将29加载到电池中
    • 变量:如果参数是在数据部分中定义的变量,则它将地址视为变量。
    • 符号:根据符号表编码成数字。例如,ld 'A' = ld #27
  • 状态值定义:

    • N = 1
    • Z = 2
    • V = 4
    • C = 8
  • 变量定义:

    • 定义如下:“<Name: Value>'。 该值可以是数字或字符串。 如果它是一个字符串,它将具有与字符数一样多的单元格。

内存

命令和数据存储器。

内存是由单元格组成的列表。单元格由Cell类实现。

  • 或一个数字 - 即数据。机器位 - 32位。一个单元格仅保存一个字符。根据 ISA 中定义的字符表,该符号也采用数字形式
  • 或者表示为类的指令 - Instruction。在类对象中,instruction 存储指令类型和参数

堆栈设计。

最后一个 1/4 部分是 IO 端口,它仅用于 IO。

指挥系统

  • 机器位 -- 32位。

  • 寄存器:

    • IP计数器
      • 交流-
        • 寄存器
        • 用堆栈借用
        • 保留任何函数的结果
        • 保存任何数学运算的结果
      • BR - 作为临时存储数据的缓冲区。例如,它用于将函数的结果存储在 ret 指令中。
      • AR 是它们交互的单元的指定地址,即寄存器。还表示?堆栈的“地址”。
      • PS - 条件码。
      • SP - 堆栈指针。

指令编码

机器码以CSV格式存储

整个程序分为4个部分。以指定标签区分,

  • 第一部分指令,FUNCTION标签之前为指令集。指令内容每行以" "分割为三列:
    • 第一列是指令索引
    • 第二列是指令
    • 第三列参数(如果有)
  • 第二部分是函数,FUNCTION之后、LABEL之前的内容是执行的函数。函数内容功能每行以":"分割为两列:
    • 第一列是名称
    • 第二列是指令索引
  • 第三部分是标签,LABEL之后、VARIABLE之前的内容是标签。标签内容每行以":"分割为三列:
    • 第一列是函数的名称
    • 第二列是标签的名称
    • 第三列是指令索引
  • 第四部分是变量,VARIABLE标签之后的内容为变量。变量以":"分割为三列:
    • 第一列是变量的名称
    • 第二列是值
    • 第三列是行的长度(如果有)

例:

0 DO 
1 @ INPUT 
2 IF @=-1 
3 LEAVE 
4 . OUTPUT 
5 LOOP 
6 ; 
FUNCTION
_START:0
LABEL
_START:DO:1
_START:LEAVE:6
_START:LOOP:1
VARIABLE

翻译器

执行命令: translator.py <input_file> <target_file>"

支持基本的错误判定:

  • 不能定义两个同名的变量
  • 不要使用“Input”或“Output”作为变量名称
  • 检查用户是否正确定义了参数。例如,您可以为没有参数的指令定义参数。
  • 检查变量的格式。
  • 错误信息将指示错误的位置。

翻译器功能:

  1. 检查部分标签。数据
  2. 读取变量并将它们保存到
  3. 检查部分标签
  4. 读取代码
    • 如果字符串是标签,则保留其位置,包括其在斯拉夫语label_in_fun中的功能和命名。
    • 如果字符串是一个函数,则它在function_point中保留其位置和命名
    • 如果字符串是指令,则将其位置、类型和参数存储在结果字符串中
  5. 当它读取一行时,它会自动忽略注释
  6. 在对 1-4 进行任何处理之前,指令将转换为大写。
  7. 根据结果,变量,label_in_fun和function_point生成输出文件。

计算机模拟

执行命令: machine.py <target_file> <inputfile>".

处理器:

  • 对同一对象的操作不是在一次刻度中执行的。
  • 在同一周期内对不同对象执行操作。

算法实现:

  • problem5: /asm/problem2.fth
  • cat : /asm/cat.fth
  • hello : /asm/hello.fth

手动测试:

  • 机器测试:test_machine.py
  • 翻译测试:test_translator.py

自动测试:

GIT地址:https://github.com/TeacherChen1990/prob2 提交代码(master分支)之后,会自动触发Python application检测,自动执行执行test_machine.py、test_translator.py,检测通过