嵌入式原理实验代码集合

=============================================================
实验一
		AREA Examplel,CODE,READONLY;声明代码段
   		ENTRY					   ;标识程序入口
   		CODE32					   ;声明32位ARM指令
START	MOV R0,#15                 ;设置参数
		MOV R1,#8						
		ADDS R0,R0,R1			   ;R0=R0+R1
		B START
		END

=========================================================================

  实验二

=========================================================================
实验二  汇编指令实验1
COUNT EQU 0x40003100                  ;定义一个变量,地址为0x40003100
      AREA Example2,CODE,READONLY     ;声明代码段Example2
      ENTRY                           ;标识程序入口
      CODE32                          ;声明32位ARM指令
START LDR R1,=COUNT                   ;R1<=COUNT
      MOV R0,#0                       ;R0<=0
      STR R0,[R1]                     ;[R1]<=R0

LOOP  LDR R1,=COUNT
      LDR R0,[R1]                     ;R0<=[R1]
      ADD R0,R0,#1                    ;R0<=R0+1
      CMP R0,#10                      ;R0与10比较,影响条件码标志
      MOVHS R0,#0                     ;若R0大于等于10.执行R0<=0
      STR R0,[R1]                     ;[R1]<=R0,即保存COUNT

      B  LOOP

      END

  

实验二思考题:

思考题:第五题:
COUNT EQU 0x40003400                  ;定义一个变量,地址为0x40003400
      AREA Example2,CODE,READONLY     ;声明代码段Example2
      ENTRY                           ;标识程序入口
      CODE32                          ;声明32位ARM指令
START LDR R1,=COUNT                   ;R1<=COUNT
      MOV R0,#80                       ;R0<=80
      STR R0,[R1]                     ;[R1]<=R0
 
LOOP  LDR R1,=COUNT
      LDR R0,[R1]                     ;R0<=[R1]
      SUB R0,R0,#2                    ;R0<=R0-2
      CMP R0,#60                      ;R0与60比较,影响条件码标志
      MOVLO R0,#80                     ;若R0大于等于60.执行R0<=80
      STR R0,[R1]                     ;[R1]<=R0,即保存COUNT
 
      B  LOOP
 
      END

思考题第六题
COUNT EQU 0x40003400                  ;定义一个变量,地址为0x40003400
      AREA Example2,CODE,READONLY     ;声明代码段Example2
      ENTRY                           ;标识程序入口
      CODE32                          ;声明32位ARM指令
START LDR R1,=COUNT                   ;R1<=COUNT
      LDR R0,=0xAA11BB22                       ;R0<=0xAA11BB22
      STR R0,[R1]                     ;[R1]<=R0
 
      LDR R1,=COUNT
      LDR R0,[R1]
      LDRH R0,[R1]
      LDRSH R0,[R1]
      LDRB R0,[R1]
      LDRSB R0,[R1]
      LDR R0,=0xFFFFFFCC

      STRB  R0,[R1]
      STRH  R0,[R1]
      STR     R0,[R1]

      B  START
 
      END

 

 

实验三 汇编指令实验2

X        EQU        11        ;定义X的值为11
Y        EQU        8        ;定义Y的值为8
BIT23   EQU     (1<<23) ;定义BIT23的值为0x00800000
        AREA    Example3,CODE,READONLY        ;声明代码段Example3
        ENTRY                                ;标识程序入口
        CODE32                                ;声明32位ARM指令

START        ;使用MOV,ADD指令实现:R8=R3=X+Y
        MOV    R0,#X            ;R0<-X,X的值必须是8位图数据
        MOV    R1,#Y            ;R1<-Y,Y的值必须是8位图数据
        ADD    R3,R0,R1            ;R3=X+Y
        MOV    R8,R3            ;R8<=R3

        ;使用MVN,SUB指令实现:R5=0x5FFFFFF8-R8*8
        MVN    R0,#0xA0000007        ;0xA0000007的反码为0x5FFFFFF8
        SUB    R5,R0,R8,LSL #3      ;R8左移3位,结果是R8*8

        ;使用CMP指令判断(5*Y/2)>(2*X)吗?
        ;若大于则R5=R5&0xFFFF0000,否则R5=R5|0x000000FF 
        MOV    R0,#Y
        ADD    R0,R0,R0,LSL,#2        ;计算R0=Y+4*Y=5*Y
        MOV    R0,R0,LSR #1         ;计算R0=5*Y/2
        MOV    R1,#X
        MOV    R1,R1,LSL #1            ;计算R1=2*X
        CMP    R0,R1                ;比较R0和R1
        LDRHI  R2,=0xFFFF0000
        ANDHI  R5,R5,R2
        ORRLS  R5,R5,#0x00000FF

        ;使用TST指令测试R5的bit32是否为1
        ;若是则将bit6位清零(使用BIC指令)
        TST R5,#BIT23
        BICNE R5,R5,#0x0000040

        B    START

        END

 

实验三思考题:

 

 

实验四 汇编指令实验3
实验的目的
使用ARM汇编指令实现结构化程序编程
1 使用ARM汇编指令实现 if 条件执行
2 使用ARM汇编指令实现 for 循环结构
3 使用ARM汇编指令实现 while 循环结构
4 使用ARM汇编指令实现 do...while 循环结构
5 使用ARM汇编指令实现 switch 开关结构

 

