========================================
【第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
========================================
|