现在的位置: 首页 > 综合 > 正文

start.S中.word的含义

2018年01月09日 ⁄ 综合 ⁄ 共 2402字 ⁄ 字号 评论关闭

刚开始接触u-boot中的start.S文件时,对汇编程序中的.word很是不解,于是上网上查找资料,整理如下,在此感谢论坛中无私解答的高手们

 

start.S汇编程序中有这么一句:

 

 

ldr pc, _undefined_instruction

_undefined_instruction: .word undefined_instruction

 

 

.word的用法格式

Syntax: .word expressions

 

在当前位置放一个word型的值,这个值就是expression 

 

 

在论坛中wheelz的举例解答:

 

 

ldr r1, _rWTCON

_rWTCON:
.word 0x15300000

是把地址_rWTCON上的内容放到r1,而地址_rWTCON上的内容是0x15300000。实际上就是把r1设置为0x15300000


.word和0x1530 0000有什么关系?.word就是把expression上的值取出来? expression代表地址?
.word expression就是在当前位置放一个word型的值,这个值就是expression
举例来说,
_rWTCON:
.word 0x15300000
就是在当前地址,即_rWTCON处放一个值0x15300000

翻译成intel的汇编语句就是:
_rWTCON dw 0x15300000

 

 

 

 

原汇编程序:(start.S)

.globl _start
_start: b reset
ldr pc, _undefined_instruction
ldr pc, _software_interrupt
ldr pc, _prefetch_abort
ldr pc, _data_abort
ldr pc, _not_used
ldr pc, _irq
ldr pc, _fiq

_undefined_instruction: .word undefined_instruction
_software_interrupt: .word software_interrupt
_prefetch_abort: .word prefetch_abort
_data_abort: .word data_abort
_not_used: .word not_used
_irq: .word irq
_fiq: .word fiq

 

 

_undefined_instruction是汇编中的标号,代表一个地址,根据反汇编:

 

00000000 [0xea000012] b 0x50
00000004 [0xe59ff014] ldr pc,0x00000020 ; = #0x33f80140
00000008 [0xe59ff014] ldr pc,0x00000024 ; = #0x33f801a0
0000000c [0xe59ff014] ldr pc,0x00000028 ; = #0x33f80200
00000010 [0xe59ff014] ldr pc,0x0000002c ; = #0x33f80260
00000014 [0xe59ff014] ldr pc,0x00000030 ; = #0x33f802c0
00000018 [0xe59ff014] ldr pc,0x00000034 ; = #0x33f80320
0000001c [0xe59ff014] ldr pc,0x00000038 ; = #0x33f80380
00000020 [0x33f80140] mvnccs r0,#0x10 ; ? rn = 0x8
00000024 [0x33f801a0] mvnccs r0,#0x28 ; ? rn = 0x8
00000028 [0x33f80200] mvnccs r0,#0, 4 ; ? rn = 0x8
0000002c [0x33f80260] mvnccs r0,#6 ; ? rn = 0x8
00000030 [0x33f802c0] mvnccs r0,#0xc ; ? rn = 0x8
00000034 [0x33f80320] mvnccs r0,#0x80000000 ; ? rn = 0x8
00000038 [0x33f80380] mvnccs r0,#2 ; ? rn = 0x8
0000003c [0xdeadbeef] cdple p14,0xa,c11,c13,c15,7
00000040 [0x33f80000] mvnccs r0,#0 ; ? rn = 0x8
00000044 [0x33f80000] mvnccs r0,#0 ; ? rn = 0x8
00000048 [0x33f96650] mvnccs r6,#0x5000000 ; ? rn = 0x9
0000004c [0x33f9ab80] mvnccs r10,#0x20000 ; ? rn = 0x9
00000050 [0xe10f0000] mrs r0,cpsr
00000054 [0xe3c0001f] bic r0,r0,#0x1f
00000058 [0xe38000d3] orr r0,r0,#0xd3
0000005c [0xe129f000] msr cpsr_cf,r0

 

由此可以看出,_undefined_instruction标号代表的地址时0x00000020

在地址0x00000020处分配一个字内存空间,存放undefined_instruction这个标号的地址,当出现未定义指令异常时,将undefined_instruction地址赋给PC寄存器。

 

 

链接:http://www.linuxforum.net/forum/showflat.php?Cat=&Board=linuxK&Number=563178

 

 

 

抱歉!评论已关闭.