题目
思路
核心思想:先处理数字,再统一处理指令
处理数字:把所有的进制转化为10进制,把所有要去赋值的的寄存器转化为他代表的数字 ;这些数字统称为我们要取处理的中介值 ,还是转化为10进制最方便,就算我们最后要输出2进制,大不了用10进制再转化一下 。
处理指令:主要是对10进制数的低八位和高八位的运算,如何清空低八位,如何清空高八位?
AC代码
/*
样例输入
2
3
MOV AL,2
MOV BH,03H
ADD CL,BL
5
MOV AX,2
MOV BX,038H
MOV CX,11B
ADD AX,CX
ADD DL,CL
样例输出
5 3 0 0
5 48 3 3
*///2*3*3种情况
#include <bits/stdc++.h>
//还是转化为10进制最方便,就算我们最后要输出2进制,大不了用10进制再转化一下
//核心思想:把所有的进制转化为10进制,把所有要去赋值的的寄存器转化为他代表的数字 ;这些数字统称为我们要取处理的中介值
//细节总结来说,就是对低八位和高八位的处理和转化!
//转移的话,高八位如何清空?低八位如何清空?
//相加的话,因为是十进制,低八位随便加;高八位先保留低八位,在将高八位取出相加后再放回
//其中取出低八位就是取余,取出高八位就是整除,放回高八位就是运算后加之前保存好的低八位值
using namespace std;
int arr[4];//存放四个通用寄存器数据
int chartoint(char c)
{
if(c>='0'&&c<='9') return c-'0';
else return c-'A'+10;
}
int change(string str,int n)
{
int answer=0;
for(int i=0;i<str.size();i++)
{
answer*=n;
answer+=chartoint(str[i]);
}
return answer;
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
memset(arr,0,sizeof(arr));
int n;
scanf("%d",&n);
for(int i=0;i<n;i++)
{
char ord[60];
char buf[60];
scanf("%s%s",ord,buf);
string order=ord;
string value=buf;
int number=0;
if(value[3]>='0'&&value[3]<='9')//对要去赋值的人先进行处理
{
if(value[value.size()-1]=='H')
{
value.erase(value.end()-1,value.end());
number=change(value.substr(3),16);
}
else if(value[value.size()-1]=='B')
{
value.erase(value.end()-1,value.end());
number=change(value.substr(3),2);
}
else
{
number=atoi(value.substr(3).c_str());
}
}
else
{
int from=value[3]-'A';
//注意:题目说的是位数一致,因此可以出现AH,BL的情况,不要耍小聪明,又没有简化了运算!那不如老实点!
if(value[4]=='H') number=arr[from]/256;//取出高八位
if(value[4]=='L') number=arr[from]%256;//取出低八位
if(value[4]=='X') number=arr[from];
}
//下面对寄存器指令进行处理
int to=value[0]-'A';
if(order=="MOV")
{
if(value[1]=='H') arr[to]=arr[to]%256+number*256;//清空高八位相当于取出低八位 ,再操作
if(value[1]=='L') arr[to]=(arr[to]/256)*256+number;//通过第一步整除运算,使得低八位全是0了 ,再乘以原高位
if(value[1]=='X') arr[to]=number;
}
else if(order=="ADD")
{
if(value[1]=='H') arr[to]=arr[to]%256+(arr[to]/256+number)*256;//运算高八位,先取出低八位
if(value[1]=='L') arr[to]+=number;
if(value[1]=='X') arr[to]+=number;
}
}
printf("%d %d %d %d\n",arr[0],arr[1],arr[2],arr[3]);
}
return 0;
}