microcreat 发表于 2011-10-26 09:52:15

关于stm32用gcc来编译多个文件的问题:

以下是2个汇编文件:
/*test.S*/
.equ STACK_TOP, 0x20000800
.equ BIT1, 0x00000002
.equ BIT2, 0x00000004
.equ BIT5, 0x00000020
.equ BIT6, 0x00000040
.equ BIT8, 0x00000100
.equ BIT9, 0x00000200

.equ LED1, BIT1
.equ LED2, BIT6
.equ LED3, BIT8

.equ GPIOA, 0X40010800
.equ GPIOA_CRL, 0X40010800
.equ GPIOA_CRH, 0X40010804
.equ GPIOA_IDR, 0X40010808
.equ GPIOA_ODR, 0X4001080C
.equ GPIOA_BSRR, 0X40010810
.equ GPIOA_BRR, 0X40010814
.equ IOPAEN, BIT2   
.equ RCC_APB2ENR, 0X40021018

.equ __initial_sp, 0x20000400

.text
      .global _start

      .code 16
      .syntax unified

      .type start, function

_start:
      .word STACK_TOP   
      .word 0x08000000 + 0x09
      b       reset   

.globl _TEXT_BASE
_TEXT_BASE:
      .word 0x08000000

.globl _armboot_start
_armboot_start:
        .word _start

reset:
      /*.word STACK_TOP   
      .word 0x08000000 + 0x09*/
      ldr   r1,=RCC_APB2ENR
      ldr   r0,   
      ldr   r2,=IOPAEN
      orr   r0,r2
      str   r0,

      ldr   r1,=GPIOA_CRL
      ldr   r2,=0x33333333
      str   r2,
loop:
      mov   r0,#0x00000002
      ldr   r1,=GPIOA_BRR
      str   r0,

      bl        delay

      mov   r0,#0x00000040
      ldr   r1,=GPIOA_BSRR
      str   r0,

      bl        delay

      mov   r0,#0x00000002
      ldr   r1,=GPIOA_BSRR
      str   r0,

      bl        delay

      mov   r0,#0x00000040
      ldr   r1,=GPIOA_BRR
      str   r0,

      bl        delay

      b        loop


#delay.S#
.globl delay
delay:
      push    {r1}

delay_loop0:
      sub    r0,#1
      movw   r1,#2240
delay_loop1:
      sub    r1,#1
      nop
      cmp    r1,#0
      bne    delay_loop1
      cmp    r0,#0
      bne    delay_loop0

      pop    {r1}
      bx   lr

#test.ld
/**/
SECTIONS
{
    . = 0x0; /* 从0x00000000开始*/

    .text : {
      /**(vectors) *//* 向量表*/
    test.o        (.text)
      *(.text) /* 程序代码*/
      /**(.rodata) *//* 只读数据*/
    }

    . = 0x20000000; /* 从0x20000000开始*/
    .data : {
    *(.data) /* 数据存储器*/
    }
   
    .bss : {
    *(.bss) /* 预留的数据存储器,必须初始化为零*/
    }
}

#makefile
PRO_NAME = test

SRCS = test.S delay.S

OBJS = test.o

LDS = test.ld



COMPILE_CROSS = arm-none-eabi-



PRO_OUT= $(PRO_NAME).out

PRO_BIN= $(PRO_NAME).bin

PRO_LIST = $(PRO_NAME).list



AS = $(COMPILE_CROSS)as

ASFLAGS= -mcpu=cortex-m3 -mthumb



LD = $(COMPILE_CROSS)ld

LDFLAGS = -T $(LDS)



OBJCP = $(COMPILE_CROSS)objcopy

OBJCPFLAGS = -O binary



OBJDUMP = $(COMPILE_CROSS)objdump

DUMPFLAGS = -S



all: $(PRO_BIN) $(PRO_LIST) $(PRO_OUT)



$(PRO_BIN): $(PRO_OUT)

        $(OBJCP) $(OBJCPFLAGS) $< $@



