计算机应用系统方面的编程题

试编写程序查找在片内RAM 20H-50H单元内数据块中现00H的次数,并将查找结果存放在片外RAM的2046H单元。
高手帮帮忙啊!急!!!

解:MOV A,R1

MOV R0,A

(2)外部RAM 20H单元内容送R0。

解:MOV R0,#20H

MOVX A,@R0

MOV R0,A

(3)外部RAM 20H单元内容送内部RAM 20H单元。

解:MOV R0,#20H

MOVX A,@R0

MOV @R0,A

(4)外部RAM 1000H单元内容送内部RAM 20H单元。

解:MOV DPTR,#1000H

MOVX A,@DPTR

MOV 20H,A

(5)外部ROM 2000H单元内容送R0。

解:MOV DPTR,#2000H

CLR A

MOVC A,@A+DPTR

MOV R0,A

(6)外部RAM 2000H单元内容送内部RAM 20H单元。

解:MOV DPTR,#2000H

CLR A

MOVC A,@A+DPTR

MOV 20,A

(7)外部RAM 2000H单元内容送外部RAM 20H单元。

解:MOV DPTR,#2000H

CLR A

MOVC A,@A+DPTR

MOV R0, #20H

MOV @R0,A

2-2 已知A=7AH,R0=30H,(30H)=A5H,PSW=81H。问执行以下各指令的结果(每条指令都以题中规定的数据参加操作)。

(1)XCH A,R0 A=30H,R0=7AH, P=0

(2)XCH A,30H A=A5H, (30H)=7AH, P=0

(3)XCH A,@R0 A=A5H, (30H)=7AH, P=0

(4)XCHD A,@R0 A=75H, (30H)=AAH, P=1

(5)SWAPA A=A7H P=1

(6)ADD A,R0 A=AAH Cy=0 OV=1 P=0

(7)ADD A,30H A=1FH Cy=1 OV=0 P=1

(8)ADD A,#30H A=AAH Cy=0 OV=1 P=0

(9)ADDC A,30H A=20H Cy=1 OV=1 P=1

(10)SUBB A,30H A=D4H Cy=1 OV=1 P=0

(11)SUBB A,#30H A=49H Cy=0 OV=0 P=1

(12)DA A A=80H Cy=1 P=1

(13)RL A A=F4H Cy=1 P=1

(14)RLC A A=F5H Cy=0 P=0

(15)CJNE A,#30H,00 A=7AH Cy=0 P=1

(16)CJNE A,#30H,00 A=7AH Cy=1 P=1

2-3 设内部RAM的30H单元内容为40H,即(30H)=40H,还知(40H)=10H,(10H)=00H,端口P1=CAH,问执行以下指令后各有关存贮器单元、寄存器及端口的内容(即R0,R1,A,B,P1,40H,30H及10H单元)。

MOV R0,#30H

MOV A,@R0

MOV R1,A

MOV B,@R1

MOV @R1,P1

MOV P2,P1

MOV 10H,#30H

MOV 30H,10H

解:每条指令执行后的结果依次如下列所示:R0=30H,A=40H,R1=40H,B=10H,(40H)=CAH,P2=CAH,(10H)=20H,(30H)=20H。

由此可知执行后的各单元内容:R0=30H,R1=40H,A=40H, B=10H, P1=CAH, (40H)=CAH,(30H)=20H,(10H)=20H。

2-4 设R0=17H,A=83H,(17H)=34H,问执行以下指令后,A=?

ANL A,#17H

ORL 17H,A

XRL A,@R0

CPL A

解:此题是为了熟悉逻辑运算指令。各条指令的执行结果如下:

A←83H∧17H=10000011∧00010111=03H

(17H) ←34H∨03H=00110100∨00000011=37H

A←03H⊕37H=00000011⊕00110111=34H

A←A=00110100=CBH

所以程序执行后,A=CBH

2-5 试编写程序,将内部RAM的20H,21H,22H三个连续单元的内容依次存入2FH,2EH和2DH单元。

解:此题可以直接用传送指令来完成:

MOV 2FH,20H

MOV 2EH,21H

MOV 2DH,22H

当然也可以用循环程序来做:

MOV R0,#20H ;源数据区首地址

MOV R1,#2FH ;目的数据区首地址

MOV R3,#03H ;数据块长度

LOOP: MOV A,@R0

MOV @R1,A

INC R0

DEC R1

DJNZ R2,LOOP

SJMP $

2-6 编写程序,进行两个16位数的减法:6F5DH-13B4H。结果存至内部RAM的30H和31H单元,30H存差的低8位。

解:程序如下:

MOV A,#5DH

CLR C

SUBB A,#0B4H

MOV 30H,A

MOV A,#6FH

SUBB A,#13H

MOV 31H,A

SJMP $

由于MCS=51指令系统中,减法指令只能完成带借位减法,所以在开始做减法时,一般都要对进位位Cy清0。