1 使用ARM汇编指令实现 if 条件执行

第一个案例 if结构
;if(x>y)
;    z=100;
;else
;    z=50;
;设x为R0,y为R1,z为R2(x,y,z均为无符号整数)
        AREA Example4,CODE,READONLY;声明代码段 Example4
        ENTRY;
CODE32    ;声明32位ARM指令 START MOV R0,#
76;初始化x的值 MOV R1,#234;初始化y的值 CMP R0,R1;判断x>y MOVHI R2,#100;x>y条件正确,z=100 MOVLS R2,#50;条件失败,z=50

 

2 使用ARM汇编指令实现 for 循环结构

二案例 for结构
;forIi==0;i<10;i++)
;{
;x++    
;}
;设x为R0,i为R2(i,x均为无符号整数)
        AREA Example5,CODE,READONLY;声明代码段 Example5
        ENTRY;
CODE32    ;声明32位ARM指令 MOV R0,#
0;初始化x的值 MOV R2,#0;设置i=0 FOR_L1 CMP R2,#10;判断i<10? BHS FOR_END;若条件失败,退出循环 ADD R0,R0,#1;循环体,X++ ADD R2,R2,#1;i++ B FOR_L1 FOR_END NOP

 

 

3 使用ARM汇编指令实现 while 循环结构

第三个案例 while结构
;while(x<y)
;{
;x*=2    
;}
;设x为R0,y为R1(x,y均为无符号整数)

            AREA Example6,CODE,READONLY;声明代码段 Example6
            ENTRY;
CODE32    ;声明32位ARM指令 MOV R0,#
1;初始化x的值 MOV R2,#20;初始化y的值 B WHILE_L2;首先要盘判断条件 WHILE_L1 MOV R0,R0,LSL #1;循环体,x*=2 WHILE_L2 CMP R0,R1;判断x<=y BLS WHILE_L1;若条件正确,继续循环 WHILE_END NOP

 

 

4 使用ARM汇编指令实现 do...while 循环结构

第四个案例 do....while()结构
;do
;{
;x--;    
;}while(x>0)
;设x为R0,(x为无符号整数)
            AREA Example6,CODE,READONLY;声明代码段 Example6
            ENTRY;
CODE32    ;声明32位ARM指令 MOV R0,#
5;初始化x的值 DOWHILE_L1 ADD R0,R0,#-1;循环体,x--; DOWHILE_L2 MOVS R0,R0;R0<=R0,并且影响条件标志 BNE DOWHILE_L1;若R0不为0(即x不为0)继续循环 DOWHILE_END NOP

 

 

5 使用ARM汇编指令实现 switch 开关结构

 

第五个案例 switch
;switch(key&0x0F)
;{
;   case 0:
;    case 2:
;    case 3:x=key+y;
;           break;
;   case 5:x=key-y;
;           break;
;   case 7:x=key*y;
;           break;
;   default x=168;
;           break;    
;}
;设x为R0,y为R1,key为R2(x,y,key均为无符号整数)
            AREA Example6,CODE,READONLY;声明代码段 Example6
            ENTRY;
CODE32    ;声明32位ARM指令 MOV R1,#
3;初始化y的值 MOV R2,#2;初始化key的值 SWITCH AND R2,R2,#0x0F;switch(key&0x0F) CASE_0 CMP R2,#0;case 0: CASE_2 CMPNE R2,#2;case 2: CASE_3 CMPNE R2,#3;case 3: BNE CASE_5 ADD R0,R2,R1;x=key+y B SWITCH_END;break; CASE_5 CMP R2,#5;case 5: BNE CASE_7 SUB R0,R2,R1;x=key-y B SWITCH_END;break; CASE_7 CMP R2,#7;case 7: BNE DEFAULT MUL R0,R2,R1;x=key*y B SWITCH_END;break DEFAULT MOV R0,#168default x=168 SWITCH_END NOP HALT B HALT END

 

实验四思考题:

 

;if(x>80){
;    if(x>90){
;      z=4;
;    }else{
;      z=3;
;   }
;}else{
;    if(x>70){
;      z=2;
;    }else{
;      if(x>=60) z=1;
      else z=0;
;   }
;}
;设x为R0,z为R2(x,z均为无符号整数)
        AREA Example4,CODE,READONLY;声明代码段 Example4
        ENTRY;
        CODE32                       ;声明32位ARM指令
START    MOV  R0,#76;初始化x的值
        CMP  R0,#80;x与80比较
        BHS  IF_L1;大于或者等于80的时候
        BLO  IF_L2;小于80的时候
IF_L1   CMP  R0,#90;x与90比较
        MOVHS R2,#4;大于等于90的时候对z=4
        MOVLO R2,#3;大于80小于90的时候z=3
IF_L2   CMP R0,#70;x与70比较
        MOVHS R2,#2
        CMPLO R0,#60;
        MOVHS R2,#1;
        MOVLO R2,#0;

HALT     B HALT
         END

 

 

 

  • 2
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

欲游山河十万里

你的鼓励是我们创作的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值