链接地址学习笔记

发布者:EnchantedMelody最新更新时间:2024-10-15 来源: cnblogs关键字:链接地址  学习笔记  启动过程 手机看文章 扫描二维码
随时随地手机看文章

链接地址

启动过程

 

 

示例代码如下:

 

start.S 文件

.globl _start

_start:

/*硬件相关设置*/

ldr r0,=0x70000000

orr r0,r0,#0x13

mcr p15,0,r0,c15,c2,4

/*关看门狗*/

        

    bl test  /*位置无关*/

ldr pc, =test /*位置相关*/

 

ldr r0,=0x7E00400

mov r1,#0

str r1,[r0]

 

/*设置栈*/

ldr sp,=8*1024

bl main

halt:

b halt

test:

mov pc,lr

 

 

 

 

Led.c文件

void delay(){

volatile int i=0x1000;

while (i--);

}

 

volatile int i=0;

volatile int j=0x12345678;

volatile int k=0;

volatile int g;

 

int main(){

volatile unsigned long *gpkcon=(volatile unsigned long *)0x7F008800;

volatile unsigned long *gpkdat=(volatile unsigned long *)0x7F008808;

*gpkcon=0x1111;

while(1){

*gpkdat=i;

i++;

if(i==16)

i=0;

delay();

}

return 0;

}

 

 

Leds.lds文件

SECTIONS

{

. = 0x50000000;

.text : {

start.o

* (.text)

}

    

.data : {

* (.data)

}

 

bss_start = .;

.bss : {

* (.bss)

}

bss_end  = .;

}

 

Makefile 文件

led.bin: start.o led.o

arm-linux-ld -T leds.lds -o led.elf start.o led.o

arm-linux-objcopy -O binary led.elf led.bin

arm-linux-objdump -D led.elf > led.dis

 

start.o : start.S

arm-linux-gcc -o start.o start.S -c

led.o:led.c

arm-linux-gcc -o led.o led.c -c

 

clean:

rm *.o led.elf led.bin led.dis

 

 

Led.dis文件

 

led.elf:     file format elf32-littlearm

 

 

 

首地址为0x50000000;

 

Disassembly of section .text:

 

50000000 <_start>:

50000000: e3a00207  mov r0, #1879048192 ; 0x70000000

50000004: e3800013  orr r0, r0, #19

50000008: ee0f0f92  mcr 15, 0, r0, cr15, cr2, {4}

5000000c: e59f0014  ldr r0, [pc, #20] ; 50000028 

50000010: e3a01000  mov r1, #0

50000014: e5801000  str r1, [r0]

50000018: e3a0da02  mov sp, #8192 ; 0x2000

5000001c: eb00001e  bl 5000009c 

 

50000020 :

50000020: eafffffe  b 50000020 

 

50000024 :

50000024: e1a0f00e  mov pc, lr

50000028: 07e00400  strbeq r0, [r0, r0, lsl #8]!

5000002c: 00002541  andeq r2, r0, r1, asr #10

50000030: 61656100  cmnvs r5, r0, lsl #2

50000034: 01006962  tsteq r0, r2, ror #18

50000038: 0000001b  andeq r0, r0, fp, lsl r0

5000003c: 4d524105  ldfmie f4, [r2, #-20] ; 0xffffffec

50000040: 36373131  undefined instruction 0x36373131

50000044: 2d465a4a  vstrcs s11, [r6, #-296] ; 0xfffffed8

50000048: 09060053  stmdbeq r6, {r0, r1, r4, r6}

5000004c: 01090108  tsteq r9, r8, lsl #2

50000050: 0000020a  andeq r0, r0, sl, lsl #4

 

50000054 :

50000054: e52db004  push {fp} ; (str fp, [sp, #-4]!)

50000058: e28db000  add fp, sp, #0

5000005c: e24dd00c  sub sp, sp, #12

50000060: e3a03a01  mov r3, #4096 ; 0x1000

50000064: e50b3008  str r3, [fp, #-8]

50000068: e1a00000  nop ; (mov r0, r0)

5000006c: e51b3008  ldr r3, [fp, #-8]

50000070: e3530000  cmp r3, #0

50000074: 03a02000  moveq r2, #0

50000078: 13a02001  movne r2, #1

5000007c: e6ef2072  uxtb r2, r2

50000080: e2433001  sub r3, r3, #1

50000084: e50b3008  str r3, [fp, #-8]

50000088: e3520000  cmp r2, #0

5000008c: 1afffff6  bne 5000006c 

50000090: e28bd000  add sp, fp, #0

50000094: e8bd0800  pop {fp}

50000098: e12fff1e  bx lr

 

5000009c 

:

5000009c: e92d4800  push {fp, lr}

500000a0: e28db004  add fp, sp, #4

500000a4: e24dd008  sub sp, sp, #8

500000a8: e59f3060  ldr r3, [pc, #96] ; 50000110 

500000ac: e50b3008  str r3, [fp, #-8]

500000b0: e59f305c  ldr r3, [pc, #92] ; 50000114 

500000b4: e50b300c  str r3, [fp, #-12]

500000b8: e51b3008  ldr r3, [fp, #-8]

500000bc: e59f2054  ldr r2, [pc, #84] ; 50000118 

500000c0: e5832000  str r2, [r3]

500000c4: e59f3050  ldr r3, [pc, #80] ; 5000011c 

500000c8: e5933000  ldr r3, [r3]

500000cc: e1a02003  mov r2, r3

500000d0: e51b300c  ldr r3, [fp, #-12]

500000d4: e5832000  str r2, [r3]

500000d8: e59f303c  ldr r3, [pc, #60] ; 5000011c 

500000dc: e5933000  ldr r3, [r3]

500000e0: e2832001  add r2, r3, #1

500000e4: e59f3030  ldr r3, [pc, #48] ; 5000011c 

500000e8: e5832000  str r2, [r3]

500000ec: e59f3028  ldr r3, [pc, #40] ; 5000011c 

500000f0: e5933000  ldr r3, [r3]

500000f4: e3530010  cmp r3, #16

500000f8: 1a000002  bne 50000108 

500000fc: e59f3018  ldr r3, [pc, #24] ; 5000011c 

50000100: e3a02000  mov r2, #0

50000104: e5832000  str r2, [r3]

50000108: ebffffd1  bl 50000054 

5000010c: eaffffec  b 500000c4 

50000110: 7f008800  svcvc 0x00008800

50000114: 7f008808  svcvc 0x00008808

50000118: 00001111  andeq r1, r0, r1, lsl r1

5000011c: 50000124  andpl r0, r0, r4, lsr #2

 

Disassembly of section .data:

 

50000120 :

50000120: 12345678  eorsne r5, r4, #125829120 ; 0x7800000

 

Disassembly of section .bss:

 

50000124 :

50000124: 00000000  andeq r0, r0, r0

 

50000128 :

50000128: 00000000  andeq r0, r0, r0

 

5000012c :

5000012c: 00000000  andeq r0, r0, r0

 

Disassembly of section .comment:

 

00000000 <.comment>:

   0: 3a434347  bcc 10d0d24 <_start-0x4ef2f2dc>

   4: 74632820  strbtvc r2, [r3], #-2080 ; 0x820

   8: 312d676e  teqcc sp, lr, ror #14

   c: 312e382e  teqcc lr, lr, lsr #16

  10: 2941462d  stmdbcs r1, {r0, r2, r3, r5, r9, sl, lr}^

  14: 352e3420  strcc r3, [lr, #-1056]! ; 0x420

  18: Address 0x00000018 is out of bounds.

 

 

首地址为0

Disassembly of section .ARM.attributes:

 

00000000 <.ARM.attributes>:

   0: 00003341  andeq r3, r0, r1, asr #6

   4: 61656100  cmnvs r5, r0, lsl #2

   8: 01006962  tsteq r0, r2, ror #18

   c: 00000029  andeq r0, r0, r9, lsr #32

  10: 4d524105  ldfmie f4, [r2, #-20] ; 0xffffffec

  14: 36373131  undefined instruction 0x36373131

  18: 2d465a4a  vstrcs s11, [r6, #-296] ; 0xfffffed8

  1c: 09060053  stmdbeq r6, {r0, r1, r4, r6}

  20: 01090108  tsteq r9, r8, lsl #2

  24: 0412020a  ldreq r0, [r2], #-522 ; 0x20a

  28: 01150114  tsteq r5, r4, lsl r1

  2c: 01180317  tsteq r8, r7, lsl r3

  30: 031b021a  tsteq fp, #-1610612735 ; 0xa0000001

 

 

 

led.elf:     file format elf32-littlearm

 

 

Disassembly of section .text:

 

00000000 <_start>:

   0:   e3a00207        mov     r0, #1879048192 ; 0x70000000

   4:   e3800013        orr     r0, r0, #19

   8:   ee0f0f92        mcr     15, 0, r0, cr15, cr2, {4}

  /*

  Bl  test 的机器码   eb00,0006

                     1110, 1011,0000 0000 0000 0000 0000  0110   

                     --------------------------------------------------------------

                     1确定b/bl

                      剩余为偏移量

Branch instruction contains a signed 2's complement 24 bit offset. This is shifted left two bits, sign extended to 32

[1] [2]
关键字:链接地址  学习笔记  启动过程 引用地址:链接地址学习笔记

上一篇:DDR学习笔记
下一篇:arm学习笔记一(arm概述及其基本编程模型)

推荐阅读最新更新时间:2026-03-21 11:23

链接地址的理解
当我们写链接器脚本的时候,我们会设置代码段的起始链接地址为0x30008000(S3C2440)。如果对链接地址理解错误的话,可能会出现像我这样的问题。 Q:gboot的链接器脚本里写的其实链接地址是内存中的0x30008000,再用交叉工具反汇编得到的start.S前几行代码地址都变成了0x30008000+,不太对啊。ARM启动流程里面讲处理器将NAND中的代码复制了4K到垫脚石中,垫脚石的地址是0x0,也正是因为这样,我们设置的异常向量表才有意义,处理器才能准确的找到处理异常的标号。但是把链接地址改成了0x30008000还怎么找? A:首先要理解链接地址。我认为,链接地址就是为程序假想了一个起点,之后的代码都是在这
[单片机]
ARM 链接地址和烧写地址
在ARM设计中,一般会涉及都一个链接地址,这个链接地址和烧写地址很容易混淆,会认为链接地址就是烧写地址,这个是错的,下面说的是个人的一些认识,可能会有一些错误,说的也可能不专业,但是对于初学者,可以帮助理解。 首先链接地址和烧写地址是两个范畴的东西,几乎是没有关系的,烧写地址,可以认为是物理地址,而链接地址可以认为是虚拟地址,对于程序员来说,看到的是虚拟地址,一般虚拟地址经过MMU映射成具体的物理地址,进而再去访问实际的物理地址。 链接地址也可以理解成是一个符号,因为一个可执行程序,一般要经过预编译,编译,汇编,链接三个过程,最后一个过程是链接,就是把前三部分产生的所有.o文件,串起来,形成一个整体的程序,所以每个.o
[单片机]
OK6410启动配置过程(详细信息)
硬件平台:OK6410开发板 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 KK U-Boot 1.1.6 (Sep 19 2014 - 10:00:03) for SMDK6410 **************************************** ** u-boot 1.1.6
[单片机]
解析STM32的启动过程及STM32 启动文件选择
STM32 启动文件选择 小容量产品是指闪存存储器容量在16K至32K字节之间的STM32F101xx、STM32F102xx和STM32F103xx微控制器。 中容量产品是指闪存存储器容量在64K至128K字节之间的STM32F101xx、STM32F102xx和STM32F103xx微控制器。 大容量产品是指闪存存储器容量在256K至512K字节之间的STM32F101xx和STM32F103xx微控制器。 互联型产品是指STM32F105xx和STM32F107xx微控制器。 - startup_stm32f10x_ld_vl.s: for STM32 Low density Value line devices - st
[单片机]
以s3c2440为例的arm芯片的启动过程
arm 嵌入式芯片的启动过程对于嵌入式菜鸟来说其实是很复杂的,很多人都是一知半解,存在很多误区。在笔者看来,要想真正了解这一启动过程必须要首先了解存储器的区别与联系,参考文章:各种主流半导体存储器的区别与联系。还需要了解程序是如何编译链接和执行的。 本文将以s3c2440为例详细讲述 arm 芯片的启动过程。s3c2440支持两种启动模式:NAND FLASH 启动和非 NAND FLASH 启动(一般是NOR FLASH 启动,并且可以配置数据宽度),通过 OM1、OM0 两个管脚来控制。 NAND FLASH启动过程 当 OM1、OM0 两个管脚都为低电平时,CPU 就被配置成了 NAND FLASH 启动。此时 CP
[单片机]
以s3c2440为例的arm芯片的<font color='red'>启动</font><font color='red'>过程</font>
基于S3C4510B系统的启动流程及重映射的实现过程
近年来,随着32位芯片制造技术的不断完善,制造成本不断降低,国内的32位MCU市场也开始火爆起来。越来越多的工程师开始将开发目光从8位转移到32位微处理器上,基于32位MCU的产品如雨后春笋般层出不穷,应用领域涵盖了掌上设备、家用电器、网络设备、无线通信、工业控制等。在32位微控制芯片领域,ARM架构的芯片占了近70%的市场。本文中所用到的处理器正是Samsung公司生产的基于ARM架构的S3C4510B。 1 S3C4510B简介 S3C4510B是一款基于以太网系统的高性价比、高性能的16/32位RISC微处理器。芯片部集成了8KB的Cache/SRAM和Ethernet控制器,减少了整个系统的成本。片外可扩展ROM、Fl
[单片机]
基于S3C4510B系统的<font color='red'>启动</font>流程及重映射的实现<font color='red'>过程</font>
以s3c2440为例讲解arm芯片的启动过程
arm 嵌入式芯片的启动过程对于嵌入式菜鸟来说其实是很复杂的,很多人都是一知半解,存在很多误区。在笔者看来,要想真正了解这一启动过程必须要首先了解存储器的区别与联系,参考文章:各种主流半导体存储器的区别与联系。还需要了解程序是如何编译链接和执行的。 本文将以s3c2440为例详细讲述 arm 芯片的启动过程。s3c2440支持两种启动模式:NAND FLASH 启动和非 NAND FLASH 启动(一般是NOR FLASH 启动,并且可以配置数据宽度),通过 OM1、OM0 两个管脚来控制。 NAND FLASH启动过程 当 OM1、OM0 两个管脚都为低电平时,CPU 就被配置成了 NAND FLASH 启动。此时 CP
[单片机]
以s3c2440为例讲解arm芯片的<font color='red'>启动</font><font color='red'>过程</font>
S3C2440的RAM和启动过程
2440自带的RAM是:16K Instruction cache + 16K data cache + 4K Boot Internal SRAM。但是我们能用到的只有4K Boot Internal SRAM;2440不自带ROM。 2440的启动方式有两种,norflash和nandflash,怎么选择? OM = 01,10为norflash启动,分别对应16bit和32bit,OM = 00为nandflash启动。 两种启动方式:先贴张图。 可以观察到,s3c2440总共有8个内存banks,6个内存bank可以当作ROM或者SRAM来使用,留下的2个bank除了当作ROM 或者SRAM,还可以用SDRAM
[单片机]
S3C2440的RAM和<font color='red'>启动</font><font color='red'>过程</font>!
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2026 EEWORLD.com.cn, Inc. All rights reserved