跳到内容

从头开始编写编程语言/简单表达式

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

表达式

[编辑 | 编辑源代码]

表达式包括所有需要使用 ALU 的命令形式,但不包括逻辑函数。它们还包括函数调用,但这些将在后面讨论。在本章中,我们处理简单表达式的转换,即不包括括号、函数调用或任何类型的引用的表达式。

基本运算

[编辑 | 编辑源代码]

我们都知道四则运算,即 +,-,*,/。它们组合起来形成表达式,例如:a*b+c

然而,汇编语言不识别这样的表达式,它只识别二进制命令,例如:add a,b
mul b,c

此外,它不识别优先级。它只是按顺序执行命令。因此,我们必须自己排序这些命令。

此外,结果始终存储在称为寄存器的特定位置。更确切地说,它存储在 Eax 寄存器中。

对于整数的每个操作,都有以下指令。对于字符操作,将 eax 替换为 al

赋值

Mov [operand1],[operand2]

加法

add [operand1],[operand2]

减法

sub [operand1],[operand2]

乘法

Mov Eax,[operand1]
Imul [operand2]

除法

Cdq (sign extension, mandatory but only once in the program)
Idiv [operand1],[operand2]

模数

Cdq
Idiv [operand1],[operand2]
Mov Eax,edx

增量

Inc [operand]

以下是浮点数的对应指令。

赋值

Fld [operand2]
Fstp [operand1]

加法

Fld [operand1]
Fadd [operand2]

减法

Fld [operand1]
Fsub [operand2]

乘法

Fld [operand1]
Fmul [operand2]

除法

Fld [operand1]
Fdiv [operand2]

浮点变量没有模数。

转换算法

[编辑 | 编辑源代码]

第 1 部分 乘法、除法、模数

1. While character not ; or *,/,%.
   increment index
 1.1 If character be ; goto part2
 1.2 get operand before operator and after 
 1.3 depending on operator use the appropriate instructions as given above.
 1.4 remove the operands and operator from the line 
 1.5 if next operator be add or sub replace by var[NUM] where NUM is an int and incremented. Write var[NUM] as a variable of type of expression. Assign eax to var[NUM].
 1.6 else replace by eax.
2. Repeat step 1

对于字符,将 eax 替换为 al,对于浮点数,将 st(1) 赋值给 var[NUM]。

第 2 部分 加法、减法

1. While character not ; or + or -
   increment index
 1.1 If character be ; end process
 1.2 get operand before and after the operator
 1.3 depending on operator use the appropriate instruction as given above
 (Follow steps 1.4 to 1.6)
2. Repeat step 1
华夏公益教科书