1.使用 Pcode 模拟器运行 Pcode(下)
//文件名:pcode_1.asm
; int a, b;
var a, b
; a = 1 + 2;
push 1
push 2
add
pop a
; b = a * 2
push a
push 2
mul
pop b
; print("a = %d, b = %d", a, b);
push a
push b
print "a = %d, b = %d"
https://pandolia.net/tinyc/downloads/pysim.py
文件名:pysim.py
把两个文件放到终端的当前目录,在终端输入:python pysim.py pcode_1.asm
(在终端中新建文件等方法,请在主页查看TinyC1博客)
这就是模拟运行。
2.跳转命令
2.1 jmp 命令
jmp 命令为无条件跳转命令,直接跳转到标签处。
jmp Label
...
...
Label:
print "jump here"
2.2 jz 命令
jz 命令为条件跳转命令,先取出栈顶元素,判断其是否为 0 ,若为 0 ,则跳转至标签处,若不为 0 ,则转到下一条命令。
push 0
jz Label
print "top is not zero"
Label:
print "top is zero"
3.自定义函数命令
FUNC / ENDFUNC / arg / ret / $func_name 命令。
C语言:
...
sum(1, 2);
...
void sum(int a, int b) {
return a + b;
}
对应的Pcode:
push 1
push 2
$sum
FUNC @sum:
arg a, b
push a
push b
add
ret ~
ENDFUNC
FUN和ENDFUN用于函数的开始和结尾,FUN后的函数名用@开头,这是为了不与系统命令冲突,因为在C语言中有可能会定义一个名为add或push等和系统命令同名的函数。函数名后接一个冒号。
函数体内的第一个命令为arg,这是声明函数参数用的,但是此命令不能和FUNC写在同一行。如果函数没有参数,则此命令可以去掉。
函数调用的时候,在前面加上“$”就可以了,函数的参数通过栈传递,先 从左向右 将参数压入栈中,再调用函数。
最后用ret命令向调用者返回值。
ret ; 返回空值 “/”
ret 1 ; 返回常数
ret a ; 返回变量值
ret ~ ; 取出栈顶元素,返回其值。