2-7 编写程序,若累加器A的内容分别满足以下条件时,则程序转至LABEL存贮单元。设A中存的是无符号数。

1、A 10

解:此题可直接用比较条件转移指令来完成,有关的程序语句如下:

CJNE A,#0AH,00H

JNG LABEL

比较条件转移指令根据A-0AH的结果来位置Cy的值,只要A 10,减法就不需要借位,即Cy=0。再用一条“JNC”指令就可以决定是否要转移至LABEL。偏移量00H表示比较后无论结果如何都先执行下一条语句。

2、A>10

解:这时如果仍然与0AH比较,则无法区分A >10(要转移)和A=10(不转移)。当然也可以增加其它的指令(如累加器判断零条件转移语句等)来完成所需的功能,但会使语句增多,程序不够简洁。不如直接与0BH(十进制数11)比较,比较之后A 11都使Cy=0,相当于A>10才使Cy=0。仍用两条语句就能完成所需功能

CJNE A,#0BH,00H

JNG LABEL

3、A 10

解:这种情况与题(2)相似,可直接与11作比较,但这时是Cy=1时才转移。

CJNE A,#0BH,00H

JC LABEL

4、A<10

解:这时只需直接和10作比较即可,与题(1)类似:

CJNE A,#0AH,00H

JC LABEL

2-8 已知SP=25H,PC=2345H,(24H)=12H,(25H)=34H,(26H)=56H。问此时执行RET指令后,SP=?PC=?

解:MCS-51系统中,堆栈是向上生长的,故出栈操作时堆栈指针要减小。执行RET指令的过程如下:

PC15-8 (SP) 即PC15-8=(25H)=34H

SP SP-1 即SP=24H

PC7-0 (SP) 即PC7-0=(24H)=12H

SP SP-1 即SP=23H

结果为:SP=23H,PC=3412H

2-9 若SP=25H,PC=2345H,标号LABEL所在的地址为3456H,问执行长调用指令LCALL LABEL后,堆栈指针和堆栈的内容发生什么变化?PC的值等于什么?

解:长调用指令完成两个功能:把下一条指令地址堆入堆栈,并把所调用子程序的入口地址赋予程序计数器PC。过程如下:

PC PC+3 所以PC=2345H+3=2348H

SP SP+1 所以SP=26H

(SP) PC7-0 所以(26H)=48H

SP SP+1 所以SP=27H

(SP) PC15-8 所以(27H)=23H

PC LABEL 所以PC=3456H

结果应为:SP=27H,(26H)=48H,(27H)=23H,PC=3456H。

2-10 上题的LCALL指令能否直接换成ACALL指令,为什么?如果使用ACALL指令,则可调用的地址范围是什么?

解:ACALL指令只能在2K字节范围内调用。具体来讲,要求PC+2后,PC的高5位与调用地址LABEL的高5位相同。或者说执行ACALL以后的PC值和调用地址应在同一页内(每页地址范围为2K字节)。在本题中:

PC+2=2345+2=2347H,高5位00100

而 LABEL=3456H, 高5位00110

两者不相等,不在同一页内,所以不能直接换成ACALL指令

如果使用ACALL指令,则可调用地址最小值为2000H,最大值为27FFH。即高5位地址保持00100不变,低11位地址可以从全0变为全1。地址范围为2K字节。

2-11 试编写程序,查找在内部RAM的20H-50H单元中是否有0AAH这一数据。若有,则将51H单元置为01H;若未找到;则使51H单元置为0。

解:这个题可以有两种基本的解法。其一是先计算出数据块的长度,然后再作循环和比较,程序如下:

CLR C

MOV R0,#20H ;R0中为数据块首地址

MOV A,#50H ;数据块末地址

SUBB A,R0

INC A

MOV R1,A ;R1存数据块长度

LOOP1:CJNE @R0,#0AAH,LOOP2

MOV 51H,#01H ;找到置(51H)=01H

SJMP LOOP3

LOOP2: ING R0

DJNZ R1,LOOP1

MOV 51H,#00H ;未找到,置(51H)=01H

LOOP3: SJMP $

第二种解法则直接用比较条件转移指令判断是否已经完成最后一次比较。这时MCS-51指令系统的特点之一。程序如下:

MOV R0,#20H ;R0存数据块首地址

LOOP1: CJNE @R0,#0AAH,LOOP2 ;比较

MOV 51H,#01H ;找到,置(51H)=01H

SJMP LOOP3

LOOP2: ING R0

DJNZ R0,#51H,LOOP1 ;未比较完则循环

MOV 51H,#00H ;未找到,置(51H)=01H

LOOP3: SJMP $

2-12 试编写程序,查找在内部RAM的20H-50H单元中出现00H的次数,并将查找的结果存入51H单元。

解:此题的解法与上题相似,采用第二种解法,程序如下:

MOV R0,#1FH

MOV R1,#00H ;R1用作计数器

LOOP1: ING R0

CJNE @R0,#00H,LOOP2

