1076: 汇编语言

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

Description

Input

Output

Sample Input

  1. 2
  2. 3
  3. MOV AX,2
  4. MOV BX,3
  5. ADD AX,BX
  6. 6
  7. MOV AX,2
  8. MOV BX,030H
  9. MOV CX,11B
  10. ADD AX,CX
  11. ADD DL,CL
  12. MUL DL

Sample Output

  1. 5 3 0 0
  2. 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)。
爆炸代码:

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<string>
  5. #include<queue>
  6. #include<set>
  7. #include<map>
  8. #include<sstream>
  9. #include<algorithm>
  10. #include<cmath>
  11. #include<cstdlib>
  12. using namespace std;
  13. typedef long long LL;
  14. struct poi
  15. {
  16. LL di;
  17. LL gao;
  18. };
  19. inline void change(string &s)
  20. {
  21. for (LL i=0; i<(LL)s.size(); i++)
  22. {
  23. if(s[i]==',')
  24. {
  25. s[i]=' ';
  26. }
  27. }
  28. }
  29. inline LL sto(string s)
  30. {
  31. LL sum=0;
  32. LL i;
  33. LL len=(LL)s.size();
  34. if(s[len-1]=='H'&&s[0]=='0')
  35. {
  36. for (i=0; i<len-1; i++)
  37. {
  38. if(s[i]>='A'&&s[i]<='Z')
  39. sum=sum*16+(s[i]-'A'+10);
  40. else if(s[i]>='a'&&s[i]<='z')
  41. sum=sum*16+(s[i]-'a'+10);
  42. else
  43. sum=sum*16+(s[i]-'0');
  44. }
  45. }
  46. else if(s[len-1]=='B')
  47. {
  48. for (i=0; i<len-1; i++)
  49. sum=sum*2+(s[i]-'0');
  50. }
  51. else
  52. {
  53. for (i=0; i<len; i++)
  54. {
  55. sum=sum*10+(s[i]-'0');
  56. }
  57. }
  58. return sum;
  59. }
  60. int main (void)
  61. {
  62. ios::sync_with_stdio(false);
  63. LL t,n,i,j;
  64. string op,one,two,s;
  65. char c;
  66. cin>>t;
  67. while (t--)
  68. {
  69. cin>>n;
  70. map<LL,poi>list;
  71. list[0].di=list[0].gao=0;
  72. list[1].di=list[1].gao=0;
  73. list[2].di=list[2].gao=0;
  74. list[3].di=list[3].gao=0;
  75. cin.get();
  76. for (i=0; i<n; i++)
  77. {
  78. getline(cin,s);
  79. change(s);
  80. istringstream sin(s);
  81. sin>>op>>one;
  82. if(op=="MOV")
  83. {
  84. sin>>two;
  85. if(isdigit(two[0]))
  86. {
  87. LL val=sto(two);
  88. if(one[1]=='H')
  89. list[one[0]-'A'].gao=val;
  90. else if(one[1]=='L')
  91. list[one[0]-'A'].di=val;
  92. else
  93. {
  94. list[one[0]-'A'].di=val%256;
  95. list[one[0]-'A'].gao=val/256;
  96. }
  97. }
  98. else
  99. {
  100. if(one[1]=='H')
  101. {
  102. if(two[1]=='H')
  103. list[one[0]-'A'].gao=list[two[0]-'A'].gao;
  104. else if(two[1]=='L')
  105. list[one[0]-'A'].gao=list[two[0]-'A'].di;
  106. }
  107. else if(one[1]=='L')
  108. {
  109. if(two[1]=='H')
  110. list[one[0]-'A'].di=list[two[0]-'A'].gao;
  111. else if(two[1]=='L')
  112. list[one[0]-'A'].di=list[two[0]-'A'].di;
  113. }
  114. else
  115. {
  116. list[one[0]-'A'].di=list[two[0]-'A'].di;
  117. list[one[0]-'A'].gao=list[two[0]-'A'].gao;
  118. }
  119. }
  120. }
  121. else if(op=="ADD")
  122. {
  123. sin>>two;
  124. if(isdigit(two[0]))
  125. {
  126. LL val=sto(two);
  127. if(one[1]=='H')
  128. list[one[0]-'A'].gao+=val;
  129. else if(one[1]=='L')
  130. list[one[0]-'A'].di+=val;
  131. else
  132. {
  133. val=val+list[one[0]-'A'].gao*256+list[one[0]-'A'].di;
  134. list[one[0]-'A'].di=val%256;
  135. list[one[0]-'A'].gao=val/256;
  136. }
  137. }
  138. else
  139. {
  140. if(two[1]=='L')
  141. {
  142. if(one[1]=='L')
  143. list[one[0]-'A'].di+=list[two[0]-'A'].di;
  144. else if(one[1]=='H')
  145. list[one[0]-'A'].gao+=list[two[0]-'A'].di;
  146. }
  147. else if(two[1]=='H')
  148. {
  149. if(one[1]=='L')
  150. list[one[0]-'A'].di+=list[two[0]-'A'].gao;
  151. else if(one[1]=='H')
  152. list[one[0]-'A'].gao+=list[two[0]-'A'].gao;
  153. }
  154. else
  155. {
  156. LL vall=list[two[0]-'A'].di+list[two[0]-'A'].gao*256+list[one[0]-'A'].di+list[one[0]-'A'].gao*256;
  157. list[one[0]-'A'].di=vall%256;
  158. list[one[0]-'A'].gao=vall/256;
  159. }
  160. }
  161. }
  162. else if(op=="MUL")
  163. {
  164. LL val;
  165. if(one[1]=='L')
  166. {
  167. val=list[one[0]-'A'].di*list[0].di;
  168. list[0].di=val%256;
  169. list[0].gao=val/256;
  170. }
  171. else if(one[1]=='H')
  172. {
  173. val=list[one[0]-'A'].gao*list[0].di;
  174. list[0].di=val%256;
  175. list[0].gao=val/256;
  176. }
  177. else
  178. {
  179. LL v1=(list[0].gao*256+list[0].di)*(list[one[0]-'A'].gao*256+list[one[0]-'A'].di);
  180. list[0].di=v1%65536%256;
  181. list[0].gao=v1%65536/256;
  182. list[3].di=v1/65536%256;
  183. list[3].gao=v1/65536/256;
  184. }
  185. }
  186. }
  187. for (LL i=0; i<4; i++)
  188. {
  189. LL val=list[i].gao*256+list[i].di;
  190. if(i!=3)
  191. cout<<val<<" ";
  192. else
  193. cout<<val<<endl;
  194. }
  195. }
  196. return 0;
  197. }

