北郵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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章