========================================
【第1题】
已知从外部数据存储器的1560H单元开始,
共有60个存贮单元中均存放有8位无符号整数,
试用MCS-51指令编写一源程序,
求其中低4位全为0的数据个数(例如60H,90H等),
结果存入2500H单元。
【答】:
First: MOV DPTR, #1560H ;外部数据块首址
MOV R2, #60 ;外部数据块数据个数
MOV R3, #0
Check: MOVX A, @DPTR ;读入数据指针所指的一个数
ANL A, #00001111B
JNZ Next ;低4位非全0, 查下一个
INC R3 ;低4位全0的数据个数累加
Next: INC DPTR ;数据指针加1,查下一个数
DJNZ R2, Check ;待查数据个递减1,未为0则继续查
Finish: MOV DPTR, #2500H
MOV A, R3
MOVX @DPTR,A ;低4位全为0的数据个数存入2500H单元
END
========================================
【第2题】
已知从外部数据存储器的2630H开始,
共有50个存贮单元中各存放有一个不相同的8位无符号整数,
试用MC-51指令编写一源程序,找出其中的最大值,
将该最大值存入1200H单元,
该最大值所存放单元地址低8位的存入1201H单元,
该最大值所存放单元地址高8位的存入和1202H单元。
【答】:
First: MOV DPTR, #2630H ;数据块首址
MOV R2, #50 ;数据块的单元个数
MOVX A, @DPTR
MOV R3,A ;将首个数暂存于R3
Check: INC DPTR
MOVX A, @DPTR
MOV R4, A ;将下一个数暂存于R4
CLR C ;减法运算前借位清0
SUBB A, R3 ;比较两数大小
JC Next ;若有借位,R4值<R3值, 查下一个
MOV A, R4 ;若无借位,R4值>R3值
MOV R3, A ;将较大数暂存于R3
MOV R5,DPL
MOV R6,DPH
Next: DJNZ R2,Check ;待查数据个数递减1,未为0则继续查
Finish: MOV DPTR, #1200H
MOV A, R3
MOVX @DPTR, A ;最大值存入1200H单元
INC DPTR
MOV A, R5
MOVX @DPTR, A ;最大值地址低8位存入1201H单元
INC DPTR
MOV A, R6
MOVX @DPTR, A ;最大值地址高8位存入1202H单元
END
========================================
【第3题】
已知从外部数据存储器的2650H单元开始,
共有84个存贮单元各存有一个8位有符号整数,
试用MCS-51指令编写一源程序,
求其中所有大于70H的正数之和,
结果低8位存放入1500H单元,高8位存入1501H单元。
【答】:
First: MOV DPTR,#2650H ;待查数据块首址
MOV R2,#84 ;待查数据个数
MOV R4,#0
MOV R5,#0
Check: MOVX A,@DPTR
JZ Next ;若查到某个数为0,则查下一个
MOV R3,A ;将非0的数暂存于R3
ANL A,10000000B ;检测该数的符号位
JNZ Next ;若符号位为1,是负数,查下一个
MOV A,R3 ;若符号位为0,是正数
CLR C ;减法运算前借位清0
SUBB A,#70H ;该数与70H作比较
JC Next ;若有借位,该数<70H, 查下一个
JZ Next ;若相减结果为0,该数=70H, 查下一个
MOV A,R3
CLR C
ADD A,R4 ;符合条件的数累加
MOV R4,A ;累加值低8位暂存于R4
JNC Next
INC R5 ;若低8位累有进位,则高8加1
Next: INC DPTR ;数据指针加1,查下一个数
DJNZ R2,Check ; 待查数据个递减1,未为0则继续查
Finish: MOV DPTR,#1500H
MOV A,R4
MOVX @DPTR,A ;累加结果低8位存入1500H单元
INC DPTR
MOV A,R5
MOVX @DPTR,A ;累加结果高8位存入1501H单元
END
========================================
【第4题】
已知从外部数据存储器的2940H单元开始,
共有95个存贮单元中均存放有8位无符号整数,
试用MCS-51指令编写一源程序,
求其中所有小于65H的数据之和,
结果低8位存入1400H单元,高8位存入1401H单元。
【答】:
First: MOV DPTR, #2940H ;外部数据块首址
MOV R2, #95 ;外部数据块数据个数
MOV R4, #0
MOV R5, #0
Check: MOVX A, @DPTR ;读入数据指针所指的一个数
MOV R3, A ;将该数放入R3暂存
CLR C ;减法运算前借位清0
SUBB A, #65H ;该数与65H作比较
JZ Next ;若相减结果为0,该数=65H, 查下一个
JNC Next ;若无借位,该数>65H, 查下一个
MOV A ,R3
CLR C ;加法运算前进位清0
ADD A, R4 ;符合条件的数累加
MOV R4 ,A ;累加值低8位暂存于R4
JNC NEXT
INC R5 ;若有进位,则高8位累加1
Next: INC DPTR ;数据指针加1,查下一个数
DJNZ R2, Check ;待查数据个递减1,未为0则继续查
Finish: MOV DPTR,#1400H
MOV A,R4
MOVX @DPTR,A ;累加结果低8位存入1400H单元
INC DPTR
MOV A,R5
MOVX @DPTR,A ;累加结果高8位存入1401H单元
END
========================================
|