关于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
请问这个是我哪里没有注意呢? ding ! ding ! _start:
.word STACK_TOP
.word 0x08000000 + 0x09
b reset
感觉是这段有问题
你的程序入口应该是_start吧,开头的是两个数据而不是指令,怎么能执行呢,你把b reset 放在_start:之后紧挨着试试 那样放了之后程序都跑不起来了! /**/
.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灯会闪烁! 但是如果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}
以上是反汇编! 3楼】 luo496724812
积分:73
派别:
等级:------
来自:
_start:
.word STACK_TOP
.word 0x08000000 + 0x09
b reset
感觉是这段有问题
你的程序入口应该是_start吧,开头的是两个数据而不是指令,怎么能执行呢,你把b reset 放在_start:之后紧挨着试试
###########################################################################################################
就是调用其它文件的函数就会有问题!感觉是test.ld有问题!但是不知道怎么解决! 真狠哪,有人不用库就被骂的狗血喷头,你居然一开始就用汇编。 高手啊,这年头用汇编的很少了 对编译结果有疑问,看MAP,LIST和反汇编。确认均符合ARM Core的各种要求,如地址,对齐,etc。
如果实在搞不清,直接用Keil加载编译生成的ELF,单步调试即可。
- LD文件应该是可以用的。
- 向量表似乎有问题,认真看CortexM的手册并加以改正。
- 调用函数需要注意目标地址:CM3用Thumb2,永远工作于Thumb模式;因此目标地址的低位有时候有1的要求。
研究汇编不建议直接在CM3上进行。
如果要在CM3上进行汇编,则需要把ARM指令集和Thumb指令集相关内容弄熟;
一定要慎重研究CM3的TRM,确认CortexM引入的一系列特有的变化和行为。否则汇编代码是正确的,但是执行就是错误的。 【10楼】 dr2001
积分:1416
派别:
等级:------
来自:
对编译结果有疑问,看MAP,LIST和反汇编。确认均符合ARM Core的各种要求,如地址,对齐,etc。
如果实在搞不清,直接用Keil加载编译生成的ELF,单步调试即可。
- LD文件应该是可以用的。
- 向量表似乎有问题,认真看CortexM的手册并加以改正。
- 调用函数需要注意目标地址:CM3用Thumb2,永远工作于Thumb模式;因此目标地址的低位有时候有1的要求。
研究汇编不建议直接在CM3上进行。
如果要在CM3上进行汇编,则需要把ARM指令集和Thumb指令集相关内容弄熟;
一定要慎重研究CM3的TRM,确认CortexM引入的一系列特有的变化和行为。否则汇编代码是正确的,但是执行就是错误的。
############################################################################################################
谢谢建议!
我现在直接是用GCC去做!所以牵涉的东西比较多!有很多地方不懂,希望多指教哈! 请问怎样使目标地址地位为1呢?
页:
[1]