$(PRO_LIST): $(PRO_OUT)

        $(OBJDUMP) $(DUMPFLAGS) $< > $@



$(PRO_OUT): $(OBJS)

        $(LD) $(LDFLAGS) -o $@ $<

        readelf -S $@



$(OBJS): $(SRCS)

        $(AS) $(ASFLAGS) $? -o $@



.PHONY : clean

clean:

        -rm -rf *.o *out *bin *.list

编译后,程序不能运行:
以下是反汇编:

test.out:   file format elf32-littlearm


Disassembly of section .text:

00000000 <_start>:
   0:        0800              .short        0x0800
   2:        2000              .short        0x2000
   4:        08000009         .word        0x08000009
   8:        e003              b.n        12 <reset>

0000000a <_TEXT_BASE>:
   a:        0000              .short        0x0000
   c:        0800              .short        0x0800

0000000e <_armboot_start>:
   e:        0000              .short        0x0000
        ...

00000012 <reset>:
12:        4911              ldr        r1,         (58 <BIT6+0x18>)
14:        6808              ldr        r0,
16:        4a11              ldr        r2,         (5c <BIT6+0x1c>)
18:        ea40 0002         orr.w        r0, r0, r2
1c:        6008              str        r0,
1e:        4910              ldr        r1,         (60 <BIT6+0x20>)
20:        4a10              ldr        r2,         (64 <BIT6+0x24>)
22:        600a              str        r2,

00000024 <loop>:
24:        f04f 0002         mov.w        r0, #2        ; 0x2
28:        490f              ldr        r1,         (68 <BIT6+0x28>)
2a:        6008              str        r0,
2c:        f000 e820         blx        70 <delay>
30:        f04f 0040         mov.w        r0, #64        ; 0x40
34:        490d              ldr        r1,         (6c <BIT6+0x2c>)
36:        6008              str        r0,
38:        f000 e81a         blx        70 <delay>
3c:        f04f 0002         mov.w        r0, #2        ; 0x2
40:        490a              ldr        r1,         (6c <BIT6+0x2c>)
42:        6008              str        r0,
44:        f000 e814         blx        70 <delay>
48:        f04f 0040         mov.w        r0, #64        ; 0x40
4c:        4906              ldr        r1,         (68 <BIT6+0x28>)
4e:        6008              str        r0,
50:        f000 e80e         blx        70 <delay>
54:        e7e6              b.n        24 <loop>
56:        0000              .short        0x0000
58:        40021018         .word        0x40021018
5c:        00000004         .word        0x00000004
60:        40010800         .word        0x40010800
64:        33333333         .word        0x33333333
68:        40010814         .word        0x40010814
6c:        40010810         .word        0x40010810

00000070 <delay>:
70:        b402              push        {r1}

00000072 <delay_loop0>:
72:        f1a0 0001         sub.w        r0, r0, #1        ; 0x1
76:        f640 01c0         movw        r1, #2240        ; 0x8c0

0000007a <delay_loop1>:
7a:        f1a1 0101         sub.w        r1, r1, #1        ; 0x1
7e:        bf00              nop
80:        2900              cmp        r1, #0
82:        d1fa              bne.n        7a <delay_loop1>
84:        2800              cmp        r0, #0
86:        d1f4              bne.n        72 <delay_loop0>
88:        bc02              pop        {r1}
8a:        4770              bx        lr

请问这个是我哪里没有注意呢?

microcreat 发表于 2011-10-26 14:47:17

ding !

microcreat 发表于 2011-10-26 16:31:04

ding !

luo496724812 发表于 2011-10-26 16:40:44

_start:
      .word STACK_TOP   
      .word 0x08000000 + 0x09
      b       reset   

感觉是这段有问题
你的程序入口应该是_start吧,开头的是两个数据而不是指令,怎么能执行呢,你把b reset 放在_start:之后紧挨着试试

microcreat 发表于 2011-10-26 16:42:36

那样放了之后程序都跑不起来了!