ACM程序设计选修课——1076汇编语言(重定向+模拟)的更多相关文章

  1. ACM程序设计选修课——1041: XX's easy problem(神烦的多次字符串重定向处理)

    1041: XX's easy problem Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 41  Solved: 7 [Submit][Statu ...

  2. ACM程序设计选修课——1044: (ds:队列)打印队列(queue模拟)

    问题 A: (ds:队列)打印队列 时间限制: 1 Sec  内存限制: 128 MB 提交: 25  解决: 4 [提交][状态][讨论版] 题目描述 网络工程实验室只有一台打印机,它承担了非常繁重 ...

  3. ACM程序设计选修课——1057: Beautiful Garden(模拟+耐心调试)

    1057: Beautiful Garden Time Limit: 5 Sec  Memory Limit: 128 MB Submit: 25  Solved: 12 [Submit][Statu ...

  4. 第13届景驰-埃森哲杯广东工业大学ACM程序设计大赛 G 旋转矩阵 【模拟】

    链接:https://www.nowcoder.com/acm/contest/90/G 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言65536 ...

  5. ACM程序设计选修课——Problem D: (ds:树)合并果子(最优二叉树赫夫曼算法)

    Problem D: (ds:树)合并果子 Time Limit: 5 Sec  Memory Limit: 64 MB Submit: 80  Solved: 4 [Submit][Status][ ...

  6. ACM程序设计选修课——Problem E:(ds:图)公路村村通(Prim)

    问题 E: (ds:图)公路村村通 时间限制: 1 Sec  内存限制: 128 MB 提交: 9  解决: 5 题目描述 现有村落间道路的统计数据表中,列出了有可能建设成标准公路的若干条道路的成本, ...

  7. ACM程序设计选修课——Problem F:(ds:图)旅游规划(优先队列+SPFA)

    问题 F: (ds:图)旅游规划 时间限制: 1 Sec  内存限制: 128 MB 提交: 14  解决: 4 题目描述 有了一张自驾旅游路线图,你会知道城市间的高速公路长度.以及该公路要收取的过路 ...

  8. ACM程序设计选修课——Problem E:(ds:图)公路村村通(优先队列或sort+克鲁斯卡尔+并查集优化)

    畅通工程 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submi ...

  9. ACM程序设计选修课——1018: Common Subsequence(DP)

    问题 L: Common Subsequence 时间限制: 1 Sec  内存限制: 32 MB 提交: 70  解决: 40 [提交][状态][讨论版] 题目描述 A subsequence of ...

随机推荐

  1. 撤销git pull命令

    比如:在master分支上执行了git pull命令,想回到pull之前分支所在的commit位置. 步骤一:用 git reflog master 查看master分支的历史变动记录,其中有一个就是 ...

  2. JS的闭包、高阶函数、柯里化

    本文原链接:https://cloud.tencent.com/developer/article/1326958 https://cloud.tencent.com/developer/articl ...

  3. for...in、for...of、forEach()有什么区别

    本文原链接:https://cloud.tencent.com/developer/article/1360074 for of 和 for in 循环 循环遍历数组的时候,你还在用 for 语句走天 ...

  4. 利用Vue.js实现登录/登出以及JWT认证

    JSON Web Token 入门教程:http://www.ruanyifeng.com/blog/2018/07/json_web_token-tutorial.html 后端代码地址:https ...

  5. UIViewController 的 edgesForExtendedLayout、automaticallyAdjustsScrollViewInsets属性

    1.有时你命名设置了某控件的y坐标为0,确总是被导航栏遮挡住,如下: UILabel *label = [[UILabel alloc] init];    label.text = @"请 ...

  6. 用promise封装ajax

    首先贴代码 var ajaxOptions = { url: 'url', method: 'GET', async: true, data: null, dataType: 'text', } fu ...

  7. bp神经网络原理

    bp(back propagation)修改每层神经网络向下一层传播的权值,来减少输出层的实际值和理论值的误差 其实就是训练权值嘛 训练方法为梯度下降法 其实就是高等数学中的梯度,将所有的权值看成自变 ...

  8. mysql基本知识点

    1.建表格式:create table 表名(字段名 约束条件,字段名 约束条件,...);示例:create table brand(brand_id int unique primary key, ...

  9. (75)zabbix_server.conf配置文件详解

    ############ GENERAL PARAMETERS ################# ### Option: ListenPort# Listen port for trapper.# ...

  10. 蓝牙stack bluez学习(1)Stack Architecture

    Bluez支持的features Core Specification 4.2 (GAP, L2CAP, RFCOMM, SDP, GATT) Classic Bluetooth (BR/EDR) B ...