TinyC编译器3—中间代码Pcode(下)

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 ~       ; 取出栈顶元素,返回其值。
  • 14
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值