6410之点灯程序的反汇编代码分析

对上面一章的led.elf,使用下面命令生成反汇编代码:

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


led.dis内容如下:

led.elf:     file format elf32-littlearm


Disassembly of section .text:

00000000 <_start>://汇编代码的标签,地址为0
   0:	e3a00207 	mov	r0, #1879048192	; 0x70000000              
   4:	e3800013 	orr	r0, r0, #19
   8:	ee0f0f92 	mcr	15, 0, r0, cr15, cr2, {4}
   c:	e59f0020 	ldr	r0, [pc, #32]	; 34 <halt+0x4>           
  10:	e3a01001 	mov	r1, #1
  14:	e5801000 	str	r1, [r0]
  18:	e59f0018 	ldr	r0, [pc, #24]	; 38 <halt+0x8>
  1c:	e3a01001 	mov	r1, #1
  20:	e5801000 	str	r1, [r0]
  24:	e59f0010 	ldr	r0, [pc, #16]	; 3c <halt+0xc>
  28:	e3a01000 	mov	r1, #0
  2c:	e5801000 	str	r1, [r0]

00000030 <halt>:
  30:	eafffffe 	b	30 <halt>
  34:	7e004000 	cdpvc	0, 0, cr4, cr0, cr0, {0}
  38:	7f008820 	svcvc	0x00008820
  3c:	7f008824 	svcvc	0x00008824

Disassembly of section .ARM.attributes:

00000000 <.ARM.attributes>:
   0:	00001a41 	andeq	r1, r0, r1, asr #20
   4:	61656100 	cmnvs	r5, r0, lsl #2
   8:	01006962 	tsteq	r0, r2, ror #18
   c:	00000010 	andeq	r0, r0, r0, lsl r0
  10:	45543505 	ldrbmi	r3, [r4, #-1285]	; 0x505
  14:	08040600 	stmdaeq	r4, {r9, sl}
  18:	Address 0x00000018 is out of bounds.

0地址的代码为:

ldr r0, =CONFIG_PERIPORT_BASE

反汇编为:mov r0, #1879048192 ; 0x70000000


c地址的代码为:

ldr r0, =WTCON

反汇编为:ldr r0, [pc, #32] ; 34 <halt+0x4>

问题:为什么使用相同的ldr指令,得出的反汇编代码为什么是不一样的?

在ARM中一条指令代码占据32bit的空间,这个空间中既有命令(比如:ldr),又有寄存器(比如:r0),同时还有地址或相关内容(比如:0x7E004000)当这个值比较复杂的时候导致整个指令代码超过了32bit的空间,编译器就会帮你将这个值存放在某个地址中,如果要使用这个值,就可以从这个地址中取出这个值。

ldr r0, [pc, #32] 就相当与在pc + 32的地址处取出内容放到r0中。

pc = 当前地址 + 8 = c + 8 = 20   (pc = 当前指令地址 + 8的原因是什么???

则:

pc + 32 = 20 + 32 = 52   ====> [pc,#32] = [52] = [0x34] = 7e004000  ,这就是需要取的值。。


Makefile运行的规则:
1.目标不存在的时候,会重新编译
2.依赖更新了,也会重新编译

Makefile的形式:
目标:依赖1 依赖2 ...
[TAB]运行指令




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值