汇编语言与接口技术
时间限制:C/C++/Rust/Pascal 1秒,其他语言2秒
空间限制:C/C++/Rust/Pascal 256 M,其他语言512 M
64bit IO Format: %lld

题目描述

众所周知,汇编语言是一门十分重要并且有趣的课程,为了帮助大家提前了解汇编语言这门课程,以便给接下来的学习打好基础,Third决定让你手写一个汇编语言Debug程序,为了减小题目难度,出题人对该程序进行了适当的要求,以下是该程序的相关介绍

初始状态下,程序不会有任何动作,也不会有任何输出
该程序共有五种命令,分别用字母a,u,d,r,g表示
其中输入a,表示接下来开始向程序输入汇编指令(只是输入,并未执行,接下来要输入,如果前面有已输入的汇编指令,a命令之后输入的汇编指令不会覆盖,而是在末尾追加)
汇编指令形式见下方介绍
输入g,表示从第一条汇编指令开始,执行到第n条汇编指令,n的值在接下来一行给出(请注意,已经执行过的汇编指令不会再执行,详见样例解释)
输入u,表示查看程序中未执行的汇编指令
你需要按顺序输出当前所有未执行的指令,每条指令占一行,和输入形式相同
输入d,表示要查看某一个寄存器的内容,寄存器名称在接下来一行给出
你需要输出当前该寄存器的值
输入r,表示要修改某一个寄存器的内容,寄存器名称和要改为的值在接下来一行给出(空格隔开,并且注意,r指令是立即生效的)

对于u,d命令,你需要按要求输出,对于a,r,g命令,你只需要按要求操作即可

汇编指令形式以及寄存器介绍如下:
共有四个通用寄存器,分别是 ax bx cx dx,每个寄存器占16位,表示数据范围为 0 到 2^16-1

共有七种汇编指令,分别是 mov,add,sub,mul,div,push,pop,并且初始状态下程序中存在一个空栈,所有寄存器的值为0

对于 pop push mul div 汇编指令,按照以下格式给出
pop/push/mul/div reg/imd
reg表示为寄存器名称,imd表示一个整数
例如 pop ax 表示取出栈顶元素并赋值给ax(程序保证不会存在 pop 数字 这种情况,也不会在栈为空的情况下执行pop操作)
push 23 表示将元素23入栈
对于mul,div指令,其被除数(被乘数)默认放在ax中,运算结果默认放入ax中
例如
div 4 表示 ax = ax / 4
mul cx 表示 ax = ax * cx

对于 mov add sub 汇编指令,按照以下形式给出
mov/add/sub reg reg/imd
例如 mov ax 123 表示把123放入ax中
sub cx ax 表示 cx = cx - ax
add bx ax 表示 bx = bx + ax

你的程序需要输出正确的结果,快来编程实现它吧!

输入描述:

输入描述见题目,题目中所有整数均大于等于0

输出描述:

正确输出结果
示例1

输入

复制
a
mov ax 234
add cx ax
div 9
d
ax
g
2
d
ax
u
g
3
d
ax

输出

复制
0
234
div 9
26

说明

a表示开始输入汇编指令
mov ax 234     ax = 234
add cx ax     cx = cx + ax
div 9     ax = ax / 9
d
ax
查看目前ax的值,由于指令未执行,ax = 0,程序输出0
g
2
执行前两条汇编指令,此时 ax = 234 cx = 234
d
ax
查看目前ax的值,ax = 234,因此输出234
u
查看当前所有未执行汇编指令 第三条汇编指令未执行,输出div 9
g
3
执行到第三条汇编指令,此时前两条汇编指令已经执行过,因此只需要执行第三条汇编指令即可,此时 ax = ax / 9 = 26
d
ax
输出ax的值,ax = 26
示例2

输入

复制
r
ax 38
a
add ax 9
d
ax
g
1
d
ax

输出

复制
38
47

说明

r
ax 38     ax立即被修改为38
a
add ax 9     ax = ax + 9
d
ax 此时ax仍然为38
g
1
执行到第一条汇编指令
d
ax
此时ax为47

备注:

数据保证减法运算过程不会出现负数,但请注意运算过程溢出情况,例如某次运算得到结果为 10 1111 1111 0000 0000,则只保留低16位,同时在进行div运算时,结果下取整,即类似4 / 3 = 1