登录站点

用户名

密码

ARM926EJ-S上调试的汇编代码,有注释

已有 2524 次阅读  2010-02-05 10:54   标签注释  汇编  代码  调试 
 
COUNT          EQU     0x40003100
ADDRESS                             EQU     0x00009000
CONSTANT                            EQU     0x12345678
ADDRESSONE       EQU     0x80018
ADDRESSTWO       EQU  0x80014
ADDRESSTHE       EQU  0x80010
         
         
         
         AREA   Example2,CODE, READONLY
         ENTRY
         CODE32
         
;START        LDR  R1, =COUNT
;         MOV  R0,#0
;         STR  R0,[R1]
;         
         
;LOOP        LDR  R1,=COUNT
;         LDRB  R0,[R1]
;         ADD     R0,R0,#1
;         CMP  R0,#10
;         MOVHS R0,#0
;         STRB     R0,[R1]
;         
;         
;         B       LOOP
  
                ;PC=0x0000800C
;         SUB  R1,pc,#4 ;R1中存放下面STR指令的地址          ;PC=0x00008010,R1=0x00008010
;         STR  pc,[R0]  ;将PC=STR指令地址+offset保存到R0中    ;PC=0x00008014,R0=0x0000000
;         LDR  R0,[R0]    ;;PC=0x00008018,R0=0x000801C
;         SUB  R0,R0,R1  ;offset=PC-STR地址   ;
;                ;;PC=0x0000801C,R0=0x000000C
;         CMP  R0,#10    
;
;---------------------------------------------------------------------------------------------------------
;交换指令
 ;        mem32[0x9000]=0x12345678
 ;        r0=0x00000000
 ;        r1=0x11112222
 ;        r2=0x00009000

;         LDR  R3,=ADDRESS
;         LDR  R4,=CONSTANT
;         STR  R4,[R3]
;
;
;         MOV  R0,#0x00000000
;         LDR  R1,=0x11112222
;         MOV  R2,#0x00009000         
;         
;         SWP  R0,R1,[R2]
;---------------------------------------------------------------------------------------------------------
;LDM|STM指令         
         
         LDR  R1, =0x80018
         MOV  R0,#0x03
         STR  R0,[R1]
         
         LDR  R1, =ADDRESSTWO
         MOV  R0,#0x02
         STR  R0,[R1]
         
         LDR  R1, =ADDRESSTHE 
         MOV  R0,#0x01
         STR  R0,[R1]
            
         
         
         LDR  r0,=0x00080010
         LDR  r1,=0x00000000
         LDR  r2,=0x00000000
         LDR  r3,=0x00000000
         
         LDMIA r0!,{r1-r3}
         
         LDR   R12,=0xFF
         STR   r12,[r0],#8
         
        ; LDMFD r13!,{r1,pc}^
        
;------------------------------------------------------------------------------------------------------------
;MRC,MCR,协处理器的使用
         ;操作前,协处理器的内容:
         ;MCR   p15,0,r4,c1,c0,0   ;Bad register name symbol
         
         ;操作后,协处理器的内容:
         
         ;MRC   p15,0,r0,c0,c0,1     ;Bad register name symbol
         
         
        ; MRC   p15,0,r0,c1,c0,0  ;Bad register name symbol
         
         
         ;MCR   p15,0,r0,c1,0,0     ;Bad register name symbol
         ;--------------------------------------------
         ;把一个CP15寄存器拷贝到一个通用寄存器
         ;把协处理器CP15寄存器C0的内容拷贝到r10
         MRC  p15,0,r10,c0,c0,0
         
         ;把CP15的控制寄存器c1写到内核寄存器r1中
         MRC   p15,0,r1,c1,c0,0
         ;通过MRC指令可以将寄存器C1中的值读取到ARM寄存器R0中
         MRC  p15,0,R0,c1,c0,0
         ;;通过MCR指令可以将ARM寄存器R0中的值写入到寄存器C1中
         MCR  p15,0,r0,c1,c0,0
         
         ;禁止/使能MMU
         MRC  p15,0,r0,c1,c0,0
         ORR  r0,r0,#0x01
         MCR  p15,0,r0,c1,c0,0          ;使能MMU
        ;-------------------------------------------- 
        ;-------------------------------------------- 
         ;系统控制协处理器CP15的寄存器c8就是用来控制清除TLB内容相关的操作,
         ;它是一个只写寄存器。使用MRC指令读取该寄存器,将产生不可预知的结果
         ;使用MCR指令来写该寄存器,具体格式如下
         ;MCR  p15,0,Rd,c8,CRm<,opcode_2>
         
         MCR  p15,0,r0,c8,c7,0          ;清除cache,即清除I-cache和D-cache
         
         MCR  p15,0,r0,c8,c7,1
         
         MCR  p15,0,r0,c8,c5,0   ;清除指令cache
         
         MCR  p15,0,r0,c8,c5,1
         
         MCR  p15,0,r0,c8,c6,0   ;清除数据cache
         
         MCR  p15,0,r0,c8,c6,1
         ;--------------------------------------------
         
         ;--------------------------------------------
         ;使用路和组索引寻址清理cache的CP15:c7寄存器命令
         MCR   p15,0,r0,c7,c5,2  ;清除指令cache行
         
         
         MCR   p15,0,r0,c7,c6,2  ;清除数据cache行
         
         
         MCR   p15,0,r0,c7,c10,2  ;清理数据cache行
         
         MCR   p15,0,r0,c7,c14,2  ;清理并清除数据cache行
         
         ;--------------------------------------------
         
         ;--------------------------------------------
         ;测试清理单一D-cache的命令
         ;MCR   p15,0,PC,c7,c10,3      ;undefined effect(use of PC/PSR)
         
         ;MCR   p15,0,pc,c7,c14,3       ;undefined effect(use of PC/PSR)
         
         
         
         ;--------------------------------------------
