北邮oj---汇编-计算机二2014

题目

在这里插入图片描述
在这里插入图片描述

思路

核心思想:先处理数字,再统一处理指令
处理数字:把所有的进制转化为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;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值