一九九八年度高级程序员级 下午试卷-计算机技术
·当前位置: 学海荡舟-论文 >> 考试中心 >> 计算机考试 >> 计算机技术
一九九八年度高级程序员级 下午试卷


试题一
Joxue阅读以下说明和流程图,回答问题 1至问题3,将解答写在答卷的对应栏
[说明]
Joxue本流程图描述某超市销售数据的部分处理流程。超市中有若干台收款机和若干名收款员。这
里,我们把一个收款员开始使用一台收款机到离开这台收款机称为该收款员的一次作业。作业开始时,收款员先在收款机上输入收款员号和作业前金额。作业前金额是为了销售时的找零而在作业前预先放入钱箱的金额数。作业结束时,收款员要找开钱柜,取走全部现金,并把这些现金的金额数(称为作业后金额)输入收款机。当
JoxueJoxue作业前金额+本次作业售货总金额-本次作业退货总金额≠作业后金额
时,表示这次作业存在金额差错。
Joxue本流程图已作简化,并作以下假定;该超市只有现金交易(不用信用卡和礼券);一个收款员因某种原因(如吃饭)在一天中可以有多个作业;销售方式只有售货和退货两种。
Joxue整个超市分成若干部门(如食品部、服装部),系统按部门统计一个月中各类货物的销售数量和金额,最后根据月销售计划文件分析各部门完成销售计划的情况。系统还统计每个收款员的差错情况和退货情况。
Joxue图中处理4和处理8每月的最后一天执行一次(营业结束后),其它处理每天执行一次。
Joxue图中部分数据、文件的记录格式如下:
Joxue日销售数据:收款机号十收款员号十作业前金额十
JoxueJoxueJoxueJoxue{(售货标记|退货标记)十货号十数量十单价十金额}+作业后金额
Joxue日销售文件记录:(作业开始标记十收款机号十收款员号十作业前金额 )
JoxueJoxueJoxueJoxueJoxue|(售货标记|退货标记)十货号十数量十金额) )
JoxueJoxueJoxueJoxueJoxue|(作业结束标记十收款机号十收款员号十作业后金额
Joxue部门日销售文件记录:部门号十(售货标记|退货标记)十货号十数量+金额
Joxue部门月销售计划文件记录;部门号十月计划金额
Joxue收款员差错月报:月份十收款员号十差错作业数十差错总金额
Joxue收款员退货月报..月份十收款员号十退货次数十退货总金额
Joxue其中 {w}表示 w重复出现多次; a|b 表示 a或b; a+b表示 a与b。
[问题1]
Joxue分别写出收款员日销售文件、商品文件、部门日销售汇总文件至少应包含哪些数据项。
[问题2]
Joxue处理1能检查出日销售数据中的哪些错误。
[问题3]
Joxue处理4对收款员月销售文件作何种操作。
试题二
Joxue阅读以下说明和流程图,回答问题,将解答写在答卷的对应栏内。
[说明]
Joxue本流程图描述了某子程序的处理流程,现要求用白盒测试法为该子程序设计测度数据
[问题]
Joxue根据判定覆盖、条件覆盖、判定一条件覆盖、条件组合覆盖(即多重条件覆盖)、路径覆盖等五种覆盖标准,从供选择的答案中分别找出满足相应覆盖标准的最小测试数据组(用①~回答)。 供选择的答案
JoxueJoxueJoxue①x=90,y=90 ②x=90,y=70 ③x=90,y=90 ④x=90,y=75
JoxueJoxueJoxuex=70,y=70 Joxuex=70,y=90 Joxuex=90,y=75 Joxuex=75,y=90
JoxueJoxueJoxueJoxueJoxueJoxueJoxueJoxueJoxueJoxueJoxueJoxuex=75,v=90 Joxuex=70,y=70
JoxueJoxueJoxue⑤x=90,y=90 ⑥x=80,y=80 ⑦x=80,y=80 ⑧x=80,y=80
JoxueJoxueJoxuex=90,y=75 Joxuex=90,y=70 Joxuex=90,y=75 Joxuex=90,y=70
JoxueJoxueJoxuex=75,y=90 Joxuex=70,y=90 Joxuex=90,y=90 Joxuex=70,y=90
JoxueJoxueJoxuex=70,y=70 Joxuex=70,y=70 Joxuex=75,y=90 Joxuex=70,y=70
JoxueJoxueJoxueJoxueJoxueJoxueJoxueJoxueJoxueJoxueJoxueJoxuex=70,y=70 Joxuex=70,y=75
JoxueJoxueJoxue⑨x=80,y=80 ⑩x=90,y=90 x=80,y=80x=80,y=80
JoxueJoxueJoxuex=90,y=75 Joxuex=90,y=75Joxue x=90,y=75Joxue x=80,y=70
JoxueJoxueJoxuex=90,y=70 Joxuex=90,y=70 Joxuex=90,y=70 Joxuex=70,y=80
JoxueJoxueJoxuex=70,y=80Joxue x=75,y=90 Joxuex=70,y=80 Joxuex=70,y=70
JoxueJoxueJoxuex=70,y=75Joxue x=70,y=70 Joxuex=70,y=75Joxue x=90,y=75
JoxueJoxueJoxuex=70,y=70Joxue x=70,y=90 Joxuex=70,y=70 Joxuex=90,y=70
JoxueJoxueJoxueJoxueJoxueJoxueJoxueJoxueJoxueJoxueJoxueJoxuex=70,y=90 x=70,y=75
x=75,y=90
x=75,y=80
x=70,y=90

试题三
Joxue阅读以下说明和流程图,回答问题1至问题2,将解答写在答卷的对应栏内。
[说明]
Joxue本流程图描述了某种字符序列的变换过程。变换前的字符序列以字符“#”结尾,它存放在数组old中,变换后的字符序列存放在数组new中,它不包含结束标志“#”。流程图按下列规则进行变换:
1.删除字符序列中的注解。注解用一对“!”字符分隔,注解中可出现除“#”外的任何字符。
2.字符常数完整地保留。字符常数用一对“&”字符分隔,字符常数中可出现、外的任何字符。
Joxue值得注意的是:当字符“&”需要出现在字符常数中时,通常用二个连续的“&”表示,在
Joxue保留字符常数时,这二个连续的“&”都被保留。此外,作为字符常数分隔符的一对“&”
Joxue也被保留。
3.除字符常数和注解外,出现在其它地方的连续多个空格压缩成一个空格,但字符序列中先导
Joxue的空格则全部删除。
4.注解和字符常数之外的非空格字符均保持不变。
Joxue本流程图对原字符序列从左到右扫描,根据遇到的当前字符来搜索连续空格、注解或字符常
Joxue数,然后按上述变换规则变换。若遇到的当前字符是“!”,则寻找下一个“!”字符(若
Joxue找不到则作出错处理),这二个“!”间的字符全部看作为注解。若当前字符是“&”字符
Joxue则寻找与之配对的下一个“&”字符(若找不到则作出错处理),其间的字符全部看作为字
Joxue符常数。
Joxue例如:
Joxue原字符序列:
Joxue└┘└┘a└┘└┘└┘b&cd&&└┘└┘!e&f└┘└┘ g!h& └┘└┘!└┘└┘j#
Joxue变换后的字符序列:a└┘bdcd&&└┘└┘!e&f└┘g└┘j
Joxue本流程图假定在数组old中一定存在“#”字符。
[问题1]
Joxue填充流程图中的①~⑤,把解答写在答卷的相应位置上。
[问题2]
Joxue当原字符序列中汪解的前后均是连续空格时,本流程图将注解前后的连续空格分别压缩成一个空格,删除注解后,将导致变换后的新字符序列出现二个连续的空格。如;
JoxueJoxueJoxueJoxueJoxueg└┘└┘!h&└┘└┘i!└┘└┘j
本流程图将变换成g└┘└┘j。
Joxue为使变换后的新序列中除字符常数外没有连续的空格,图中的虚线框需作何改动(只需画出修改后的流程图)
试题四
Joxue在COMET型计算机上可以使用试卷上所附的CASL汇编语言。阅读以下程序说明和CASL程序,将应填入_(n)_处的字句,写在答卷的对应栏内。
[程序说明]
Joxue本程序是统计字符串中数字字符“0”至“9”的出现次数。
Joxue字符串中的每个字符是用ASCII码存贮。一个存贮单元存放两个字符,每个字符占8位二进位。
Joxue程序中,被统计的字符串从左至右存放在STR开始的连续单元中,并假定其长度不超过200,字符串以‘·’符作为结束。NCH开始的10个单元存放统计结果。
JoxueSTART MIN
MIN LEA GR2,9
JoxueLEA GR0,0
L1Joxue_(1)_
JoxueLEA GR2,-1,GR2
JoxueLEA GR4,0
JoxueLEA GR1,0
L2JoxueLDGR2,STR,GR1
JoxueEOR GR4,C1
JoxueJNZ RL
Joxue_(2)_
RLJoxueSRL GR2,8
JoxueLEA GR3,0,GR2
JoxueSUB BR3,C9
JoxueJNZ L4
L3JoxueLEA GR3,0,GR2
JoxueSUB GR3,CO
JoxueJM1 L5
JoxueLEA GR2,1
Joxue_(3)_
Joxue_(4)_
L4JoxueGR4 0,GR4
JoxueJNZ L2
Joxue_(5)_
JoxueJMP L2
L5JoxueSUB GR2,C
JoxueJNZ L4
JoxueEXIT
C1JoxueDC 1
C JoxueDC '·'
C0JoxueDC '0'
C9JoxueDC 9
STR DS 200
NCH DS 10
JoxueEND


试题五
Joxue阅读以下程序说明和C程序,将应填入_(n)_处的字句,写在答卷的对应栏内。
[程序说明]
Joxue这里给出的程序逐一从指走课程成绩文件中读入学生的学号和成绩,对同一学生汇总他的总成绩,并按以下格式输出名次(按总成绩由高到低的顺序)、总成绩、同一名次的学生人数、同一名次学生的学号(按学号由小到大的顺序)。
Joxue程序约定学生学习课程不超过30种,课程成绩文件的第一个数字就是课程号,统计过程中,同一课程号的成绩文件不能重复输入。
Joxue程序采用链表结构存储学生有关信息,链表中的每个表元对应一位学生。程序在数据输入过程中,形成一个按学生学号从小到大顺序链接的有序链表。当数据输入结束后,程序按总成绩从高到低,学号从小到大的顺序对链表排序。程序最后按指定格式输出链表中的信息。程序的输出格式如下例所示:

总成绩

1

470

2

12

25

3

450

3

15

24

50

6

430

1

14

7

401

3

13

18

45

[程序]

#include 〈stdio.h〉
#define M 30
#define NLEN 10
typedef struct node {int cur_s/*最近输入成绩的科目 */
JoxueJoxueJoxueJoxueJoxuechar no[NLEN];int score;
JoxueJoxueJoxueJoxueJoxuestuction node *next;
JoxueJoxueJoxueJoxueJoxue}NODE;
N0DE*bubblesort(N0DE*head)
{NODE *q,*tail,*p=(MODE*)malloc(sizeof(NODE);
p→next=head;head=p;tail=NULL;
while (tail!=___(1)___)
{p=head;q=p→next;
Joxuewhile (q→enxt!=tail)
Joxue{if (p→next→score→〈q→next→score||
Joxue Joxuep→next→scor==q→next→score&&
JoxueJoxue strcmp(p→next→no,q→next→no)〉0)
Joxue{p→next=_(2)_,/*两相邻表元链接关系前后颠倒*/
JoxueJoxue_(3)_=q→next→next;p→next→next=q;
Joxue}
Joxuep=p→next;/*调整p和q*/ q=_(4)_;
Joxue}
Joxuetail=q;
}
p=head→next;free(head);return p;
}
int s[M],sp;
main()
{FILE*fp;
NODE*h,*u,*v*p;
int ss,,mark,order,c;
char fname[80],no[NLEN],ans;
for(h=NULL,sp=0;;)
{print(''输入科目成绩文件名(输入aaaa表示强行结束)。\n");
Joxuewhile (1)
Joxue{scanf("%s",fname);
Joxueif(strcmp(fname,"aaaa")==0)break;
Joxueif((fp=fopen(fname,"r"))==NULL)
JoxueJoxueprintf("不能打开文件%s,请重新输入科目文件名。\n,fname);
Joxueelse break;
Joxue}
Joxueif(strcmp(fname,"aaaa")==0)break;
Joxuefscanf(fp,"%d",&ss);/·输入科目号·/s[sp]=ss;
Joxuefor(i=0;s[i]!=ss;i++);
Joxueif(i
Joxue{printf("该科目的成绩已输入,请输入别的科目成绩文件。\n");
Joxuecontinue;
Joxue}
Joxuesp++;
Joxuewhile(fscanf(fp,"%s%d",no,&mark)==2)
Joxue{/*在链表中寻找最近输入的学号*/
Joxuefor(v=h;v!=NULL,&& strcmp(v→no,no)<0;u=v,v=v→next);
Joxueif(v!=NULL && strcmp(v→no,no)==0)
Joxue{if (v→cur_s!==ss)
JoxueJoxue{v→score+=mark;v→cur_s=ss;
JoxueJoxue}/*同一科目成绩的重复输入,后输入成绩被忽略*/
Joxue}else {p=(NODE*)malloc(sizeof(node);/*一位新的学生*/
JoxueJoxueJoxuestrcpy(p→no,no);p→score=mark;p→cur_s=ss;
JoxueJoxueJoxuep→next=v;
JoxueJoxueJoxueif(v==h) h=p;else u→next=p;
JoxueJoxueJoxue}
Joxue} fclose(fp);
Joxueprintf("还有科目成绩文件要输入吗?(Y/N)");scanf("%c",&ans);
Joxueif(anns=='N'||ans=='n')break;
}
h=bubblesort(h);
printf("名次 总成绩 人数 学号\n");/*以下按格式要求输出*/
v=h;order=1;
while(v!=NULL)
{for (c=1,u=v→next;u!NULL &&u→score==v→score;c++,u=u→next);
Joxueprintf("%4d%7d%8d ",order,v→score,c);
Joxuefor(order+=c,i=1;_(5)_;v=v→next,i++)
Joxue{if (i>1 && i%5==1) printf("\n%23c",'');
Joxueprintf("%s",v→no);
Joxue}printf("\n");
}
}

试题六
Joxue阅读以下程序说明和FORTRAN程序,将应填入_(n)_处的字句,写在答卷的对应栏内。
[程序说明]
Joxue本程序用以将m+n个元素的数组A中的前m个元素(A(1)-A(m))与后n个元素(A(m+l)-A(m+n))互换位置,并保持其各自原有的内部顺序。
Joxue程序中把数组的各元素看成首尾相连的序列,并将数组元素分成G组(G为m和n的最大公因子),每组中的元素序列是从数组某元素起由间隔为m的元素组成,再将每组元素依次循环向左传送,即得所需结果。
Joxue例如原数组A为:
JoxueJoxueJoxueJoxueJoxueJoxue
Joxue由m=4,n=2,求得 G=2,将A中的元数分成两组。按上述说明,第一组元素序列依次为A(1)、A(5)、A(3),将它们循环向左传送后的结果为
8

9

7

2

6

4

Joxue第二组元素序列依次为以A(2)、A(6)、A(4),将它们循环向左传送后的结果为

8

4

7

9

6

2

即得所需结果。

JoxueINTEGET A(1000), G,H
JoxueREAD(*,*)M,N
JoxueREAD(*,*)(A(1),1=1,M+N)
JoxueG=M
JoxueH=N
20JoxueIF (G,NE,H)THEN
JoxueJoxueIF(G,GT,T)THEN
JoxueJoxueG=G-H
JoxueJoxueELSE
JoxueJoxueH=H-G
JoxueJoxueENDIF
JoxueJoxueGOTO 20
JoxueENDIF
JoxueDO 100 I=_(1)_
JoxueJoxueTEMP=A(1)
JoxueJoxueK=1
30JoxueJ=_(2)_
JoxueJoxueIF(J,NE,1)THEN
JoxueJoxueA(K)=_(3)_
JoxueJoxueK=J
JoxueJoxue_(4)_
JoxueJoxueELSE
JoxueJoxueA=K=_(5)_
JoxueJoxueENDIF
100 CONTINUE
JoxueWRITE(*,200)(A(I),I=1,M+N)
200 FORMANT(1016)
JoxueEND

试题七
Joxue阅读以下程序说明和C程序,将应填入_(n)_处的字句,写在答卷的对应栏内。
[程序说明]
Joxue本程序的函数
JoxueJoxuesum(int,i int total,int sigma,int rear,int d[],int n)
用来从已知数组d的前n个元素中找出所有部分元素序列之和等于total的元素序列,约定数组d的元素都是正整数,且都小于等于total。
Joxue函数sum使用递归方法找出全部解答。参数i表示递归函数当前考虑元素d[i],参数sigma是调用前已选取的部分序列的元素和,参数rear是后面还未考虑的那部分元素的元素和。
Joxue函数对元素d[i]有两种可能的选择方案:
Joxue1.考虑元素d[i]被包含在新的部分元素序列中的可能性。如果在当前部分元素序列之后接上d[i],新序列的元素和不超过total,则函数将d[i]包含在当前部分元素序列中。如果新的部分元素序列的元素和等于total时,新的部分元素序列就是一个解答,函数将其输出;否则,若继续考虑后面的元素还有可能找到解答时,函数就递归去考虑后面的元素,寻找解答。最后,函烽就恢复原来部分元素序列中不包含d[i]的状态。
Joxue2.考虑元素d[i]不被包含在新的部分元素序列中的可能性。如果继续向d[i]之后考虑还是有希望能得到和为total的部分元素序列时,函数将新序列不包含d[i]也作为一种可能的选择,并递归去考虑后面的元素,寻找解答。
#include 〈stdio.h〉
#define N 100
int a[N];
int flg[N];
sum (int i,int total,int sigma,int rear,int d[],int t)
{int j;
/*考虑元素d[i]被包含在新的部分元素序列中的可能性 */
if(sigma+d[i] total/*如果d[i]与当前序列的和不超过total*/
{flg[i]=1;/*d[i]被考虑在被部分元素序列中 */
Joxueif(_(1)_==total)
Joxue{/*输出解*/
Joxuefor (j=0;flg[j]==0;j++);
Joxueprintf("%4d=%d",total,d[j]);
Joxuefor(j++;<=i;j++)
JoxueJoxueif (flg[j])
JoxueJoxueJoxueprintf("+%d",d[j]);
Joxueprintf("\");
Joxue}
Joxueelse /*并且继续考虑后面的元素有可能找到解答时 */
Joxueif(i<n-1 &&rear-d[i]+sigma>=total)
JoxueJoxuesum(i+1,total,_(2)_,rear-d[i],d,n);
Joxue_(3)_;
/*考虑元素d[i]不被包含在新的部分元素序列中的可能性。*/
if (i<n-1&&rear-d[i]+tigma>=total)
JoxueJoxuesum(i+1,total,_(4),rear-d[i],d,n);
}
main()
{int i,j,n,total,s,d;
printf("输入total!/n");scanf("%d",&total);
printf("输入n!/n"); scanf("%d",&n);
for (s=i=0;i<n;)
{printf ("输入第%d个元素>0且<=%d)\n",i+1,total);
Joxuescanf ("%d",&d);
Joxueif( d<1||d>total)
Joxue{printf("出错,请重新输入!\n");
JoxueJoxuecontnue;
Joxue}
Joxues+=a[i++]=d;
}
sum(0,total,0,_(5)_,a,n);
printf ("\n\n");
}

试题八
Joxue阅读以下程序说明和FORTRAN程序,将应填入_(n)_处的字句,写在答卷的对应栏内。
[程序说明]
Joxue本程序用以查找给定数组A的第K小元素。程序执行后,第K小元素存放在数组元素A(K)中。
Joxue设给定的数组中各元素A(i)=(i=1,2…N)互为不相等。它的第K(1≤k≤N)小元素是指这样的元素;它大于N个元素中的K-1个元素,而小于其余的N-K个元素。假如,假设N=8,数组A为:
44

94

12

50

55

6

18

67

它的第5小元素(即K=5)是50。
Joxue本程序的处理过程如下:
Joxue将A(K)的值(此例为A(5),此时值为55)存入X,从左向右扫描,直至遇以第一个不小于X的元素(此时为94),再从右向左扫描,直到遇见第一个不大于X的元素(此时为18),然后交换这两个元素,数且A成为:

44

18

12

50

55

6

94

67

继续这一“扫描与交换”的过程,直到两个方向的扫描在数组中间的某处汇合。此时数组被分成两段,汇合点左边的元素均小于汇合点右边的元素。然后选取存在第K小元素的一段,重复上述扫描、交换和调整扫描范围的处理过程。程序中采用L、R来表示扫描的范围的左右边界。开始时L为1,R为N,以后逐次调整。当变成为L值不小于R值时,A[K]即是第K小元素。

JoxueSUBROUTINT FIND(A,N,K)
JoxueINTEGET A(N),R,X,W
JoxueL=1
JoxueR=N
20JoxueIF (L,LT,R)THEN
JoxueJoxueX=A(K)
JoxueJoxueI=L
JoxueJoxueJ=R
30JoxueIF(A(1),LT,X)THEN
JoxueJoxueI=I+1
JoxueJoxueGOTO 30
JoxueJoxueENDIF
40JoxueIF(___(1)___)THEN
JoxueJoxue ___(2)___
JoxueJoxueGOTO 40
JoxueJoxueENDIF
JoxueJoxueIF(I,LE,J)THEN
JoxueJoxueW=A(I)
JoxueJoxue___(3)___
JoxueJoxueI=I+1
JoxueJoxue___(4)___
JoxueJoxueIF(I,LE,J)___(5)___
JoxueJoxueENDIF
JoxueJoxueIF(J,LT,K)L=I
JoxueJoxueIF(___(6)___) R=___(7)___
JoxueJoxueGOTO 20
JoxueENDIF
JoxueRETURN
JoxueEND

JoxueJoxueJoxueJoxueJoxueJoxueJoxueJoxueASL汇编语言文本
一、处理机COMET说明
1.COMET是一台字长为16位的定点计计算机,主存储器的容量是65536字,按编号0000~FFFF(+六进制)编址。
2.一个字的16位二进位采用自左至右的次序编号,即
0

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15



3.一个字中的16位可以是:
Joxue不带符号的二进制非负整数,此时一个字能表示的数的范围是0≤x≤2-1
Joxue用补码表示的带符号的二进制整数,此时一个字能表示的数的范围是:
Joxue地址常数,此时一个字能表示的地址写成十六进制时是:0000~FFFF
Joxue字符数据,此时一个字的高8位皆应为零,低8倍为字符的ASCII编码,即

0

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15


0

0

0

0

0

0

0

0

字符的ASCII编码


4.COMET具有5个通用寄存器GR(16位),一个指令计数器PC(16位)和一个标志寄存器RF(2位)。它们的作用分别是:
JoxueGR(通用寄存器)。5个通用寄存器的编号为0,1,2,3,4分别记为GR0,GRL,GR2,GR3,GR4。这些通用寄存器用于 算术、逻辑,比较,移位等运算,其中GR1,GR2,GR3、GR4通用寄存器兼作变址寄存器。另外,GR4还兼作栈指针(SP)用,栈指针是存放栈地十用的寄存器。
JoxuePC(指令计数器),在执行指令的过程中,PC中存放着正在执行的第一个字的地址(一条指令占二个字)。当指令执行结束时,置入下一条将要被执行的指令的第一个字的地址。也就是是说,在指令执行结束时,一般地把PC的内容加2,只有在执行转移指令且转移条件成立时,才将转移地址置入PC中。
JoxueFR(标志寄存器)。在ADD,SUB,AND,OR,EOR,CPA,CPL,SLA,SRA,SLL,SRL,LEAT等指令执行结束时,根据执行结果,将FR置成00、01或10它不会因其它指令的执行而改变(参阅7)。
5.COMET的控制方式为顺序控制,指令由32位二进位构成,即双字长,其构成没有定义。
6.指令的符号表示:
JoxueGR泛指通用寄存器,可用数字0、1、2、3、4来指定,也可以用GR0、GR1、GR2、GR3、GR4来指定。
JoxueXR泛指变址寄存器,可用数字1、2、3、4来指定,也可以用GR1、GR2、GR3、GR4来指定。
JoxueSP栈指针(第4号通用寄存器)。
JoxueADR标号(表示与标号对应的地址),为10进制整数(-32768 ADR 65535;ADR作为地址;具有0~65535的值,而32768~65535的值也可以用负的10进制常数表示)。
Joxue(X)个X地址中的内容,如果X是通用寄存器时表示通用寄存器中的内容。
JoxueE表示有效地址,形成有效地址E的规则是:E=ADR[+(XR)](mod2")
Joxue[]表示被[]包围的部分可以省略(以下同),XR省略时,表示不使用变址寄存器。
7.COMET有23种指令,指令的名称,书写格式及其功能见附表1,指令的书写格式用汇编语句的形式给出。

二、汇编语言CASL说明
JoxueCOMET的汇编语言是CASL,其语法规则说明如下。
1.指令的种类和书写格式
JoxueCASL由4种伪指令(START,END,DC,DC)3种宏指令(IN,OUT,EXIT)和23种符号指令(COMET的指令)组成。
JoxueCASL的每条指令书写在一行内(最多不超过72个字符).它的书写格式如附表2所示。
Joxue由附表2可知CASL每条指令由标号(可缺省),指令码操作(可缺省)和注释(可缺省)4栏构成,每一栏的书写规则如下:
Joxue标号栏:从第一个字符位里开始,最多不超过6个字符位置
Joxue指令码栏:在无标号时,从第二个字符位置以后的任意字符位置开始;在有标号时,标号后面至少有一个空白,从其后的任意字符位置开始。
Joxue注释栏:行里有分号(;)时;其后直到终了作为注释处理(但DC指令里的字符串中的分号除外)。此外,在第一个字符位置为人号或在分号前只有空白的情况下,该行全部作为注释处理。在注释栏里,可以书写任何字符。
JoxueLABEL泛指标号,标号最多不超过6个字符,开头必须是英文大写字母或数字。
Joxue用空白表示的栏目里不得写入字符。
JoxueJoxue附表1

Joxue

JoxueJoxueJoxueJoxue

指令码

Joxue操作数

取数

LD

GR,ADR[,XR]

(E)GR

存数

ST

GR,ADR[,XR]

(GR)E

取地址*

LEA

GR,ADR[,XR]

EGR

加 法*

ADD

GR,ADR[,XR]

(GR)+(E)GR

减 法*

SUB

GR,ADR[,XR]

(GR)-(E)GR

逻辑乘*

AND

GR,ADR[,XR]

(GR)^(E)GR

逻辑加*

OR

GR,ADR[,XR]

(GR)v(E)GR

按位加*

EOR

GR,ADR[,XR]

(GR)(E)GR

算术比较

CPA

GR,ADR[,XR]

视(GR)和(E)为用补码表示的
带符号的二进制整数。
若(GR)>E则00 FR
若(GR)=(E)则01 FR
若(GR)<(E)则10FR

逻辑比较

CPL

GR,ADR[,XR]

视(GR)和(E)为无符号的的
二进制非负整数。
若(GR)>E则00 FR
若(GR)=(E)则01 FR
若(GR)<(E)则10FR

算术左移*

SLA

GR,ADR[,XR]

把(GR)向左或向右移动E位。在算术
移位时,GR中的第0位保持不变。在
右移时空出的位被置成0。在逻辑移
位时,GR中的16位一起移动,而空出
的位被置成0。

算术右移*

SRL

GR,ADR[,XR]

逻辑左移*

SLL

GR,ADR[,XR]

逻辑右移*

SRL

GR,ADR[,XR]

无条件转

JMP

ADR[,XR]

无条件向有效地址E转移,即EPC

大于等于转

JPZ

ADR[,XR]

根据FR的值向有效地址E转移,即
JoxueJoxueJoxueEPC;
不转移时执行下一条指令,即
JoxueJoxue(PC)+2PC(注)

小于转

JMI

ADR[,XR]

不等转

JNZ

ADR[,XR]

等于转

JZE

ADR[,XR]

进 栈

PUSH

ADR[,XR]

(SP)-1SP,E(SP)

退 栈

POP

GR

((SP))GR,(SP)+1SP

调 用

CALL

ADR[,XR]

先形成有效地址E,再依次执行
JoxueJoxue(SP)-1SP
JoxueJoxue(PC)+2(SP)
JoxueJoxueEPC

返 回

RET

Joxue((SP))PC,(SP)+1SP

JoxueJoxueJoxueJoxue注:

JoxueJoxue

转移时FR的值

JoxueJoxueJPZ

Joxue00或01

JoxueJoxueJMI

Joxue10

JoxueJoxueJNZ

Joxue00或10

JoxueJoxueJZE

Joxue01

*这些指令还根据执行结果(GR中的值),形成FR的值,其规则是:
JoxueJoxue若GR中的第0位为0且其各余各位不全为0,则FR被置成00;
JoxueJoxue若GR中的第16位全为0,则FR被置成01;
JoxueJoxue若GR中的第0位为1,则FR被置成10。
JoxueJoxueJoxue附录2

标 号

指令码

操作数

注 释

[LABEL]

START

[LABEL]

空 白

END

空 白

[LABEL]

DC

常 数

[LABEL]

DS

区域的字数

[LABEL]

IN

ALABEL,NLABEL

[LABEL]

OUT

ALABEL,NLABEL

[LABEL]

EXIT

[LABEL]

空 白


2.伪指令
Joxue(1)[LABEL]START [LABEL]
Joxue表示程序的开头,即在程序的开始必须书写。
Joxue操作数栏中的标号是这个程序中定义的标号,它指出该程序的启动地址,在省略的情况下,程序从头开始执行。
Joxue标号栏中的标号可以作为其它的程序进人该程序的人口。
Joxue(2) END
Joxue表示程序的终止,在程序的末尾必须书。
Joxue(3)[LABEL]Dc常数
Joxue用来指定和存储常数。常数分十进制常数,十六进制常数,地址常数和字符串常数四种。
Joxue标号栏中的标号是代表被指定的十进制常数、十六进制常数,地址常数的存贮地址或代表被指定的字符串常数的存储区域的第一个的地址。
Joxue十进制常数: DC n
Joxue用n指定一个十进制数(一32768<n<65535),并将n转换成二进制数存储在一个字中,如果u超出规定的范围,则将其低16位再储起来。
Joxue对32768~65535的十进制数也可以用负的十进制常数表示。
Joxue十六进制常: DC #h
Joxue用h指定一个4位+六进制数(0000 h FFFF).并依次把字符数据存储在一个字中(在h的前面必需写上#)。
Joxue地址常数: DC LABEL
Joxue将标号LABEL所对应的地址作为一个字的二进制数存储,若LABEL在该程序中没有定义,汇编将保留地址的定义,并由操作系统处理。
Joxue字符串常数: DC '字符串'
Joxue将字符串中从左开始的每个字符转换成字符数据(参阅上节3),并依次把字符数据存储在连续的各字中。
Joxue在字符串中,不允许出现字符’;字符串的长度不能是零(即空字符串)
Joxue(4)[LABEL]DS区域的字数
Joxue用来保图指定的字数的存储区域。
Joxue区域的字数,用十迸制常数(≥0)指定。
Joxue标号栏中的标号是代表被保留的存储区域的第一个字的地址。
Joxue区域的字数为零时,存储区域不存在,但是标号栏中的标号仍有效,即代表下一字的地址。
3.宏指令
Joxue宏指令是根据事先定义的指令串和操作的信息,生成指定功能的指令串。
JoxueCASL中有进行输人、输出及结束程序等宏指令,而没有定义输人、输出符号指令,这类处理由操作系统完成。
Joxue程序中出现没指令时,CASL生成调用操作系统的指令串,但是,生成的指令中的字数不确定。
Joxue执行宏指令时,GR的内容保持不变而FR的内容不确定。
Joxue(1)[LABEL] 1N ALAB2L,NLAB2L
Joxue宏指令IN,从输人装置上输入一个记录,记录中的信息(字符)依次按字符数据的形式被顺序放在标号为ALABEL开始的区域内,已输入的字符个数以二进制数形式存放在标号为ALABEL的字中,记录之间的分配符号不输入。
Joxue(2)[LABEL] IN ALABEL,NLABEL
Joxue宏指令 OUT,将存放在从标号ALABBL开始的区域中的字符数据,作为一个记录向输出装置输出,输出的字符个数由标号为NLABEL的字中的内容指定,输出时,若要记录间的间隔符号,由操作系统自动插入输出。
Joxue(3)LABEL EXIT
Joxue宏指令EXIT,表示程序执行的终止,控制返回操作系统。
4.符号指令,参阅上节7。
5.指令字、区域的相对位置
Joxue由汇编生成的指令字和区域的相对位置按汇编语言程序的书写顺序确定,并且生成的指令字,区域占有主存的连续区域。


  • 上一套试题:
  • 下一套试题: