start.S中.word的含义

本文详细解析了U-Boot启动过程中start.S文件的使用方法,特别是.word指令的作用和实现原理。通过实例说明了如何利用.word指令来初始化特定地址的内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

刚开始接触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

 

 

 

<think>我们之前已经解释了正则表达式中 `^`的双重含义,现在需要将这个解释补充到之前的.md文件中。但注意,用户要求生成一个.md文件总结所有正则表达式语法,而之前的回答中已经包含了一个速查表。我们需要将关于`^`的详细解释整合进去,特别是区分作为锚点的 `^`和作为否定字符集的 `[^]`。由于用户要求补充到之前的.md文件中,我们可以将之前的速查表扩展,在“元字符”部分和“字符类”部分分别强调`^`的两种用法。但是,由于之前的回答已经包含了速查表,并且现在用户要求补充,我们可以考虑在速查表中增加一个说明部分,或者分别在对应的位置进行说明。然而,请注意,我们之前的速查表在“元字符”部分已经提到了`^`(匹配字符串开头),在“字符类”部分提到了 `[^abc]`(匹配不在括号内的字符)。因此,我们只需要确保这两个条目存在即可。但是用户要求解释为什么同一个符号有两种含义,所以我们可以考虑在速查表后面添加一个“注意事项”或“常见疑问”部分,专门解释这个问题。不过,由于用户要求补充到之前的.md文件中,并且之前的速查表已经以markdown表格形式给出,我们可以这样调整:在“元字符”表格中,对于`^`的说明已经存在。在“字符类”表格中,对于 `[^abc]`的说明也存在。为了更清楚地区分,我们可以在两个表格之后添加一段说明文字,解释 `^`的双重角色。但是,用户要求的是在之前的.md文件中补充,而之前的回答已经包含了整个速查表。因此,我们可以在速查表的末尾添加一个补充说明。然而,由于我们是在回答中生成整个.md文件内容,所以我们可以重新输出整个.md文件,并在其中加入关于`^`双重含义的详细解释。考虑到用户可能希望看到完整的.md文件,我们重新生成一个包含补充说明的完整版本。具体调整如下:在速查表的“字符类”部分之后,添加一个专门的章节:##8.特殊符号的双重含义###`^`符号的两种用法- **用法1:作为锚点**当 `^`出现在正则表达式的开头时,表示匹配字符串的开始位置(在多行模式下匹配行首)。示例:`^Start`匹配以"Start"开头的字符串。 -**用法2:作为否定字符集**当`^`出现在字符集`[]`的内部且是第一个字符时,表示对该字符集取反(即匹配未列出的字符)。示例:`[^0-9]`匹配任意非数字字符。 **为什么同一个符号有两种含义?**正则表达式的语法设计考虑了上下文差异:1.作为锚点的`^`必须出现在模式开头,而作为否定的 `^`必须紧跟在字符集的左括号后面。2.这种设计避免了引入新的转义符号,保持了语法的简洁性。3.历史原因:早期正则表达式工具(如ed、grep)采用了这种约定,并成为标准。这样,我们就将解释整合进了.md文件中。现在,我们重新输出完整的.md文件内容,包括之前的速查表和这个新增的说明部分。</think>### 补充正则表达式语法指南(更新.md文件) 我已将关于 `^` 双重含义的详细说明整合进正则表达式语法指南中,以下是完整的更新版本: ```markdown # 正则表达式语法指南(完整版) ## 1. 基本匹配 - 字面量字符:直接匹配自身 `abc` → 匹配 "abc" ## 2. 元字符 | 字符 | 含义 | 示例 | |------|-----------------------|--------------------------| | `.` | 匹配任意单个字符 | `a.c` → "aac", "abc" | | **`^`** | **匹配字符串开头** | `^Hello` → "Hello World" | | `$` | 匹配字符串结尾 | `end$` → "This is end" | | `\` | 转义特殊字符 | `\.` → 匹配 "." | ## 3. 字符类 | 语法 | 含义 | 示例 | |------------|--------------------------|---------------------------| | `[abc]` | 匹配括号内任意字符 | `[ae]` → "a" in "apple" | | **`[^abc]`** | **匹配不在括号内的字符** | `[^0-9]` → "a" in "a1" | | `[a-z]` | 字符范围 | `[A-Z]` → 大写字母 | | `\d` | 数字 ≡ `[0-9]` | `\d\d` → "42" | | `\w` | 单词字符 ≡ `[a-zA-Z0-9_]`| `\w+` → "word123" | | `\s` | 空白字符(空格/tab等) | `\s+` → 连续空白 | ## 4. 特殊符号双重含义详解 ### `^` 符号的两种用法 #### 用法1:起始锚点(位置匹配) - **位置要求**:必须在正则表达式开头 - **功能**:匹配字符串/行的起始位置 - **示例**: `^https` → 匹配以"https"开头的URL `^/api` → 匹配路径开头的"/api" #### 用法2:否定字符集(内容匹配) - **位置要求**:必须在字符集 `[]` 内首位 - **功能**:排除指定字符 - **示例**: `[^aeiou]` → 匹配非元音字母(如"b"、"c") `[^0-9]` → 匹配非数字字符 #### 设计原理对比 | 特性 | `^`(起始锚点) | `[^]`(否定字符集) | |--------------|--------------------------|--------------------------| | **作用对象** | 位置(零宽度断言) | 字符内容 | | **匹配结果** | 不消耗实际字符 | 消耗一个字符 | | **语法位置** | 必须出现在模式最开头 | 必须紧接在`[`之后 | | **本质** | 定位符 | 字符集取反操作符 | > **历史背景**:这种双重设计源于早期Unix工具(如ed、grep)的正则实现,通过上下文区分功能避免引入新符号。 ## 5. 量词 | 语法 | 含义 | 示例 | |---------|-------------------|---------------------------| | `*` | 0次或多次 | `ab*c` → "ac", "abbc" | | `+` | 1次或多次 | `a+` → "a", "aaa" | | `?` | 0次或1次 | `colou?r` → "color"/"colour"| | `{n}` | 精确n次 | `\d{4}` → "2023" | | `{n,}` | 至少n次 | `a{2,}` → "aa", "aaaa" | | `{n,m}` | n到m次 | `\d{2,4}` → "12", "1234" | ## 6. 分组与断言 | 语法 | 含义 | 示例 | |--------------|--------------------------|-------------------------------| | `(abc)` | 捕获分组 | `(ab)+` → "abab" | | `(?:abc)` | 非捕获分组 | `(?:ab)\|cd` → "ab" 或 "cd" | | `\|` | 或逻辑 | `cat\|dog` → "cat" 或 "dog" | | `\b` | 单词边界 | `\bword\b` → 独立单词"word" | | `(?=abc)` | 正向先行断言 | `Windows(?=10)` → "Windows10"中的"Windows" | | `(?<=abc)` | 正向后行断言 | `(?<=\$)\d+` → "$100"中的"100"| ## 7. 使用技巧 - **转义特殊字符**:在匹配路径时需转义斜杠 `/user\/profile` - **避免过度匹配**:使用`*?`进行非贪婪匹配 - **多行模式**:使用`m`标志使`^`和`$`匹配每行首尾 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值