1076: 汇编语言
Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 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; }