(1)设有两个4位BCD码,分别存放在片内RAM的23H、22H单元和33H、32H单元中,求它们的和,并送入43H、42H单元中去(以上均为低位字节,高位在高字节)。
解:
ORG 0000H
LJMP START
ORG 0030H
START: MOV A,22H
ADD A,32H
DA A
MOV 42H,A
MOV A,23H
ADDC A,33H
DA A
MOV 43H,A
SJMP $
END
(2)编程将片内RAM40H~60H单元中的内容送到片外RAM以3000H开始的单元中。
解:
ORG 0000H
LJMP MAIN
ORG 0030H
MAIN: MOV R7,#20H
MOV R1,#40H
MOV DPTR,#3000H
LOOP: MOV A,@R1
MOVX @DPTR,A
INC R1
INC DPTR
DJNZ R7,LOOP
SJMP $
END
(3)编程计算片内RAM区30H~37H的8个单元中数的算术平均值,结果存在3AH单元中。
解:
ORG 0000H
LJMP MAIN
ORG 0030H
MAIN: MOV R0,#30H
MOV R1,#00H
MOV R2,#00H
MOV R3,#07H
LP2: MOV A,@R0
ADD A,R2
MOV R2,A
JNC LP1
INC R1
LP1: INC R0
DJNZ R3,LP2
MOV R3,#03H
LP3: CLR C
MOV A,R1
RRC A
MOV R1,A
MOV A,R2
RRC A
MOV R2,A
DJNZ R3,LP3
MOV 3AH,R2
SJMP $
END
(4)设有100个有符号数,连续存放在片外RAM以2200H为首地址的存储区中,试编程统计其中正数、负数、零的个数。
解:
ORG 0000H
LJMP MAIN
ORG 0030H
MAIN: MOV R2,#100
MOV R3,#00H
MOV R4,#00H
MOV R5,#00H
MOV DPTR,#2000H
LOOP: MOVX A,@DPTR
CJNE A,#00H,NET1
INC R3
INC DPTR
DJNZ R2,LOOP
SJMP NET3
NET1: JC NET2
INC R4
INC DPTR
DJNZ R2,LOOP
SJMP NET3
NET2: INC R5
INC DPTR
DJNZ R2,LOOP
NET3: SJMP $
END
(5)试编一查表程序,从首地址为2000H、长度为9FH的数据块中找出第一个ASCII码A,将其地址送到20A0H和20A1H单元中。
解:
ORG 0000H
LJMP MAIN
ORG 0030H
MAIN: LCALL SUBONE ; SUBONE use dptr,a,30h,31h
AJMP $
SUBONE: MOVDPTR,#2000H
LOOP: MOVX A,@DPTR
XRLA,#41H
JNZTT
MOVA,30H
MOVDPTR,#20A0H
MOVX @DPTR,A
MOVDPTR,#20A1H
MOVA,31H
MOVX @DPTR,A
RET
TT: INC DPTR
MOV 30H,DPH
MOV 31H,DPL
MOV A,31H
CJNE A,#00H,LOOP
RET
END
(6)设一个加数在50H~52H单元中,另一个加数在53H~55H中,进位存放在位地址00H中,试编程实现两数求和。
解法1:
ORG 0000H
ONE DATA 50H
TWO DATA 53H
WEI BIT 00H
MOV R0,#ONE
MOV R1,#TWO
MOV C,WEI
CLR C
MOV R2,#3
LOOP: MOV A,@R0
ADDC A,@R1
MOV @R0,A
INC R0
INC R1
DJNZ R2,LOOP
MOV WEI,C
SJMP $
END
解法2:
ORG 0000H
ONE DATA 50H
TWO DATA 53H
WEI BIT 00H
MOV R0,#ONE
MOV R1,#TWO
CLR C
MOV R2,#3
SETB RS0
MOV R0,#58H
CLR RS0
LOOP: MOV A,@R0
ADDC A,@R1
INC R0
INC R1
SETB RS0
MOV @R0,A
INC R0
CLR RS0
DJNZ R2,LOOP
MOV WEI,C
SJMP $
END
(7)设自变量x为一无符号数,存放在内部RAM的VAX单元,函数y存放在FUNC单元,请编出满足如下关系的程序:
x x≥50
y= 5x 50> x≥20
2x x <20
解:
ORG 0000H
VAX EQU 30H
FUNC EQU 31H
MOV VAX,#55;15;20;25;50;55
MOV A,VAX
CJNE A,#20,DO1
DO1: JNC DO2
MOV B,#2
MUL AB
SJMP MEM
DO2: CJNE A,#50,DO3
DO3: JNC MEM
MOV B,#5
MUL AB
MEM: MOV FUNC,A
SJMP $
END
(8)在内部RAM中,有一个以BLOCK为始址的数据块,块长在LEN单元。请用查表指令编一程序,先检查它们若是16进制中的A~F,则把它们变为ASCⅡ码;若不是,则把它们变为00H。
解:
BLOCK EQU 31H
LEN EQU 30H
N EQU 30
ORG 0000H
MOV R0,#BLOCK
MOV LEN,#N
MOV R2,LEN
LOOP: MOV A,@R0
CJNE A,#0AH,DO1
DO1: JNC DO2
SJMP DO5
DO2: CJNE A,#0FH,DO3
SJMP DO4
DO3: JC DO4
DO5: MOV A,#0
SJMP NEXT
DO4: MOV DPTR,#TAB
CLR C
SUBB A,#0AH
MOVC A,@A+DPTR
NEXT: MOV @R0,A
INC R0
DJNZ R2,LOOP
SJMP $
TAB: DB 'A','B','C','D','E','F'
END
(9)试编写程序,查找在内部RAM的30H~50H单元中是否有0AAH这一数据。若有,则将51H单元置为“01H”;若未找到,则将51H单元置为“00H”。
答:
START: MOVR0,#30H
MOVR2,#20H
LOOP: MOVA,@R0
CJNE A,#0AAH,NEXT
MOV51H,#01H
LJMP EXIT
NEXT: INC R0
DJNZ R2,LOOP
MOV51H,#00H
EXIT: RET
(10)试编写程序,查找在内部RAM的20H~40H单元中出现“00H”这一数据的次数,并将查找到的结果存入41H单元。
答:
START: MOV41H,#0
MOVR0,#20H
MOVR2,#20H
LOOP: MOVA,@R0
JNZ NEXT
INC 41H
NEXT: INC R0
DJNZ R2,LOOP
RET
(11)若SP=60H,标号LABEL所在的地址为3456H,LCALL指令的地址为2000H,执行指令:2000H LCALL LABEL后,堆栈指针SP和堆栈内容发生了什么变化?PC的值等于什么?如果将指令LCALL直接换成ACALL是否可以?如果换成ACALL指令,可调用的地址范围是什么?
答:① SP=SP+1=61H,(61H)=PC的低字节=03H,SP=SP+1=62H,(62H)=PC的高字节=20H。
② PC=3456H。
③ 可以。
④ 2KB=2048B。