|
2、2000年试题四
[程序说明]
(1)本子程序根据每位职工的基本工资(非负值)和他完成产品的超额数或不足数计算该职工的应发工资。
(2)主程序调用时,GR1中给出子程序所需参数的起始地址,参数的存放次序如下表:
|
GR1 |
a1 |
| |
b1 |
| |
c1 |
| |
a2 |
| |
b2 |
| |
c2 |
| |
… |
| |
an |
| |
bn |
| |
cn |
| |
-1(结束标志) |
其中 ai 为职工 i 的基本工资;bi 为职工 i 的完成产品的超额数或不足数;ci为职工 i 的应发工资数(i = 1、2、…、n)。
bi以原码形式存放(大于零为超额,小于零为不足),基本工资与计算所得的应发工资以补码形式存放。
(3)应发工资的计算规则为:
●恰好完成定额数(此时bi = 0),应发工资即为基本工资。
●每超额 4 件,在基本工资基础上增加 10 元(不到 4 件,以 4 计算,例如超额数为 10 时,增加 30 元)。
●每不足 4 件,在基本工资基础上减 5 元(不到 4 件,以 4 计算,例如不足数为 5 时,减 10元)。
[程序]
|
START |
|
1 |
|
BEG |
PUSH |
0,GR1 |
2 |
|
PUSH |
0,GR2 |
3 |
|
PUSH |
0,GR3 |
4 |
| L1 |
__(1)__ |
|
5 |
|
LEA |
GR0,0,GR2 |
6 |
|
JMI |
FINISH |
7 |
|
LD |
GR3,1,GR1 |
8 |
|
LEA |
GR2,0,GR3 |
9 |
|
AND |
GR2,C7FFF |
10 |
|
JZE |
L3 |
11 |
|
SRL |
GR3,15 |
12 |
|
LEA |
GR2,-1,GR2 |
13 |
| L2 |
__(2)__ |
|
14 |
|
LEA |
GR2,-4,GR2 |
15 |
|
JPZ |
L2 |
16 |
| L3 |
__(3)__ |
|
17 |
|
__(4)__ |
|
18 |
|
__(5)__ |
|
19 |
| FINISH |
POP |
GR3 |
20 |
|
POP |
GR2 |
21 |
|
POP |
GR1 |
22 |
|
RET |
|
23 |
| C7FFF |
DC |
#7FFF |
24 |
| BONUS |
DC |
10 |
25 |
|
DC |
-5 |
26 |
|
END |
|
27 |
[解]
寄存器作用: GR1:地址指针 GR2:临时工作单元。先放 ai,后放 bi(绝对值)。 GR3:bi符号 GR0:ci---应发工资 分析: 1)从第 6 行 "LEA GR0,0,GR2" 及第 7 行 "JMI FINISH" 可知 GR0 开始时应是 ai,GR2 也应是ai,(从 LEA 指令功能分析)。所以第 5 行(1)应该是取数指令: LD GR2,0,GR1 2)从第 8 行 "LD GR3,1,GR1" 及第 9 行 "LEA GR2,0,GR3" 可知 GR2 及 GR3 放的都是 bi(超额数或不足数),而从第 10 行 "AND GR2,C7FFF"(注意:C7FFF是 16 进制常量的标号(第 24 行)),可知 GR2 存放其绝对值。而且在该值为 0 时直接结束该职工处理(第 11 行 "JZE L3")。 3)从第 12 行 "SRL GR3,15" 可知 GR3 存放 bi 的符号(超额为 0,不足为 1) 4)从第 25、26 两行可知 BONUS 是每个超额或不足单位(4 件)的增加或扣除金额。从而得出最关键的第 14 行 (2) 应为 "ADD GR0,BONUS,GR3"。第 15、16 行指出这一加或减(GR3=1时,源操作数为负)是一循环过程,一直到 GR2<0。为防止 bi 为 4 的整数倍时多加减一次,在第 13 行中先将 GR 减 1。 5)第17、18、19行(L3)依次是该职工的应发工资回送、修改地址指针(指向下一职工)和跳到处理程序开始(L1):
ST GR0,2,GR1 LEA GR1,3,GR1 JMP L1
上一页 [1] [2] [3] [4] 下一页 |