作业:7、8、9、10、11、15、17、19、20
4.7设内部RAM 20H单元有两个非零的BCD数, 编写求两个BCD数的积并把积送入21H单元 的程序。
ORG
1000H
MOV A, 20H
MOV B,
A ;
保存
SWAP A ANL A, #0FH ;取高4位 ANL B, #0FH
;取低4位
MUL AB
MOV B, #0AH
DIV AB
;转换成BCD码的形式
SWAP A
ORL A,
B
MOV 21H, A
SJMP
$
END
4.8已知从内部RAM BLOCK单元开始存放有一 组带
符号数,数的个数存放在LEN单元。编 写可以统计正数和负数个数并分别存入 NUM和
NUM+1单元的程序。
org lOOOh num data 30h len
data 20h
block
data
40h
mov rO, #block mov num, #00h ;保存正数个数 mov b, #00h
;保存负数个数
loop: mov a, @r0
inc rO jb acc.7, neg inc num sjmp next
neg:
inc b next: djnz len, loop
mov num+1, b sjmp $ end
4.9设X为一无符号数,存放在内部RAM的VAX 单
元,Y存放在FUNC单元。编写满足如下 关系的程序:
X X>50
Y =(5X 50> X > 20
2X X<20
org 2000h
vax data 20h func data 30h
mov
a, vax cjne
a, # 32h, compl compl: jc nextl mov func, a sjmp
done
nextl: cjne a, #14h、comp2 comp2: jc
next2 mov
b, #05h mul ab
mov func, a sjmp
done next2: clr
c
rlc a
mov func, a
done: sjmp $
end
4.10在例4.6的128分支程序中,若用LJMP指 令代替
AJMP指令,以便分支程序可以放在 64KB地址
范围的任何位置。修改原程序,修 改后的程序最多可以实现多少分支。
LJMP是三字节指令,最大分支数N应 满
足条件:NX3 < 256 (即不超过A的存储 范围),所以N = 85。 修改后的程序:
ORG 2100H MOV A, R3 RL A
ADD A, R3
MOV
DPTR, #BRTAB
JMP @A + DPTR 1
1
BRTAB: 1 LJMP ROUTOO
LJMP
ROUTOl
LJMP ROUT02
1
1
LJMP 1 ROUT85
ROUTOO:
1 1
1 1
ROUT85:
1
1 1
1
END 4.11从夕卜部RAM的SOURCE (二进制8位)开 始
有一数据块,该数据块以$字符结尾,编 写程序,把它们传送到以内部RAM的DIST 为起始地址的区域($字符也要传送)
org 2000h source data lOh dist
data 20h
mov p2, #00h
mov rO, #source
mov
rl, #dist
next:
movx a, @r0 inc rO
mov @rl,a
inc rl
cjne a, #24h, next done:
sjmp $
end
4.12 将习题4.11中的Source改为16位的,则 将程序
中的rO改成dptr即可。
4.13在外部RAM的低256地址单元区,有起始 地址
为SOUCE且长度在LEN单元的数据块。 编写能对它们进行奇偶校验的程序。凡满足 奇校验(奇数个1)的数据均送到内部RAM 起始地址为D1ST的存储区。
len
org 2000h data 10h
source data 20h dist
data 50h mov rO, # source mov rl, #dist mov
r2, #len mov
p2,
#00h
loop:
movx a, @r0 inc
rO jnb
psw.O, next mov
@rl, a inc
rl next: djnz
r2, loop sjmp $
4.14将习题4.13中的Source改为16位的,则将 原来
程序屮的rO改成dptr即可。
4.15外部RAM从2000H到2100H有一数据块, 编写
程序将它们传送到从3000H到3100H区 域。
ORG 0H
MOV DPTR, #2000H
NEXT:
MOVX A, @DPTR ORL
DPH, #10H
;将DPH从20H变成3()H
MOVX @DPTR, A
ANL
DPH, #0EFH
;将DPH从30H变成20H INC
DPTR
MOV A, DPH
CJNE
A, #21H, NEXT
MOVX A, @DPTR MOV DPH, #31H
MOVX @DPTR, A
;传送2100H单元屮的内容到3100H
SJMP $ END
4.16 片内RAM中有一数据块起始地址为 FIRST+1,长
度存放在FIRST屮且不为0,统 讣数据块中正偶数和负奇数的个数,分别存 放在PAPE单元和
NAOE单元。
ORG
OH
PAPE DATA 、20H NAOE DATA 21H FIRST
DATA
30H
MOV
PAPE, #()0H
MOV
NAOE, #00H
MOV RO, #FIRST
INC RO ;数据块的起始地址 LOOP:
MOV A, @R0 INC RO
JB
ACC.7, NEXT ;负数
JB ACC.O, PP
■ 9
如果是正奇数,则収下一个数
INC
PAPE
SJMP PP
NEXT:
JNB ACC.O, PP
■
9 如果是负偶数,则収下一个数 INC NAOE PP:
DJNZ FIRST, LOOP SJMP $
END
4.17从内部RAM的BLOCK为起始地址的100 个无符
号数中找出最小值并把它送入MIN单 兀O
ORG OH
BLOCK DATA 20H MIN
DATA 10H
MOV RO, #BLOCK
MOV R2, #64H MOV MIN, #0FFH LOOP:
MOV
A, @R0
CJNEA, MIN, NEXT NEXT:
JNC NEXT1
MOV MIN, A
NEXT1:
INC RO
DJNZ R2, LOOP SJMP $ END
4.18内部RAM区,6组无符号4字节被加数和 加数分
别存放在以FIRST和SECOND为起始 地址的区域(低字节在前,高字节在后),编程 求和(设和也为4字节)并把和存于以SUM 开始的区域。
ORG OH
FIRST DATA 20H SECON D DAT. A 40H
SUM
DAT
L
A
60H
MOV
RO, #FIRST
MOV R1, # SECOND MOV
R2, #06H
LOOP:
MOV R3, #04H
CLR C
LOOP1: MOV
A, @R0
ADDC
A, @R1
MOV
@R0, A
;将和存放在以FIRST开始的区域
INC RO
INC
RI
DJNZ R3, LOOP1 DJNZ
R2, LOOP
MOV RO, #FIRST MOV Rl, #SUM
MOV
R2, #24 LOOP2 :MOV
A, @R0
MOV @R1, A INC RO
INC
Rl
DJNZ
R2, LOOP2
SJMP $
END
4.19
内部RAM
匸
P,数据块以BLOCK为起始
地址, 块长放在LEN单元。用查表指令编写 程序, 先检查它们是否是十六进制中的A-F,
若是,
则把它们变成ASCII码,若不是,则 把它们变为OOHo
ORG OH
LEN DATA 10H BLOCK DATA 20H
MOV RO, # BLOCK
MOV DPTR, # ASCTAB
LOOP:
MOV A, @R0
CJNE A, #0AH, NE1 NE1:
JNC NE2
;若大于等于A,则去与F比较
SJMP
CHZERO
;若小于A,则变成0
NE2:
CJNE A, #0FH, NE3 ;与 F 比较
SJMP
CHASC
• 若等于F,则转成ASCII码
NE3:
JC CHASC
;
若小十尺则转成ASCII巾马
CHZERC): CLR
A ;若大于F,则变成0 SJMP
NEXT
CHASC:
ADD
A, #07H ;查表求ASCII码
CLR C SUBB A, # OAH MOVC
A, @A+PC NEXT: MOV @R0,
A
INC
R0
DJNZ LEN, LOOP
SJMP $
ASCTAB: DB
A, B
C, D, E, F
END 4.20 在片内RAM的20H单元中有一个数,其值 范围
为0-100,要求利用查表法求此值的平方 值并把结果存入片外RAM的20H (低字节) 和 21H。
ORG 00H MOV P2, #00H MOV RO, #21H
LOOP:
MOV A, 20H CLR C RLC A MOV B, A
MOV DPTR, # DTATAB MOVC A, @A+DPTR MOVX @R0, A DEC RO MOV A, B
INC A
MOVC A, @A+DPTR MOVX @R0, A
SJMP$
DTATAB: DW 0, 1,4, 9, 16, 25, 36, 49
DW 64,81, 100, 11*11, 12*12 DW 13*13, 14*14, 15*15, 16*16
DW 100*100 END
4.21内部RAM中,从BLOCK开始的存储区有
10个单字节十进制数(每字节有两个BCD数),编程求BCD数之和(和为3位BCD数),并 把它们存于SUM和SUM+1单元(低字节在
SUM单元)。
ORG OOH
BLOCK DATA 20H SUM DATA 10H
MOV RO, # BLOCK MOV R2, #0AH MOV A, #O0H MOV Rl,
#SUM
INC
R1
;SUM+1单元屮存放累加和的尚位
MOV @Rl,#00H ADD A, @R0
DA A INC
R0 JNC NEXT
INC
@R1 ;将进位送到累加和的高位
NEXT:
DJNZ R2, LOOPMOV SUM, A SJMP $ END
4.22将例4.21中,改为10个双字节十进制求和
(和为4位BCD数),结果仍送到SUM开始的连续单元(低字节先存)
ORG OOH
BLOCK DATA 20H SUM DATA 10H
MOV RO, #BLOCK
MOV R2, #0AH MOV SUM, #00H
MOV
SUM+1, #00H
MOV
B, #00H
;存放累加和的最高位
LOOP: MOV
A, SUM
ADD A, @R() DA A
MOV SUM, A INC RO
MOV A, SUM+1
ADDC A, @R0 DA A
MOV
SUM+1, A
INC RO
JNC NEXT
INC B ;将进位送到累加和的髙位 NEXT:
DJNZ R2, LOOP MOV SUM+2, B SJMP $ END
4.23 己知MDA和MDB内分别存有两个小 于10的整数,用查表子程序实现c = a*a +2ab
+ b*b,并把和存于MDC和MDC+1单元(MDC
中放低字节)
ORG OOH MDA DATA 10H MDB DATA 20H MDC
DATA
30H
MOV MDC+1, #00H MOV
A, MDA
ACALL SQR MOV MDC, A
MOV A, MDA MOV B, MDB
MUL
AB
RL A ;因为 2ab< 255,送到 A
ADD A, MDC MOV MDC, A JNC NEXT INC MDC+1
NEXT:
MOV A, MDB ACALL SQR ADD A, MDC MOV MDC, A JNC NEXT1
INC MDC+1
NEXT1 :SJMP$
SQR:
ADD A, #01H MOVC A, @A+PC RET
SQRTAB: DB 0, 1,4,9, 16
DB 25,36, 49, 64,81
END
4.24己知外部RAM起始地址为STR的数据块中 有一
以回车符CR断尾的十六进制ASCIL编 写程序将它们变为二进制代码,放在起始地 址为
BDATA的内部RAM存储区屮。
ORG OH STR DATA 10H BDATA
DATA 50H
MOV
P2, #00H
MOV RO, # STR MOV
Rl, #BDATA
LOOP:
MOVX A, @R0 INC RO
CJNEA, #0DH, NEXT
SJMP DONE NEXT:
CJNE A, #40H, NEXT1 NEXT1:
JNC NEXT2 ; A ・
ANL F
A, #0FH SJMP DONE NEXT2:
CLR C
SUBB
A, #37H DONE:
MOV @R1,A INC R1
SJMP
LOOP
SJMP $ END
程序流程图如下:
4.25设晶振频率为6MHz,试编写能延时20ms 的子程序。因为晶振频率为6MHz,则一个机器周期为:
12x—6M
= 2X10_6S
延时20ms,则需要10000个机器周期。 即:(20xl0_3)-(2xl0_6)= 10000 按下面的程序有如下的关系式:
1 + R2 * ( l+R3*(l+2)+2 ) = 10000
通过计算,设R2=101, R3 = 32o
ORG OH
MOV R2, #101 ;1 LOOP:
MOV R3, #32
;1
L00P1: NOP
; 1
DJNZ R3, LOOP1
;2
DJNZ R2, LOOP
; 2
SJMP $ END
4.26已知内部RAM的MA (被减数)和MB (减 数)
中分别有两个带符号数。编写减法子程 序,并把差存入RESULT和RESULT+1单元 中。
ORG 0H
MA DATA 20H MB DATA 30H RESULT
DATA 40H
CLR C MOV RO, #MA MOV R1, #MB ACALL SUB MOV RESULT, A INC R0 INC R1 ACALL SUB MOV RESULT+1, A SJMP $
SUB: MOV A, @R0 SUBB A, @R1 RET END
4.27 设RO内有一个补码形式的带符号被除数,R1内部补码形式的带符号除数,编程实现除法,并把商 置于R2内且余数置于R3内。
SBIT SBIT1 SB1T2
NCH1:
NCH2:
NCH3:
NCH4:
ORG 0H
BIT 20H.0 BIT 20H.I BIT
20H.2
MOV
A, RO RLC A MOV
SBIT1, C
MOV A, R1
RLC A MOV
SBIT2, C ANL C, /SBIT1
MOV
SBIT, C MOV
C, SBIT1
ANL C, /SBIT2 ORL C, SBIT MOV SBIT, C MOV A, R1 JNB SBIT2, NCH1 CPL A INC
A
MOV r B, A MOV A, RO
JNB SBIT1,NCH2 CPL
A INC
A DIV AB JNB SBIT, NCH3 CPL
A INC
A
MOV r R2, A JNB
SBIT, NCH4
MOV A, B CPL A INC
A MOV r R3, A SJMP $ END
商放到R2中
;处理除数;处理被除数;求出商和余数的绝对值;如果商为负,则求出补码;;如果余数为负,则求出补码
因篇幅问题不能全部显示,请点此查看更多更全内容