INC R1 ;找到一个00H,计数器加1

LOOP2: CJNE @R0,#50H,LOOP1 ;未比较完则循环

MOV 51H,R1 ;存比较结果

SJMP $

2-13 试编写程序,求20H单元和21H单元中两个补码数差的绝对值,即 。结果保留在A中。若计算结果出现溢出,则置22H单元为0FFH,否则,22H应为00H。

解:可直接用减法指令来完成减法,然后依据差的符号来求绝对值,若差为正数,则差就是所求绝对值。若差为负数,则求反加一之后就可得到绝对值。当然减法之后先要判断是否溢出。若溢出,则只需置溢出标记:使(22H)=0FFH即可。程序如下:

CLR C

MOV 22H,#0FFH

MOV A,20H

SUBB A,21H

JB OV,NEXT

JNB ACC.7,NEXT1 ;差为正则转移

CPL A ;差为负,求补为绝对值

ING A

NEXT1:MOV 22H.,#00H

NEXT: SJMP $

2-14 试编写程序,求20H,21H,22H单元的三个补码数差得绝对值,即 。结果保留在A中。若运算出现溢出,则置23H单元为0FFH;否则,置23H单元为00H。

解:此题的解法与上题相似。只是每次减法以后都要判断是否出现溢出,而不是做完两次减法以后才判断溢出。因为有可能第一次减法以后已经溢出,再作一次减法以后反倒没有溢出,而这时的结果实际上已经不正确了。例如,64-(-64)-(-1)=129。结果已经溢出,但分两步运算时,先由

64-(-64)=01000000-11000000=10000000

这时已经出现溢出,OV=1。若再作第二次减法,则结果为:

10000000-11111111=10000001

溢出标志反而被清零(因为负数减负数不可能溢出),但实际的结果并不正确。所以,需要每作完一次减法运算就检查溢出标志。程序如下:

CLR C

MOV 23H,#0FFH ;先置溢出标志

MOV A,20H

SUBB A,21H ;第一次相减

JB OV,NEXT ;溢出则结束

CLR C ;准备第二次相减

SUBB A,22H ;第二次相减

JB OV,NEXT ;溢出则结束

JNB ACC.7,NEXT1 ;差为正则转移

CPL A ;求反加一

ING A

NEXT1:MOV 23H.,#00H

NEXT: SJMP $

2-15 有一个16位二进制数,高8位存于21H单元,低8位存于20H单元。试问:(1)执行以下程序段,完成什么逻辑功能?(2)能否用MOV指令替代其中的XCH指令而不改变程序的逻辑功能?写出相应的程序段。(3)这两个程序段的执行结果是否完全相同?差别在那里?

CLR C

XCH A,21H

RRC A

XCH A,21H

XCH A,20H

RRC A

XCH A,20H

解:(1)程序完成的逻辑功能是使21H和20H中的16位二进制数右移一位,并使最高位为0,一般称为逻辑右移一位。

(2)可以用MOV指令,修改后程序段如下:

CLR C

MOV A,21H

RRC A

MOV 21H,A

MOV A,20H

RRC A

MOV 20H,A

(3)有所差别。虽然从16位右移功能来说两者的功能是相同的,但第一个程序段执行后,累加器A的内容仍维持原值,而第二个程序段执行后将改变A中的数值。

2-16 分析以下程序段的逻辑功能。若要用MOV指令代替其中的交换指令而不改变程序的逻辑功能,应如何进行修改?设20H中存放的是两个四位二进制数。

MOV R1,#20H

XCHD A,@R1

ADD A,#01H

XCHD A,@R1

XCH A,@R1

ADD A,#01H

XCH A,@R1

解:程序的功能是将20H单元中的两个四位二进制数分别加1,并且舍弃可能产生的进位。如(20H)=6AH,程序执行后位(20H)=7BH。又如(20H)=9FH,执行后(20H)=A0H。

不采用交换指令而要完成同样的功能,可以有多种修改方法。以下仅为一例:

MOV R1,#20H

XCHD A,@R1

ADD A,#01H ;低4位加1

JB AC,NEXT ;判断低四位有无进位

ADD A,#01H ;高4位加1

NEXT: MOV @R1,A ;送回20H单元

2-17 分析以下程序段的运行结果。若是将其中的DA A指令取消,则结果会有什么不同?

CLR C

MOV 20H,#99H

MOV A,20H

ADD A,#01H

DA A

MOV 20H,A

解:程序运行结果是A=00H,Cy=1,(20H)=00H。

取消DAA指令后,运行结果为A=9AH,Cy=0,(20H)=9AH。

2-18 以下的两个程序段中,R2内所存入的都是两位16进制数。试问这两个程序段各进行多少次循环?

MOV R2,#60H

LOOP:……

……

DJNZ R2,LOOP

SJMP $

MOV R2,#60H

LOOP:……
温馨提示:答案为网友推荐,仅供参考
相似回答