microcreat 发表于 2011-10-26 16:51:48

/**/
.equ STACK_TOP, 0x20000800
.equ BIT1, 0x00000002
.equ BIT2, 0x00000004
.equ BIT5, 0x00000020
.equ BIT6, 0x00000040
.equ BIT8, 0x00000100
.equ BIT9, 0x00000200

.equ LED1, BIT1
.equ LED2, BIT6
.equ LED3, BIT8

.equ GPIOA, 0X40010800
.equ GPIOA_CRL, 0X40010800
.equ GPIOA_CRH, 0X40010804
.equ GPIOA_IDR, 0X40010808
.equ GPIOA_ODR, 0X4001080C
.equ GPIOA_BSRR, 0X40010810
.equ GPIOA_BRR, 0X40010814
.equ IOPAEN, BIT2   
.equ RCC_APB2ENR, 0X40021018

.text
.global _start
.code 16

_start:
    /*.word STACK_TOP, start*/
    .word STACK_TOP
    .word 0x08000009
start:
      ldr   r1,=RCC_APB2ENR
      ldr   r0,   
      ldr   r2,=IOPAEN
      orr   r0,r2
      str   r0,

      ldr   r1,=GPIOA_CRL
      ldr   r2,=0x33333333
      str   r2,
loop:
      mov   r0,#0x00000002
      ldr   r1,=GPIOA_BRR
      str   r0,

      bl        delay

      mov   r0,#0x00000040
      ldr   r1,=GPIOA_BSRR
      str   r0,

      bl        delay

      mov   r0,#0x00000002
      ldr   r1,=GPIOA_BSRR
      str   r0,

      bl        delay

      mov   r0,#0x00000040
      ldr   r1,=GPIOA_BRR
      str   r0,

      bl        delay

      b        loop

delay:
      push    {r1}

delay_loop0:
      sub    r0,#1
      movw   r1,#2240
delay_loop1:
      sub    r1,#1
      nop
      cmp    r1,#0
      bne    delay_loop1
      cmp    r0,#0
      bne    delay_loop0

      pop    {r1}
      bx   lr

.end


######################################################################3
/*delay.S*/
.globl delay001
delay001:
      push        {r7, lr}
      add        r7, sp, #0

delay001_loop0:
      sub    r0,#1
      movw   r1,#2240
delay001_loop1:
      sub    r1,#1
      nop
      cmp    r1,#0
      bne    delay001_loop1
      cmp    r0,#0
      bne    delay001_loop0

      mov        sp, r7
      pop        {r7, pc}
###################################################################################3
/*test.ld*/
SECTIONS
{
    . = 0x0; /* 从0x00000000开始*/

    .text : {
      /**(vectors) *//* 向量表*/
    test.o        (.text)
      *(.text) /* 程序代码*/
      *(.rodata) /* 只读数据*/
    }

    . = 0x20000000; /* 从0x20000000开始*/
    .data : {
    *(.data) /* 数据存储器*/
    }
   
    .bss : {
    *(.bss) /* 预留的数据存储器,必须初始化为零*/
    }
}
#######################################################
PRO_NAME = test

SRCS = test.S delay.S

OBJS = delay.o test.o

LDS = test.ld

#LDS = hello.ld



COMPILE_CROSS = arm-none-eabi-



PRO_OUT= $(PRO_NAME).out

PRO_BIN= $(PRO_NAME).bin

PRO_LIST = $(PRO_NAME).list



AS = $(COMPILE_CROSS)as

ASFLAGS= -mcpu=cortex-m3 -mthumb



LD = $(COMPILE_CROSS)ld

LDFLAGS = -T $(LDS)



OBJCP = $(COMPILE_CROSS)objcopy

OBJCPFLAGS = -O binary



OBJDUMP = $(COMPILE_CROSS)objdump

DUMPFLAGS = -S



all: $(PRO_BIN) $(PRO_LIST) $(PRO_OUT) $(OBJS)

