您的位置: 网站首页 > 电子与嵌入式 > 单片机原理与应用 > 附录A 练习题参考答案 > 【第4章 汇编语言程序设计】

第4章 汇编语言程序设计

 

1)设有两个4BCD码,分别存放在片内RAM23H22H单元和33H32H单元中,求它们的和,并送入43H42H单元中去(以上均为低位字节,高位在高字节)。

解:      

ORG  0000H 

    LJMP START 

    ORG 0030H  

START:  MOV A,22H  

        ADD A,32H  

        DA A   

        MOV 42HA 

        MOV A,23H  

        ADDC A,33H 

        DA A   

        MOV 43H,A  

        SJMP $ 

        END

2编程将片内RAM40H60H单元中的内容送到片外RAM3000H开始的单元中。

解:

        ORG 0000H

        LJMP MAIN

        ORG 0030H

MAIN:   MOV R7,#20H

        MOV R1,#40H

        MOV DPTR,#3000H

LOOP:   MOV A,@R1

        MOVX @DPTR,A

        INC R1

        INC DPTR

        DJNZ R7,LOOP

        SJMP $

        END

3)编程计算片内RAM30H37H8个单元中数的算术平均值,结果存在3AH单元中。

解:

        ORG 0000H

        LJMP MAIN

        ORG 0030H

MAIN:   MOV R0,#30H

        MOV R1,#00H

        MOV R2,#00H

        MOV R3,#07H

LP2:    MOV A,@R0

        ADD A,R2

        MOV R2,A

        JNC LP1

        INC R1

LP1:    INC R0

        DJNZ R3,LP2

        MOV R3,#03H

LP3:    CLR C

        MOV A,R1

        RRC A

        MOV R1,A

        MOV A,R2

        RRC A

        MOV R2,A

        DJNZ R3,LP3

        MOV 3AH,R2

        SJMP $

        END

4)设有100个有符号数,连续存放在片外RAM2200H为首地址的存储区中,试编程统计其中正数、负数、零的个数。

解:

        ORG 0000H

        LJMP MAIN

        ORG 0030H

MAIN:   MOV R2,#100

        MOV R3,#00H

        MOV R4,#00H

        MOV R5,#00H

        MOV DPTR,#2000H

LOOP:   MOVX A,@DPTR

        CJNE A,#00HNET1

        INC R3

        INC DPTR

        DJNZ R2,LOOP

        SJMP NET3

NET1:   JC NET2

        INC R4

        INC DPTR

        DJNZ R2,LOOP

        SJMP NET3

NET2:   INC R5

        INC DPTR

        DJNZ R2,LOOP

NET3:   SJMP $

        END

5)试编一查表程序,从首地址为2000H、长度为9FH的数据块中找出第一个ASCIIA,将其地址送到20A0H20A1H单元中。

解:

        ORG 0000H

    LJMP MAIN

        ORG 0030H

MAIN:   LCALL SUBONE  ; SUBONE use dptr,a,30h,31h

AJMP      $

SUBONE: MOVDPTR,#2000H

LOOP:    MOVX A,@DPTR

        XRLA,#41H

        JNZTT

        MOVA,30H

        MOVDPTR,#20A0H

        MOVX @DPTR,A

        MOVDPTR,#20A1H

        MOVA,31H

        MOVX @DPTR,A

        RET

TT:     INC DPTR

        MOV 30H,DPH

        MOV 31H,DPL

        MOV A,31H

        CJNE A,#00H,LOOP

        RET

        END

6)设一个加数在50H52H单元中,另一个加数在53H55H中,进位存放在位地址00H中,试编程实现两数求和。

解法1

ORG 0000H

ONE     DATA  50H

TWO     DATA  53H

WEI     BIT   00H

MOV R0,#ONE

MOV R1,#TWO

        MOV C,WEI

CLR C

MOV R2,#3

LOOP:   MOV A,@R0

ADDC A,@R1

MOV @R0,A

INC R0

INC R1

DJNZ R2,LOOP

MOV WEI,C

SJMP $

END

解法2

        ORG 0000H

        ONE DATA  50H

        TWO DATA  53H

        WEI BIT   00H

        MOV R0,#ONE

        MOV R1,#TWO

        CLR C

        MOV R2,#3

        SETB RS0

        MOV R0,#58H

        CLR RS0

LOOP:    MOV A,@R0

        ADDC A,@R1

        INC R0

        INC R1

        SETB RS0

        MOV @R0,A

        INC R0

        CLR RS0

        DJNZ R2,LOOP

        MOV WEI,C

        SJMP $

        END

7)设自变量x为一无符号数,存放在内部RAMVAX单元,函数y存放在FUNC单元,请编出满足如下关系的程序:

                              x     x50                              

                        y=   5x     50> x20                     

                             2x     x <20                      

解:

        ORG 0000H

VAX    EQU  30H

FUNC    EQU  31H

        MOV VAX,#55;15;20;25;50;55

        MOV A,VAX

        CJNE A,#20,DO1

DO1:    JNC  DO2

        MOV B,#2

        MUL AB

        SJMP MEM

DO2:    CJNE A,#50,DO3

DO3:    JNC  MEM

        MOV B,#5

        MUL AB

MEM:    MOV FUNC,A             

        SJMP $

        END

8)在内部RAM中,有一个以BLOCK为始址的数据块,块长在LEN单元。请用查表指令编一程序,先检查它们若是16进制中的AF,则把它们变为ASCⅡ码;若不是,则把它们变为00H

解:

        BLOCK EQU 31H

        LEN EQU 30H

        N EQU 30

        ORG 0000H

        MOV R0,#BLOCK

        MOV LEN,#N

        MOV R2,LEN

LOOP:   MOV A,@R0

        CJNE A,#0AH,DO1

DO1:    JNC DO2

        SJMP DO5

DO2:    CJNE A,#0FH,DO3

        SJMP DO4

DO3:    JC  DO4

DO5:    MOV A,#0

        SJMP NEXT      

DO4:    MOV DPTR,#TAB

        CLR C

        SUBB A,#0AH

        MOVC A,@A+DPTR

NEXT:   MOV @R0,A

        INC R0

        DJNZ R2,LOOP

        SJMP $

TAB:    DB 'A','B','C','D','E','F'

        END

9)试编写程序,查找在内部RAM30H50H单元中是否有0AAH这一数据。若有,则将51H单元置为“01H”;若未找到,则将51H单元置为“00H”。

答:

        START:  MOVR0,#30H

                MOVR2,#20H

        LOOP:   MOVA,@R0

                CJNE A,#0AAH,NEXT

                MOV51H,#01H

                LJMP EXIT

        NEXT:   INC R0

                DJNZ R2,LOOP

                MOV51H,#00H

        EXIT:   RET

10)试编写程序,查找在内部RAM20H40H单元中出现“00H”这一数据的次数,并将查找到的结果存入41H单元。

答:

        START:  MOV41H,#0

                MOVR0,#20H

                MOVR2,#20H

        LOOP:   MOVA,@R0

                JNZ NEXT

                INC 41H

        NEXT:   INC R0

                DJNZ R2,LOOP

                RET

11)若SP=60H,标号LABEL所在的地址为3456HLCALL指令的地址为2000H,执行指令:2000H     LCALL       LABEL后,堆栈指针SP和堆栈内容发生了什么变化?PC的值等于什么?如果将指令LCALL直接换成ACALL是否可以?如果换成ACALL指令,可调用的地址范围是什么?

答:SP=SP+1=61H61H=PC的低字节=03HSP=SP+1=62H62H=PC的高字节=20H

       PC=3456H

       可以。

       2KB=2048B