ACM程序设计选修课——1076汇编语言(重定向+模拟)

1076: 汇编语言

Time Limit: 1 Sec   Memory Limit: 128 MB
Submit: 34   Solved: 4
[ Submit][ Status][ Web Board]

Description

Input

Output

Sample Input

2
3
MOV AX,2
MOV BX,3
ADD AX,BX
6
MOV AX,2
MOV BX,030H
MOV CX,11B
ADD AX,CX
ADD DL,CL
MUL DL

Sample Output

5 3 0 0
15 48 3 3

HINT

注意在 MOV 和 ADD 操作中,指令的两个操作对象的位数应当是一致的,即不会出现如 MOV AX,BL



或 ADD AL,0100H 这样错误的指令。



在初始状态下,四个通用寄存器中的数值均为 0。给定一系列的汇编指令,请输出按顺序执行完所



有指令后四个通用寄存器中的数值。

这题真的没啥好说。很无语....从省赛选拔赛开始到现在一直WA,直到找了老师要了后台数据(对自己真的无语了),发现两个问题:

1、给一个变量赋值时会先计算,再赋值,比如我原来代码的long long val = 655535 * 65535,首先计算右边的值,由于还没有赋值给val,因此范围仍然在int内,四十亿的数据直接把int给炸飞了,将溢出之后的结果-131071赋给了val,因此原本的输出出现了负数。

2、低八位和高八位的寄存器可以互相作用,比如将AL加或赋值给CH,之前的判断中以为只能是低位与低位操作,高位与高位操作。

大小号总计WA十余次(递归懵比.jpg,本垃圾错了.jpg)。
爆炸代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<queue>
#include<set>
#include<map>
#include<sstream>
#include<algorithm>
#include<cmath>
#include<cstdlib>
using namespace std;
typedef long long LL;
struct poi
{
	LL di;
	LL gao;
};
inline void change(string &s)
{
	for (LL i=0; i<(LL)s.size(); i++)
	{
		if(s[i]==',')
		{
			s[i]=' ';
		}	
	}
}
inline LL sto(string s)
{
	LL sum=0;
	LL i;
	LL len=(LL)s.size();
	if(s[len-1]=='H'&&s[0]=='0') 
	{
		for (i=0; i<len-1; i++)
		{
			if(s[i]>='A'&&s[i]<='Z')
				sum=sum*16+(s[i]-'A'+10);
			else if(s[i]>='a'&&s[i]<='z')
				sum=sum*16+(s[i]-'a'+10);
			else
				sum=sum*16+(s[i]-'0');
		}
	}
	else if(s[len-1]=='B')
	{
		for (i=0; i<len-1; i++)
			sum=sum*2+(s[i]-'0');			
	}
	else
	{
		for (i=0; i<len; i++)
		{
			sum=sum*10+(s[i]-'0');
		}	
	}
	return sum;
}
int main (void)
{
	ios::sync_with_stdio(false);
	LL t,n,i,j;
	string op,one,two,s;
	char c;
	cin>>t;
	while (t--)
	{
		cin>>n;
		map<LL,poi>list;
		list[0].di=list[0].gao=0;
		list[1].di=list[1].gao=0;
		list[2].di=list[2].gao=0;
		list[3].di=list[3].gao=0;		
		cin.get();
		for (i=0; i<n; i++)
		{
			getline(cin,s);
			change(s);
			istringstream sin(s);
			sin>>op>>one;
			if(op=="MOV")
			{
				sin>>two;
				if(isdigit(two[0])) 
				{
					LL val=sto(two);
					if(one[1]=='H')					
						list[one[0]-'A'].gao=val;
					else if(one[1]=='L')
						list[one[0]-'A'].di=val;
					else
					{
						list[one[0]-'A'].di=val%256;
						list[one[0]-'A'].gao=val/256;					
					}
				}
				else 
				{
					if(one[1]=='H')					
					{
						if(two[1]=='H')
							list[one[0]-'A'].gao=list[two[0]-'A'].gao;
						else if(two[1]=='L')
							list[one[0]-'A'].gao=list[two[0]-'A'].di;
					}	
					else if(one[1]=='L')
					{
						if(two[1]=='H')
							list[one[0]-'A'].di=list[two[0]-'A'].gao;
						else if(two[1]=='L')
							list[one[0]-'A'].di=list[two[0]-'A'].di;
					}
					else
					{
						list[one[0]-'A'].di=list[two[0]-'A'].di;
						list[one[0]-'A'].gao=list[two[0]-'A'].gao;
					}
				}
			}
			else if(op=="ADD")
			{
				sin>>two;
				if(isdigit(two[0])) 
				{
					LL val=sto(two);
					if(one[1]=='H')
						list[one[0]-'A'].gao+=val;
					else if(one[1]=='L')
						list[one[0]-'A'].di+=val;
					else
					{
						val=val+list[one[0]-'A'].gao*256+list[one[0]-'A'].di;
						list[one[0]-'A'].di=val%256;
						list[one[0]-'A'].gao=val/256;
					}
				}
				else
				{
					if(two[1]=='L')
					{
						if(one[1]=='L')
							list[one[0]-'A'].di+=list[two[0]-'A'].di;
						else if(one[1]=='H')
							list[one[0]-'A'].gao+=list[two[0]-'A'].di;
					}					
					else if(two[1]=='H')
					{
						if(one[1]=='L')
							list[one[0]-'A'].di+=list[two[0]-'A'].gao;
						else if(one[1]=='H')
							list[one[0]-'A'].gao+=list[two[0]-'A'].gao;
					}
					else
					{
						LL vall=list[two[0]-'A'].di+list[two[0]-'A'].gao*256+list[one[0]-'A'].di+list[one[0]-'A'].gao*256;
						list[one[0]-'A'].di=vall%256;
						list[one[0]-'A'].gao=vall/256;
					}					
				}
			}
			else if(op=="MUL")
			{
				LL val;
				if(one[1]=='L')
				{
					val=list[one[0]-'A'].di*list[0].di;
					list[0].di=val%256;
					list[0].gao=val/256;
				}
				else if(one[1]=='H')
				{
					val=list[one[0]-'A'].gao*list[0].di;
					list[0].di=val%256;
					list[0].gao=val/256;
				}
				else
				{
					LL v1=(list[0].gao*256+list[0].di)*(list[one[0]-'A'].gao*256+list[one[0]-'A'].di);
					list[0].di=v1%65536%256;
					list[0].gao=v1%65536/256;
					list[3].di=v1/65536%256;
					list[3].gao=v1/65536/256;
				}
			}
		}
		for (LL i=0; i<4; i++) 
		{
            LL val=list[i].gao*256+list[i].di;
            if(i!=3)
            	cout<<val<<" ";
            else
            	cout<<val<<endl;
        }
	}
	return 0;
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值