19. 栈操作:后进先出
将数值保存到数据栈,再倒序取回。
打开本课 →
1. 预测与跟踪
运行试做程序前,预测输出,并跟踪最先执行的三条指令。按需要记录相关寄存器、标志或内存,再逐步执行进行比较。
LOAD 11
PUSH
LOAD 22
PUSH
POP
PRINT
POP
PRINT
HALT
加入输入队列: 无
初始化内存: 所有字节初始为零
2. 构建与检查
读取两个整数,将它们都压入数据栈,再倒序输出。使用 PUSH 和 POP,不要写死数值。
必需的指令类型: INPUT, PUSH, POP
起始程序
INPUT
PUSH
INPUT
PUSH
#
HALT
你的程序与笔记
3. 解释机器
为什么第二个输入先输出?
20. 调用子程序
复用代码,并返回 CALL 后面的指令。
打开本课 →
1. 预测与跟踪
运行试做程序前,预测输出,并跟踪最先执行的三条指令。按需要记录相关寄存器、标志或内存,再逐步执行进行比较。
LOAD 3
CALL square
PRINT
LOAD 4
CALL square
PRINT
HALT
square: MUL R0
RETURN
加入输入队列: 无
初始化内存: 所有字节初始为零
2. 构建与检查
读取两个整数。对每个数调用同一个平方子程序,按输入顺序输出两个平方。
必需的指令类型: INPUT, CALL, MUL, RETURN
起始程序
INPUT
CALL square
PRINT
INPUT
CALL square
PRINT
HALT
square:
#
RETURN
你的程序与笔记
3. 解释机器
为何调用同一代码两次会返回不同位置?
21. 保留调用者的状态
函数需要临时工作区时,采用保存与恢复约定。
打开本课 →
1. 预测与跟踪
运行试做程序前,预测输出,并跟踪最先执行的三条指令。按需要记录相关寄存器、标志或内存,再逐步执行进行比较。
LOAD 1 R1
LOOP 3
LOAD R1
CALL double
PRINT
LOAD R1
ADD 1
COPY R0 R1
RETURN
HALT
double: MUL 2
RETURN
加入输入队列: 无
初始化内存: 所有字节初始为零
2. 构建与检查
先把保存值读入 R1,再读取函数参数。调用一个暂用 R1 作工作区的辅助函数,返回参数 + 1。先输出结果,再输出保留的第一个值。使用 PUSH 和 POP 保留 R1。
必需的指令类型: INPUT, PUSH, POP, CALL, RETURN
起始程序
INPUT
COPY R0 R1
INPUT
CALL helper
PRINT
LOAD R1
PRINT
HALT
helper:
#
RETURN
你的程序与笔记
3. 解释机器
哪些保存状态属于调用者,而非函数结果?