標(biāo)題: 我解答某師兄在網(wǎng)上提問(wèn)有關(guān)51單片機(jī)匯編編程的幾個(gè)習(xí)題 [打印本頁(yè)]

作者: Kxuan163    時(shí)間: 2020-12-15 23:38
標(biāo)題: 我解答某師兄在網(wǎng)上提問(wèn)有關(guān)51單片機(jī)匯編編程的幾個(gè)習(xí)題
========================================
【第1題】
已知從外部數(shù)據(jù)存儲(chǔ)器的1560H單元開(kāi)始,
共有60個(gè)存貯單元中均存放有8位無(wú)符號(hào)整數(shù),
試用MCS-51指令編寫(xiě)一源程序,
求其中低4位全為0的數(shù)據(jù)個(gè)數(shù)(例如60H,90H等),
結(jié)果存入2500H單元。
【答】:
First:     MOV   DPTR, #1560H ;外部數(shù)據(jù)塊首址
           MOV   R2, #60      ;外部數(shù)據(jù)塊數(shù)據(jù)個(gè)數(shù)
           MOV   R3, #0
Check:     MOVX  A, @DPTR     ;讀入數(shù)據(jù)指針?biāo)傅囊粋(gè)數(shù)
           ANL   A, #00001111B         
           JNZ   Next         ;低4位非全0, 查下一個(gè)
           INC   R3           ;低4位全0的數(shù)據(jù)個(gè)數(shù)累加
Next:      INC   DPTR         ;數(shù)據(jù)指針加1,查下一個(gè)數(shù)
           DJNZ  R2, Check    ;待查數(shù)據(jù)個(gè)遞減1,未為0則繼續(xù)查
Finish:    MOV DPTR, #2500H
           MOV A, R3
           MOVX @DPTR,A       ;低4位全為0的數(shù)據(jù)個(gè)數(shù)存入2500H單元
           END
========================================
【第2題】
已知從外部數(shù)據(jù)存儲(chǔ)器的2630H開(kāi)始,
共有50個(gè)存貯單元中各存放有一個(gè)不相同的8位無(wú)符號(hào)整數(shù),
試用MC-51指令編寫(xiě)一源程序,找出其中的最大值,
將該最大值存入1200H單元,
該最大值所存放單元地址低8位的存入1201H單元,
該最大值所存放單元地址高8位的存入和1202H單元。
【答】:
First:  MOV  DPTR, #2630H  ;數(shù)據(jù)塊首址
        MOV  R2, #50       ;數(shù)據(jù)塊的單元個(gè)數(shù)
        MOVX  A, @DPTR
        MOV  R3,A          ;將首個(gè)數(shù)暫存于R3
Check:  INC  DPTR
        MOVX A, @DPTR
        MOV  R4, A         ;將下一個(gè)數(shù)暫存于R4
        CLR  C             ;減法運(yùn)算前借位清0
        SUBB A, R3         ;比較兩數(shù)大小
        JC  Next           ;若有借位,R4值<R3值, 查下一個(gè)
        MOV  A, R4         ;若無(wú)借位,R4值>R3值
        MOV  R3, A         ;將較大數(shù)暫存于R3
        MOV  R5,DPL
        MOV  R6,DPH
Next:   DJNZ  R2,Check     ;待查數(shù)據(jù)個(gè)數(shù)遞減1,未為0則繼續(xù)查
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題】
已知從外部數(shù)據(jù)存儲(chǔ)器的2650H單元開(kāi)始,
共有84個(gè)存貯單元各存有一個(gè)8位有符號(hào)整數(shù),
試用MCS-51指令編寫(xiě)一源程序,
求其中所有大于70H的正數(shù)之和,
結(jié)果低8位存放入1500H單元,高8位存入1501H單元。
【答】:
First:     MOV DPTR,#2650H ;待查數(shù)據(jù)塊首址
           MOV R2,#84      ;待查數(shù)據(jù)個(gè)數(shù)
           MOV R4,#0
           MOV R5,#0
Check:     MOVX A,@DPTR
           JZ  Next         ;若查到某個(gè)數(shù)為0,則查下一個(gè)
           MOV R3,A         ;將非0的數(shù)暫存于R3
           ANL  A,10000000B ;檢測(cè)該數(shù)的符號(hào)位
           JNZ Next         ;若符號(hào)位為1,是負(fù)數(shù),查下一個(gè)
           MOV A,R3         ;若符號(hào)位為0,是正數(shù)
           CLR C          ;減法運(yùn)算前借位清0
           SUBB A,#70H     ;該數(shù)與70H作比較
           JC Next         ;若有借位,該數(shù)<70H, 查下一個(gè)
           JZ Next         ;若相減結(jié)果為0,該數(shù)=70H, 查下一個(gè)
           MOV A,R3
           CLR C
           ADD A,R4        ;符合條件的數(shù)累加
           MOV R4,A        ;累加值低8位暫存于R4
           JNC Next        
           INC R5          ;若低8位累有進(jìn)位,則高8加1
Next:      INC DPTR        ;數(shù)據(jù)指針加1,查下一個(gè)數(shù)
           DJNZ  R2,Check  ; 待查數(shù)據(jù)個(gè)遞減1,未為0則繼續(xù)查
Finish:    MOV DPTR,#1500H
           MOV A,R4   
           MOVX @DPTR,A    ;累加結(jié)果低8位存入1500H單元
           INC DPTR
           MOV A,R5
           MOVX @DPTR,A    ;累加結(jié)果高8位存入1501H單元
           END
========================================
【第4題】
已知從外部數(shù)據(jù)存儲(chǔ)器的2940H單元開(kāi)始,
共有95個(gè)存貯單元中均存放有8位無(wú)符號(hào)整數(shù),
試用MCS-51指令編寫(xiě)一源程序,
求其中所有小于65H的數(shù)據(jù)之和,
結(jié)果低8位存入1400H單元,高8位存入1401H單元。
【答】:
First:     MOV  DPTR, #2940H ;外部數(shù)據(jù)塊首址
           MOV  R2, #95      ;外部數(shù)據(jù)塊數(shù)據(jù)個(gè)數(shù)
           MOV  R4, #0
           MOV  R5, #0
Check:     MOVX  A, @DPTR    ;讀入數(shù)據(jù)指針?biāo)傅囊粋(gè)數(shù)
           MOV  R3, A        ;將該數(shù)放入R3暫存
           CLR  C            ;減法運(yùn)算前借位清0
           SUBB A, #65H      ;該數(shù)與65H作比較
           JZ  Next          ;若相減結(jié)果為0,該數(shù)=65H, 查下一個(gè)
           JNC  Next         ;若無(wú)借位,該數(shù)>65H, 查下一個(gè)
           MOV  A ,R3
           CLR  C            ;加法運(yùn)算前進(jìn)位清0
           ADD  A, R4        ;符合條件的數(shù)累加
           MOV  R4 ,A        ;累加值低8位暫存于R4
           JNC  NEXT
           INC  R5           ;若有進(jìn)位,則高8位累加1
Next:      INC  DPTR         ;數(shù)據(jù)指針加1,查下一個(gè)數(shù)
           DJNZ  R2, Check   ;待查數(shù)據(jù)個(gè)遞減1,未為0則繼續(xù)查
Finish:    MOV DPTR,#1400H
           MOV A,R4   
           MOVX @DPTR,A     ;累加結(jié)果低8位存入1400H單元
           INC DPTR
           MOV A,R5
           MOVX @DPTR,A      ;累加結(jié)果高8位存入1401H單元
           END
========================================







歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1