• 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;
    }


     

  • 相关阅读:
    hdu3709(数位dp)
    2012天津E题
    2012天津C题
    hdu1754(splay)
    赤裸裸的splay平衡树
    hdu(预处理+线段树)
    uva11922(强行用rope替代spaly)
    lightoj 1370 欧拉函数
    poj3294 出现次数大于n/2 的公共子串
    poj2774 后缀数组2个字符串的最长公共子串
  • 原文地址:https://www.cnblogs.com/Blackops/p/5380420.html
Copyright © 2020-2023  润新知