标题: 我解答某师兄在网上提问有关51单片机汇编编程的几个习题 [打印本页]

作者: Kxuan163    时间: 2020-12-15 23:38
标题: 我解答某师兄在网上提问有关51单片机汇编编程的几个习题
========================================
【第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
========================================







欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1