找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 1404|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

我解答某師兄在網(wǎng)上提問(wèn)有關(guān)51單片機(jī)匯編編程的幾個(gè)習(xí)題

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:858964 發(fā)表于 2020-12-15 23:38 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
========================================
【第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
========================================


評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表