#all: $(OBJS)

$(PRO_BIN): $(PRO_OUT)

        $(OBJCP) $(OBJCPFLAGS) $< $@



$(PRO_LIST): $(PRO_OUT)

        $(OBJDUMP) $(DUMPFLAGS) $< > $@



$(PRO_OUT): $(OBJS)

        $(LD) $(LDFLAGS) -o $@ $<

        readelf -S $@



$(OBJS): %.o:%.S

        $(AS) $(ASFLAGS) $< -o $@



.PHONY : clean

clean:

        -rm -rf *.o *out *bin *.list
############################################################
反汇编代码:

test.out:   file format elf32-littlearm


Disassembly of section .text:

00000000 <_start>:
   0:        0800              .short        0x0800
   2:        2000              .short        0x2000
   4:        08000009         .word        0x08000009

00000008 <start>:
   8:        4914              ldr        r1,         (5c <delay_loop1+0x12>)
   a:        6808              ldr        r0,
   c:        2204              movs        r2, #4
   e:        4310              orrs        r0, r2
10:        6008              str        r0,
12:        4913              ldr        r1,         (60 <delay_loop1+0x16>)
14:        4a13              ldr        r2,         (64 <delay_loop1+0x1a>)
16:        600a              str        r2,

00000018 <loop>:
18:        2002              movs        r0, #2
1a:        4913              ldr        r1,         (68 <delay_loop1+0x1e>)
1c:        6008              str        r0,
1e:        f000 f810         bl        42 <delay>
22:        2040              movs        r0, #64
24:        4911              ldr        r1,         (6c <delay_loop1+0x22>)
26:        6008              str        r0,
28:        f000 f80b         bl        42 <delay>
2c:        2002              movs        r0, #2
2e:        490f              ldr        r1,         (6c <delay_loop1+0x22>)
30:        6008              str        r0,
32:        f000 f806         bl        42 <delay>
36:        2040              movs        r0, #64
38:        490b              ldr        r1,         (68 <delay_loop1+0x1e>)
3a:        6008              str        r0,
3c:        f000 f801         bl        42 <delay>
40:        e7ea              b.n        18 <loop>

00000042 <delay>:
42:        b402              push        {r1}

00000044 <delay_loop0>:
44:        3801              subs        r0, #1
46:        f640 01c0         movw        r1, #2240        ; 0x8c0

0000004a <delay_loop1>:
4a:        3901              subs        r1, #1
4c:        46c0              nop                        (mov r8, r8)
4e:        2900              cmp        r1, #0
50:        d1fb              bne.n        4a <delay_loop1>
52:        2800              cmp        r0, #0
54:        d1f6              bne.n        44 <delay_loop0>
56:        bc02              pop        {r1}
58:        4770              bx        lr
5a:        0000              .short        0x0000
5c:        40021018         .word        0x40021018
60:        40010800         .word        0x40010800
64:        33333333         .word        0x33333333
68:        40010814         .word        0x40010814
6c:        40010810         .word        0x40010810

00000070 <delay001>:
70:        b580              push        {r7, lr}
72:        af00              add        r7, sp, #0

00000074 <delay001_loop0>:
74:        3801              subs        r0, #1
76:        f640 01c0         movw        r1, #2240        ; 0x8c0

0000007a <delay001_loop1>:
7a:        3901              subs        r1, #1
7c:        46c0              nop                        (mov r8, r8)
7e:        2900              cmp        r1, #0
80:        d1fb              bne.n        7a <delay001_loop1>
82:        2800              cmp        r0, #0
84:        d1f6              bne.n        74 <delay001_loop0>
86:        46bd              mov        sp, r7
88:        bd80              pop        {r7, pc}
这样的话,程序就能运行,LED灯会闪烁!

microcreat 发表于 2011-10-26 16:52:58

