嵌入式程序结构编程 汇编(一)

本实验操作平台 KEIL5MDK AT89S51/52

1、在内部数据存储器BLOCK为首地址的缓冲区中存放有一组带符号数,数的个数已在LEN单元中,请编程实现:统计其中的正数和负数的个数并存入NUM和NUM+1单元中。

	  BLOCK   EQU   30H
	  LEN     EQU   20H
	  NUM     EQU   21H
	  ORG     0000H
	  CLR     NUM
	  CLR     LEN
	  MOV     R1,   #BLOCK     	
      MOV     30H,  #67
      MOV     31H,  #-4
      MOV     32H,  #5
      MOV     33H,  #-1
      MOV     34H,  #9
      MOV     35H,  #10	  
	  MOV     LEN,  #6      ;数的个数
 LOOP:CLR     A
      MOV     A,    @R1
      JB      ACC.7,FUNC1      ;位是1,则跳到FUNC1  负数
	  INC     NUM
   M1:INC     R1
	  DJNZ    LEN,   LOOP    ;(LEN-1)->LEN
	  SJMP    $
FUNC1:INC     NUM+1
      SJMP    M1
	  ;SJMP    $ 		  
      END

2、设自变量X为一无符号数,存放在内部数据存储器的VAX单元,函数Y存放在FUNC单元,请编写满足如下关系的程序:
当x>=50时 y=x;
当50>x>=20时 y=5x;
当x<20时 y=2x。

     VAX    EQU   30H
	  FUNC   EQU   40H
	  ORG    0000H
	  MOV    VAX,  #30         ;x为无符号数
	  MOV    A,    VAX
	  CJNE   A,    #50,FUNC1   ;若A即X不等于50则跳转到FUNC1
FUNC1:JC     FUNC2       ;小于50则跳到FUNC2
      SJMP   FUNC4       ;转移到FUNC4	  
FUNC2:CJNE   A,    #20,NEXT
 NEXT:JC     FUNC3        ;小于20则跳到FUNC3
      MOV    B,    #5
	  MUL    AB
	  SJMP   FUNC4
FUNC3:MOV    B,    #2
      MUL    AB           ;A存数的低8位,足够大不会溢出            
FUNC4:MOV    FUNC, A      ; y的结果     
	  SJMP   $
	  END 

3、在外部数据存储器从2000H到2010H地址单元中存放有一数据块,请将它们分别传送至2100H单元到2110H单元中。

      LEN    EQU     20H    ;单片机型号AT89S51/52
      ORG    0000H
	  CLR    A
	  MOV    LEN,    #17
	  MOV    DPTR,   #2000H
	  MOV    A,      #2
LOOP0:MOVX   @DPTR,  A
	  INC    A
	  INC    DPTR
	  DJNZ   LEN,    LOOP0		  
	  CLR    A
      MOV    LEN,    #17
      MOV    DPTR,   #2100H ;默认为DPTR0指针,指向2100h
	  ORL    0A2H,   #01    ;AUXR1寄存器的DPS位为1,选择DPTR1
	  MOV    DPTR,   #2000H ;DPTR1
LOOP1:MOVX   A,      @DPTR  ;2000H中的数据
      INC    DPTR           ;DPTR1加一
	  ANL    0A2H,   #0FEH  ;DPTR0->2100H
	  MOVX   @DPTR,  A      ;数据传到2100H
	  INC    DPTR           ;DPTR0加一
	  ORL    0A2H,   #01H   ;DPTR1
	  DJNZ   LEN,    LOOP1
	  SJMP   $
	  END

4、在内部数据存储器以BLOCK为始址的10个单元中,找出其最小值并把它送入MIN单元。

      BLOCK   EQU    30H
	  MIN     EQU    21H
	  LEN     EQU    20H
	  ORG     0000H
	  MOV     LEN,   #10 
	  CLR     A
	  MOV     R0,    #BLOCK   		  ;数据首地址
	  MOV     R1,    #22H
	  MOV     DPTR,  #30H
LOOP0:MOV     @R1,    A
      MOVC    A,     @A+DPTR  
	  MOV     @R0,    A
      INC     R0
	  MOV     A,     @R1
      INC     A
      DJNZ    LEN,   LOOP0
      MOV     A,     30H	
      MOV     R0,    #BLOCK	  
      MOV     LEN,   #10	  
LOOP1:CLR     C
      SUBB    A,     @R0   ;带进位减法
	  JB      ACC.7, M1    ;最高位符号位,是1,负数,A<R0 则跳到M1
	  MOV     A,     @R0   ;大于初始值,调换位置
	  SJMP    M2
   M1:ADD     A,     @R0	;恢复原来的小值  
   M2:INC     R0
      DJNZ    LEN,   LOOP1
	  MOV     MIN,   A
      SJMP    $
	  ORG     30H
      DB 5,9,23,54,4,4,02H,2,56,32
      END

5、将8051片内的数据存储器20H单元、21H单元中存放的单字节二进制数,转化为ASCII码,存放在30H~33H单元中,(要求将ASCII码转换部分设计为子程序)。

      ORG    0000H
	  MOV    20H,    #2AH   ;ASCII从低到高  41(A) 32(2) 35(5) 42(B)
	  MOV    21H,    #0B5H
	  MOV    A,      20H
	  ANL    A,      #0FH   ;取a的低四位
      ACALL  ASC1
	  MOV    30H,    A       ;把A中的ASCII码传给30h
	  MOV    A,      20H
	  ANL    A,      #0F0H   ;取高四位
	  SWAP   A     ;低四位和高四位交换位置
	  ACALL  ASC1
	  MOV    31H,    A
	  MOV    A,      21H
	  ANL    A,      #0FH
	  ACALL  ASC1
	  MOV    32H,    A
	  MOV    A,      21H
	  ANL    A,      #0F0H
	  SWAP   A
	  ACALL  ASC1
	  MOV    33H,    A    	  
	  SJMP   $
 ASC1:CJNE   A,      #10,   FUNC1  ;ASCII码转换子程序
FUNC1:JC     FUNC2
      ADD    A,      #7H   ;大于等于10执行此操作
FUNC2:ADD    A,      #30H  ;30~39h 41~46h对应0~9 A~F
      RET
      END 

6*、设8051单片机外部数据存储器从1000H单元开始存放有10个无符号8位二进制数,要求编一子程序将他们从大到小依次存入片内数据存储器从10H开始的存储区。

7*、在内部数据存储器以BLOCK开始的存储区中有10个单字节十进制数(每个字节有两个BCD数),请编程求BCD数的和(和为三位的BCD数),并把和存放在SUM和SUM+1单元(SUM为低字节)。(待做)

你可能感兴趣的:(嵌入式程序结构编程 汇编(一))