wangpeihui123 发表于 2010-9-14 15:48:29

请高手分析一下这段汇编代码

WTCON EQU 0x53000000
GPBCON EQU 0x56000010
GPBDAT EQU 0x56000014

        IMPORT main

        CODE32
        AREA Init,CODE,READONLY
       
        ;ENTRY
       
        ldr r0,=WTCON
        ldr r1,=0x00
        str r1,
       
        b main
       
        ;ldr r0,=GPBCON
        ;ldr r1,=0x155500
        ;str r1,
       
        ;ldr r0,=GPBDAT
       
;loop
       
;        ldr r1,=0x1c0
;        str r1,
;        bl delay
       
;        ldr r1,=0x1a0
;        str r1,
;        bl delay
       
;        ldr r1,=0x160
;        str r1,
;        bl delay
       
;        ldr r1,=0xe0
;        str r1,
;        bl delay
       
;        b loop
       
;delay
;        ldr r2,=0x15400
;delay1
;        subs r2,r2,#1
;        bne delay1
;        mov pc,lr
;       
        end
#include <stdio.h>
#define GPBCON (*(volatile unsigned *)0x56000010)
#define GPBDAT (*(volatile unsigned *)0x56000014)

void delay()
{
        int i=90000;
        for(i;i>=0;i--)
        ;       
}

int main()
{
        GPBCON=0x155500;
       
        while(1)
        {
                GPBDAT=0x1c0;
                delay();
                GPBDAT=0x1a0;
                delay();
                GPBDAT=0x160;
                delay();
                GPBDAT=0xe0;
                delay();
        }
}
       




这是一段流水灯的代码,本人菜鸟看不懂汇编,请高手分析一下

cumtwys 发表于 2010-9-14 16:28:08

晕死!这不是我写的代码吗??哪里看不懂了!?

cumtwys 发表于 2010-9-14 16:39:48

下面是我写的注释:
//这里其实把C的部分完全去掉,然后把汇编的部分的注释去掉效果是一样的!你可以试试!

WTCON EQU 0x53000000                //看门狗控制器的地址
GPBCON EQU 0x56000010                //POARTB的控制寄存器地址
GPBDAT EQU 0x56000014                //POARTB的寄存器地址

      IMPORT main                //相当于C语言中的引入全局变量extern

      CODE32                        //32位代码段
      AREA Init,CODE,READONLY         //定义一个代码段,ARM汇编中至少有一个代码段
      
   ;ENTRY                        //程序入口点
      
   ldr r0,=WTCON                               //这个没什么好说的了,关闭看门狗自己可以看看手册
   ldr r1,=0x00
       str r1,
      
      b main                        //跳转到main()
      
      ;ldr r0,=GPBCON
      ;ldr r1,=0x155500
      ;str r1,
      
      ;ldr r0,=GPBDAT
      
;loop
      
;      ldr r1,=0x1c0
;      str r1,
;      bl delay
      
;      ldr r1,=0x1a0
;      str r1,
;      bl delay
      
;      ldr r1,=0x160
;      str r1,
;      bl delay
      
;      ldr r1,=0xe0
;      str r1,
;      bl delay
      
;      b loop
      
;delay
;      ldr r2,=0x15400
;delay1
;      subs r2,r2,#1
;      bne delay1
;      mov pc,lr
;      
      end
#include <stdio.h>
#define GPBCON (*(volatile unsigned *)0x56000010)
#define GPBDAT (*(volatile unsigned *)0x56000014)

void delay()
{
      int i=90000;
      for(i;i>=0;i--)
      ;      
}

int main()
{
      GPBCON=0x155500;
      
      while(1)
      {
                GPBDAT=0x1c0;
                delay();
                GPBDAT=0x1a0;
                delay();
                GPBDAT=0x160;
                delay();
                GPBDAT=0xe0;
                delay();
      }
}

天嵌_support1 发表于 2010-9-14 16:43:59

1# wangpeihui123


这里没有设置一下堆栈就跳转,行么?

cumtwys 发表于 2010-9-14 16:46:06

4# embedsky_lxt
完全可以的!你可以试试!

wangpeihui123 发表于 2010-9-18 14:40:07

怎么设置一下堆栈就跳转

wangpeihui123 发表于 2010-9-18 14:44:15

为什么要设置一下堆栈就跳转

天嵌_support1 发表于 2010-9-18 15:20:27

堆栈设置好了,跳转时,PC的运行地址可以保存,等待运行完毕返回。
页: [1]
查看完整版本: 请高手分析一下这段汇编代码