但是如果test.s调用delay.s中得delay001的话,程序就回死掉!
/**/
.equ STACK_TOP, 0x20000800
.equ BIT1, 0x00000002
.equ BIT2, 0x00000004
.equ BIT5, 0x00000020
.equ BIT6, 0x00000040
.equ BIT8, 0x00000100
.equ BIT9, 0x00000200

.equ LED1, BIT1
.equ LED2, BIT6
.equ LED3, BIT8

.equ GPIOA, 0X40010800
.equ GPIOA_CRL, 0X40010800
.equ GPIOA_CRH, 0X40010804
.equ GPIOA_IDR, 0X40010808
.equ GPIOA_ODR, 0X4001080C
.equ GPIOA_BSRR, 0X40010810
.equ GPIOA_BRR, 0X40010814
.equ IOPAEN, BIT2   
.equ RCC_APB2ENR, 0X40021018

.text
.global _start
.code 16

_start:
    /*.word STACK_TOP, start*/
    .word STACK_TOP
    .word 0x08000009
start:
      ldr   r1,=RCC_APB2ENR
      ldr   r0,   
      ldr   r2,=IOPAEN
      orr   r0,r2
      str   r0,

      ldr   r1,=GPIOA_CRL
      ldr   r2,=0x33333333
      str   r2,
loop:
      mov   r0,#0x00000002
      ldr   r1,=GPIOA_BRR
      str   r0,

      bl        delay001

      mov   r0,#0x00000040
      ldr   r1,=GPIOA_BSRR
      str   r0,

      bl        delay001

      mov   r0,#0x00000002
      ldr   r1,=GPIOA_BSRR
      str   r0,

      bl        delay001

      mov   r0,#0x00000040
      ldr   r1,=GPIOA_BRR
      str   r0,

      bl        delay001

      b        loop

delay:
      push    {r1}

delay_loop0:
      sub    r0,#1
      movw   r1,#2240
delay_loop1:
      sub    r1,#1
      nop
      cmp    r1,#0
      bne    delay_loop1
      cmp    r0,#0
      bne    delay_loop0

      pop    {r1}
      bx   lr

.end
########################################################

test.out:   file format elf32-littlearm


Disassembly of section .text:

00000000 <_start>:
   0:        0800              .short        0x0800
   2:        2000              .short        0x2000
   4:        08000009         .word        0x08000009

00000008 <start>:
   8:        4914              ldr        r1,         (5c <delay_loop1+0x12>)
   a:        6808              ldr        r0,
   c:        2204              movs        r2, #4
   e:        4310              orrs        r0, r2
10:        6008              str        r0,
12:        4913              ldr        r1,         (60 <delay_loop1+0x16>)
14:        4a13              ldr        r2,         (64 <delay_loop1+0x1a>)
16:        600a              str        r2,

00000018 <loop>:
18:        2002              movs        r0, #2
1a:        4913              ldr        r1,         (68 <delay_loop1+0x1e>)
1c:        6008              str        r0,
1e:        f000 e828         blx        70 <delay001>
22:        2040              movs        r0, #64
24:        4911              ldr        r1,         (6c <delay_loop1+0x22>)
26:        6008              str        r0,
28:        f000 e822         blx        70 <delay001>
2c:        2002              movs        r0, #2
2e:        490f              ldr        r1,         (6c <delay_loop1+0x22>)
30:        6008              str        r0,
32:        f000 e81e         blx        70 <delay001>
36:        2040              movs        r0, #64
38:        490b              ldr        r1,         (68 <delay_loop1+0x1e>)
3a:        6008              str        r0,
3c:        f000 e818         blx        70 <delay001>
40:        e7ea              b.n        18 <loop>

00000042 <delay>:
42:        b402              push        {r1}

00000044 <delay_loop0>:
44:        3801              subs        r0, #1
46:        f640 01c0         movw        r1, #2240        ; 0x8c0

