1729: 汇编语言
时间限制: 1 Sec 内存限制: 128 MB提交: 304 解决: 61
[ 提交][ 状态][ 讨论版][命题人: admin]
题目描述
输入
输出
样例输入
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
样例输出
5 3 0 0
15 48 3 3
提示
注意在 MOV 和 ADD 操作中,指令的两个操作对象的位数应当是一致的,即不会出现如 MOV AX,BL
或 ADD AL,0100H 这样错误的指令。
在初始状态下,四个通用寄存器中的数值均为 0。给定一系列的汇编指令,请输出按顺序执行完所
有指令后四个通用寄存器中的数值。
#include<stdio.h>
#include<string.h>
using namespace std;
#define ll long long
ll AX,AH,AL,BX,BH,BL,CX,CH,CL,DX,DH,DL;
void change1()
{
AH=AX/256;AL=AX%256;
BH=BX/256;BL=BX%256;
CH=CX/256;CL=CX%256;
DH=DX/256;DL=DX%256;
}
void change2()
{
AX=AH*256+AL;
BX=BH*256+BL;
CX=CH*256+CL;
DX=DH*256+DL;
}
ll *judge(char *s)
{
if(strcmp("AX",s)==0)return &AX;
else if(strcmp("AH",s)==0)return &AH;
else if(strcmp("AL",s)==0)return &AL;
else if(strcmp("BX",s)==0)return &BX;
else if(strcmp("BH",s)==0)return &BH;
else if(strcmp("BL",s)==0)return &BL;
else if(strcmp("CX",s)==0)return &CX;
else if(strcmp("CH",s)==0)return &CH;
else if(strcmp("CL",s)==0)return &CL;
else if(strcmp("DX",s)==0)return &DX;
else if(strcmp("DH",s)==0)return &DH;
else if(strcmp("DL",s)==0)return &DL;
}
ll two_t(char *s)//二进制字符串转10进制
{
int len=strlen(s);
ll sum=0;
for(int i=0;i<len-1;i++){
sum*=2;
if(s[i]=='1')
sum+=1;
}
return sum;
}
ll six_t(char *s)//16进制字符串转10进制
{
int len=strlen(s);
ll sum=0;
for(int i=1;i<len-1;i++)
{
sum*=16;
if(s[i]>='0'&&s[i]<='9')
sum+=(s[i]-'0');
else sum+=(s[i]-'A'+10);
}
return sum;
}
ll ten_t(char *s)//字符串转10进制
{
int len=strlen(s);
ll sum=0;
for(int i=0;i<len;i++)
{
sum=sum*10+s[i]-'0';
}
return sum;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n;
scanf("%d",&n);
AX=AL=AH=0;BX=BL=BH=0;
CX=CL=CH=0;DX=DL=DH=0;
char str[35],str1[35],str2[35];
for(int i=0;i<n;i++)
{
scanf("%s",str);
if(strcmp(str,"MOV")==0)//移动
{
scanf("%s",str);
str[2]='\0';
strcpy(str1,str);
strcpy(str2,str+3);
ll *p=judge(str1);
int len = strlen(str2);
if((str2[0]>='0'&&str2[0]<='9'))//移动的是数字
{
if(str2[len-1]=='B')//二进制
{
*p=two_t(str2);
}
else if(str2[len-1]=='H')//16进制
{
*p=six_t(str2);
}else //10进制
{
*p=ten_t(str2);
}
}
else //移动的是寄存器
{
ll *q=judge(str2);
*p=*q;
}
if(str1[1]=='X') change1();
else change2();
}
else if(str[0]=='A')
{
scanf("%s",str);
str[2]='\0';
strcpy(str1,str);
strcpy(str2,str+3);
int len=strlen(str2);
ll *p=judge(str1);
if((str2[0]>='0'&&str2[0]<='9'))
{
if(str2[len-1]=='B')
{
*p+=two_t(str2);
}
else if(str2[len-1]=='H')
{
*p+=six_t(str2);
}
else
{
*p+=ten_t(str2);
}
}
else
{
ll *q=judge(str2);
*p+=*q;
}
if(str1[1]=='X') change1();
else change2();
}
else
{
memset(str1,0,sizeof(str1));
scanf("%s",str1);
ll *p=judge(str1);
if(str1[1]=='X')
{
DX=(*p * AX)/65536;
AX=(*p * AX)%65536;
}else
{
AX=*p * AL;
}
change1();
}
}
printf("%d %d %d %d\n",AX,BX,CX,DX);
}
return 0;
}