Rd       RN      0;            Rd或者定义一个虚拟地址         
         ;通过主存中所对应的地址清理和清除一个cache行的命令
         MCR   p15,0,Rd,c7,c5,1              ;清除指令cache行
         
         MCR   p15,0,Rd,c7,c6,1    ;清除数据cache行
         
         MCR   p15,0,Rd,c7,c10,1    ;清理数据cache行
         
         
         MCR   p15,0,Rd,c7,c14,1    ;清理并清除数据cache行
         ;--------------------------------------------
                 
         ;--------------------------------------------
         ;通过访问路,在cache中锁定数据的命令
         MRC  p15,0,Rd,c9,c0,0  ;读D-cache锁定基
         
         MCR     p15,0,Rd,c9,c0,0  ;写D-cache锁定基
         
         MRC     p15,0,Rd,c9,c0,1  ;读I-cache锁定基
         
         MCR     p15,0,Rd,c9,c0,1  ;写I-cache锁定基
         ;--------------------------------------------
         
         ;--------------------------------------------
         ;使用锁定位锁定cache的CP15:c9命令
         MRC  p15,0,Rd,c9,c0,1  ;读I-cache锁定页寄存器
         MRC  p15,0,Rd,c9,c0,0  ;读D-cache锁定页寄存器
         MCR     p15,0,Rd,c9,c0,1  ;写I-cache锁定页寄存器
         MCR     p15,0,Rd,c9,c0,0  ;写D-cache锁定页寄存器
         MCR     p15,0,Rd,c7,c13,1  ;装载某一地址的代码cache行
         
         
         ;--------------------------------------------
         ;快速上下文切换技术编程接口
         MCR   p15,0,Rd,c13,c0,0
         
         MRC   p15,0,Rd,c13,c0,0
         
         
         ;--------------------------------------------
         ;下面的代码段将寄存器R0中的数据存储方式转换成另外一种
         LDR   R0,=0xABCD
         EOR   R1,R0,R0,ROR#16
         BIC   R1,R1,#0xFF0000
         MOV   R0,R0,ROR#8
         EOR   R0,R0,R1,LSR #8
         ;编码逻辑有错误,修该如下
         
         
         
         
         ;--------------------------------------------
         ;下面的代码段用于转换大量的字数据的存储方式
         LDR   R0,=0x0000ABCD
         MOV   R2,#0xFF
         ORR   R2,R2,#0xFF0000
         
         ;重复下面的指令段,实现数据的存放方式的转换
         AND   R1,R2,R0
         AND   R0,R2,R0,ROR #24
         ORR   R0,R0,R1,ROR #8
         
         AND   R1,R2,R0
         AND   R0,R2,R0,ROR #24
         ORR   R0,R0,R1,ROR #8         
         ;编码逻辑有错误,修该如下
         
         
         
         
         ;--------------------------------------------
         ;下面的代码测试是否连接了C++库,并根据结果执行不同的代码
         AREA   Example, CODE, READONLY
         EXTERN    __CPP_INITIALIZE[WEAK];   如果连接了C++库则读取
                 ;函数__CPP_INITIALIZE地址
         LDR  r0,__CPP_INITIALIZE
         CMP  r0,#0       ; Test of zero
         BEQ  nocplusplus      ;如果没有连接C++库,则跳转到nocplusplus
         
nocplusplus       ADC  r0,r1,r2
         ;上面这段代码有错误
         ;--------------------------------------------
         
         
         ;--------------------------------------------
         
         
         
         
         
         ;--------------------------------------------
         
         
         
         
         ;--------------------------------------------
         
         
         
         
         ;--------------------------------------------
         
         
         
         
         ;--------------------------------------------
         
         
         
         
         ;--------------------------------------------
         
         
         
         ;--------------------------------------------

         CMP  r0,r1         
                
         END                  

上一篇: VHDL编写的比较器 下一篇: 堆栈操作

分享 举报