0000004a <delay_loop1>:
4a:        3901              subs        r1, #1
4c:        46c0              nop                        (mov r8, r8)
4e:        2900              cmp        r1, #0
50:        d1fb              bne.n        4a <delay_loop1>
52:        2800              cmp        r0, #0
54:        d1f6              bne.n        44 <delay_loop0>
56:        bc02              pop        {r1}
58:        4770              bx        lr
5a:        0000              .short        0x0000
5c:        40021018         .word        0x40021018
60:        40010800         .word        0x40010800
64:        33333333         .word        0x33333333
68:        40010814         .word        0x40010814
6c:        40010810         .word        0x40010810

00000070 <delay001>:
70:        b580              push        {r7, lr}
72:        af00              add        r7, sp, #0

00000074 <delay001_loop0>:
74:        3801              subs        r0, #1
76:        f640 01c0         movw        r1, #2240        ; 0x8c0

0000007a <delay001_loop1>:
7a:        3901              subs        r1, #1
7c:        46c0              nop                        (mov r8, r8)
7e:        2900              cmp        r1, #0
80:        d1fb              bne.n        7a <delay001_loop1>
82:        2800              cmp        r0, #0
84:        d1f6              bne.n        74 <delay001_loop0>
86:        46bd              mov        sp, r7
88:        bd80              pop        {r7, pc}


以上是反汇编!

microcreat 发表于 2011-10-26 16:54:53

3楼】 luo496724812
积分:73
派别:
等级:------
来自:
_start:
      .word STACK_TOP   
      .word 0x08000000 + 0x09   
      b       reset   

感觉是这段有问题
你的程序入口应该是_start吧,开头的是两个数据而不是指令,怎么能执行呢,你把b reset 放在_start:之后紧挨着试试
###########################################################################################################

就是调用其它文件的函数就会有问题!感觉是test.ld有问题!但是不知道怎么解决!

i55x 发表于 2011-10-26 21:04:32

真狠哪,有人不用库就被骂的狗血喷头,你居然一开始就用汇编。

tanybin 发表于 2011-10-26 21:15:48

高手啊,这年头用汇编的很少了

dr2001 发表于 2011-10-26 22:08:48

对编译结果有疑问,看MAP,LIST和反汇编。确认均符合ARM Core的各种要求,如地址,对齐,etc。
如果实在搞不清,直接用Keil加载编译生成的ELF,单步调试即可。

- LD文件应该是可以用的。
- 向量表似乎有问题,认真看CortexM的手册并加以改正。
- 调用函数需要注意目标地址:CM3用Thumb2,永远工作于Thumb模式;因此目标地址的低位有时候有1的要求。

研究汇编不建议直接在CM3上进行。
如果要在CM3上进行汇编,则需要把ARM指令集和Thumb指令集相关内容弄熟;
一定要慎重研究CM3的TRM,确认CortexM引入的一系列特有的变化和行为。否则汇编代码是正确的,但是执行就是错误的。

microcreat 发表于 2011-10-27 09:27:26

【10楼】 dr2001
积分:1416
派别:
等级:------
来自:
对编译结果有疑问,看MAP,LIST和反汇编。确认均符合ARM Core的各种要求,如地址,对齐,etc。
如果实在搞不清,直接用Keil加载编译生成的ELF,单步调试即可。

- LD文件应该是可以用的。
- 向量表似乎有问题,认真看CortexM的手册并加以改正。
- 调用函数需要注意目标地址:CM3用Thumb2,永远工作于Thumb模式;因此目标地址的低位有时候有1的要求。

研究汇编不建议直接在CM3上进行。
如果要在CM3上进行汇编,则需要把ARM指令集和Thumb指令集相关内容弄熟;
一定要慎重研究CM3的TRM,确认CortexM引入的一系列特有的变化和行为。否则汇编代码是正确的,但是执行就是错误的。
############################################################################################################
谢谢建议!

我现在直接是用GCC去做!所以牵涉的东西比较多!有很多地方不懂,希望多指教哈!

microcreat 发表于 2011-10-28 18:21:04

请问怎样使目标地址地位为1呢?
页: [1]
查看完整版本: 关于stm32用gcc来编译多个文件的问题: