简单总结Base家族

1.Base16

Base16编码使用16个ASCII可打印字符(数字0-9和字母A-F)对任意字节数据进行编码。

Base16又称 HEX (十六进制),是不区分大小写的十六进制编码标准。

Base16先获取输入字符串每个字节的二进制值(不足8比特在高位补0),然后将其串联进来,再按照4比特一组进行切分,将每组二进制数分别转换成十进制。

Base16 编码表
编码编码
0088
1199
2210A
3311B
4412C
5513D
6614E
7715F
 
例:编码前:这是一个例子
          
    编码后:E8BF99E698AFE4B880E4B8AAE4BE8BE5AD90

2.Base32

Base32使用了ASCII编码中可打印的32个字符(大写字母A~Z和数字2~7)对任意字节数据进行编码.

Base32将任意字符串按照字节进行切分,并将每个字节对应的二进制值(单字符的二进制编码若不足8比特高位补0)串联起来,按照5比特一组进行切分,并将每组二进制值转换成十进制来对应32个可打印字符中的一个。

当要编码数据少于 40 位时, 在右侧填充二进制 0 值, Base32 编码数据尾填充 = 字符。

Base32编码表
符号符号符号符号
0A8I16Q24Y
1B9J17R25Z
2C10K18S262
3D11L19T273
4E12M20U284
5F13N21V295
6G14O22W306
7H15P23X317
填充=
例:编码前:这是一个例子

    编码后:5C7ZTZUYV7SLRAHEXCVOJPUL4WWZA===

3.Base64

Base64编码是使用64个可打印ASCII字符(A-Z、a-z、0-9、+、/)将任意字节序列数据编码成ASCII字符串,另有“=”符号用作后缀用途。

Base64将输入字符串按字节切分,取得每个字节对应的二进制值(若不足8比特则高位补0),然后将这些二进制数值串联起来,再按照6比特一组进行切分(因为2^6=64),最后一组若不足6比特则末尾补0。将每组二进制值转换成十进制,然后在下述表格中找到对应的符号并串联起来就是Base64编码结果。

Base64 以 4 字符存储 3 字节二进制数据,因此长度增加 1/3。

Base64 编码表
数值字符数值字符数值字符数值字符
0A16Q32g48w
1B17R33h49x
2C18S34i50y
3D19T35j51z
4E20U36k520
5F21V37l531
6G22W38m542
7H23X39n553
8I24Y40o564
9J25Z41p575
10K26a42q586
11L27b43r597
12M28c44s608
13N29d45t619
14O30e46u62+
15P31f47v63/
例:编码前:这是一个例子

    编码后:6L+Z5piv5LiA5Liq5L6L5a2Q

4.Base58

Base58是用于比特币(Bitcoin)中使用的一种独特的编码方式,主要用于产生Bitcoin的钱包地址。

相比Base64,Base58不使用数字"0",字母大写"O",字母大写"I",和字母小写"l",以及"+"和"/"符号。

比特币的Base58字母表:

123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz

例:编码前:这是一个例子

    编码后:aDV66x6o3S93RaW59Dq5ZbG4A

5.Base62

Base62使用了62个字符编码,包括0-9,a-z,A-Z。

例:编码前:这是一个例子

    编码后:UxIZABUpAxEZUhIxw1UhIxEFUhIVwJUlERA1

6.Base85

Base85是一种类似于Base64的二进制文本编码形式,通过使用五个ASCII字符来表示四个字节的二进制数据。例如,它用于将图像嵌入到Adobe PDF文件中。

Base85 包含下列字符:

$%()*+,-./0123456789:;?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[]^_`abcdefghijklmnopqrstuvwxyz{|}~
例:编码前:这是一个例子

    编码后:keEPJR'5S\JE45?jM$Q6XcN

7.Base91

顾名思义,Base91需要91个字符来表示ASCII编码的二进制数据。

Base91 包含下列字符:

!"#$%&()*+,./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[]^_`abcdefghijklmnopqrstuvwxyz{|}~
例:编码前:这是一个例子

    编码后:*~v6uRhaugfz5el@Dh!q&LB

8.Base92

Base92 是用 92 个可打印字符表示 8 位二进制数据 (含无法显示 打印字符) 的编码方式。

Base92 包含下列字符:

!#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_abcdefghijklmnopqrstuvwxyz{|}~
例:编码前:这是一个例子

    编码后:toxRX<@w<U"[27@\f!Mpc*

9.Base94

Base94 是用 94 个可打印字符表示 8 位二进制数据 (含无法显示 打印字符) 的编码方式。

Base94 包含下列字符:

!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~

10.Base100

Base100编码/解码工具(又名:Emoji表情符号编码/解码),可将文本内容编码为Emoji表情符号;同时也可以将编码后的Emoji表情符号内容解码为文本。

例:编码前:这是一个例子

    编码后:📟💶💐📝💏💦📛💯👷📛💯💡📛💵💂📜💤💇

11.Base128

Base128 是用 128 个字符表示 8 位二进制数据的编码方式。

Base128 包含下列字符:

0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\xb5\xb6\xb7\xbc\xbd\xbe\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff
					

<think>首先,用户的问题是:“我想了解STMDB (STMFD)指令,即Store Multiple Decrement Before (Store Multiple Full Descending)将多个寄存器存储到连续内存位置的相关信息 请问STMDB (STMFD)指令将多个寄存器存储到连续内存位置的详细介绍” 用户提到了STMDB和STMFD,它们是等价的指令。在ARM汇编中,STMDB指的是Store Multiple Decrement Before,而STMFD是Store Multiple Full Descending。STMFD是STMDB的别名,常用于堆栈操作。 系统级指令要求: - 所有行内数学表达式必须使用$...$格式(但这里没有数学表达式,主要是汇编指令)。 - 独立公式必须单独成段(同样,可能不适用)。 - LaTeX语法正确(确保正确)。 - 使用中文回答。 - 生成相关问题。 - 回答中引用的段落末尾自然地添加引用标识。 用户提供了引用[1]到[4],我需要参考这些: - 引用[1]:提到了多寄存器寻址指令,包括STMDB(Store Multiple Decrement Before)。 - 引用[2]:描述了多数据处理汇编指令,包括STMDB作为多数据存储指令。 - 引用[3]:给出了示例代码,展示了STMDB的用法。 - 引用[4]:展示了实际代码中使用stmfd(即STMDB)进行栈操作。 我的回答应该结构化,帮助用户逐步解决问题。确保回答真实可靠。 结构回答: 1. **介绍指令**:解释STMDB/STMFD是什么。 2. **语法和工作原理**:描述指令的语法、如何工作(地址减量、存储)。 3. **堆栈应用**:强调在堆栈操作中的常见用法。 4. **示例**:提供简单示例来演示用法。 5. **注意事项**:讨论寄存器列表、地址对齐等。 6. **相关问题**:根据系统指令生成相关问题。 使用中文回答。 生成相关问题:在回答末尾添加§§相关问题§§部分。 引用标识:在引用内容的末尾添加[^n]。 现在,整合引用: - 从引用[1]:STMDB是多寄存器存储指令之一。 - 从引用[2]:STMDB是多数据存储指令。 - 从引用[3]:给出了STMDB的示例代码。 - 从引用[4]:实际代码中使用stmfd sp!, {r4 - r7, r9, lr}。 在回答中,我需要自然地引用这些。例如: - 在描述指令时,提及参考[1]。 - 在讨论堆栈时,参考[4]。 - 在示例中,参考[3]。 详细回答: - **定义**:STMDB (Store Multiple Decrement Before) 是一种ARM汇编指令,用于将多个寄存器的值存储到连续的内存位置。指令会先递减基址寄存器,然后存储数据。STMFD (Store Multiple Full Descending) 是它的别名,常用于实现满减栈(Full Descending Stack)。 - **语法**:指令格式通常是 STMDB Rn!, {reg_list},其中Rn是基址寄存器,reg_list是要存储的寄存器列表。!表示寄存器回写(即更新基址寄存器)。 - **工作原理**:在存储数据之前,基址寄存器被递减。存储顺序是从列表中的最后一个寄存器到第一个寄存器(取决于后缀)。 - **堆栈应用**:在ARM架构中,堆栈通常使用满减栈(FD),所以STMFD常用于压栈操作。例如,stmfd sp!, {regs} 将寄存器保存到栈中。 - **示例**:基于引用[3],例如STMDB R11!, {R1-R4} 先递减地址,然后存储R1到R4的值到内存。 - **注意事项**:寄存器列表的顺序影响存储顺序;地址递减值取决于寄存器数量;寄存器使用范围。 相关问题: 1. STMDB指令与其他多寄存器存储指令(如STMIA)的区别是什么? 2. 在ARM堆栈操作中,为什么常用STMFD指令? 3. STMDB指令在中断处理或函数调用中有什么典型应用? 确保回答清晰、步骤化。 </think>### STMDB (STMFD) 指令详细介绍 STMDB (Store Multiple Decrement Before) 是 ARM 汇编中的一种多寄存器存储指令,用于将多个寄存器的值存储到连续的内存位置。STMFD (Store Multiple Full Descending) 是 STMDB 的别名,两者在功能上完全等价,通常用于实现满减栈(Full Descending Stack)操作[^1]。下面我将逐步详细介绍该指令的结构、工作原理、应用场景和注意事项。 #### 1. **指令定义和语法** - **指令名称**:STMDB 意为“先递减地址后存储多个寄存器”(Store Multiple Decrement Before),而 STMFD 是其在堆栈操作中的常用别名(Store Multiple Full Descending)。它们都属于 ARM 多寄存器存储指令家族。 - **语法格式**: - 基本格式:`STMDB Rn!, {reg_list}` - `Rn`:基址寄存器(如 SP、R11),存放内存起始地址。 - `!`:可选的回写符号,表示存储后会更新基址寄存器的值(即地址递减后写回)。 - `reg_list`:要存储的寄存器列表(如 {R1-R4} 或 {R0, R5, R7}),列表顺序影响存储顺序。 - 例如:`STMDB SP!, {R4-R7, LR}` 表示先递减 SP 的值,然后将 R4-R7 和 LR 寄存器的值存储到连续内存中[^2][^4]。 - **地址处理**:指令执行时,先对基址寄存器进行递减操作(递减值由寄存器数量决定),然后按寄存器列表顺序存储数据到内存。内存地址从递减后的地址开始,依次增长[^1][^3]。 #### 2. **工作原理** STMDB 指令的工作流程可以分为两步(以示例 `STMDB R11!, {R1-R4}` 说明): - **步骤 1: 地址递减**:在存储数据之前,基址寄存器 `R11` 的值递减。递减量取决于寄存器数量,每个寄存器占用 4 字节(32 位 ARM)。例如,存储 4 个寄存器时,`R11` 先减 16(4 × 4 字节)。 - **步骤 2: 数据存储**:寄存器的值按列表顺序存储到连续内存地址。存储顺序是**从右到左**(即列表尾部寄存器优先存储到低地址)。 - 示例:如果 `R11` 原值为 0x40000020,执行 `STMDB R11!, {R1-R4}` 后: - `R11` 先减至 0x40000010(因为 4 寄存器 × 4 字节 = 16 字节)。 - 然后存储数据:R4 存到 0x40000010,R3 存到 0x40000014,R2 存到 0x40000018,R1 存到 0x4000001C(地址递增)。 - 存储结束后,`R11` 的值更新为 0x40000010(如果使用了 `!` 回写符号)[^3][^4]。 - **数学表达**:地址递减量计算公式为 $\Delta = -n \times 4$,其中 $n$ 是寄存器数量,4 是字节数。内存地址范围从 $Rn_{\text{new}}$ 到 $Rn_{\text{new}} + (n-1) \times 4$。 #### 3. **堆栈应用(STMFD 别名)** STMDB 常用于堆栈操作(如函数调用保存现场),此时别名 STMFD 更为常见: - **满减栈机制**:ARM 默认使用满减栈(Full Descending Stack),即栈指针指向栈顶元素(满栈),且栈向低地址方向增长(减栈)。STMFD 正是为这种栈设计的。 - **典型用法**:在函数入口保存寄存器到堆栈: ```assembly STMFD SP!, {R4-R7, LR} ; 等效于 STMDB SP!, {R4-R7, LR} ``` - 执行过程:SP 先递减,依次存储 LR、R7、R6、R5、R4(从高地址到低地址)。 - 恢复时配对使用 LDMFD(LDMIA):`LDMFD SP!, {R4-R7, LR}` 恢复数据并递增 SP。 - 优势:高效保存多个寄存器,减少指令数量,提升性能(尤其在中断处理或函数调用中)[^1][^4]。 - **引用示例**:在 ARM 内核代码中,如 Linux 启动代码,常用 `STMFD SP!, {regs}` 保存现场,确保函数返回时状态一致[^4]。 #### 4. **示例代码** 基于引用[3]的示例,展示 STMDB 实际操作: ```assembly MOV R1, #1 ; R1 = 1 MOV R2, #2 ; R2 = 2 MOV R3, #3 ; R3 = 3 MOV R4, #4 ; R4 = 4 MOV R11, #0x40000020 ; R11 初始地址 0x40000020 STMDB R11!, {R1-R4} ; 先递减地址,后存储数据 ; 执行后:R11 更新为 0x40000010,内存内容: ; 0x40000010: R4 的值 (4) ; 0x40000014: R3 的值 (3) ; 0x40000018: R2 的值 (2) ; 0x4000001C: R1 的值 (1) ``` 在此示例中,`STMDB` 确保了内存写入从低地址开始(0x40000010),数据顺序与寄存器列表相反[^3]。 #### 5. **注意事项** - **寄存器列表顺序**:存储顺序永远是从列表尾部寄存器到头部(例如 {R1,R2,R3} 中 R3 优先存储)。这在堆栈操作中匹配 LDMFD 的恢复顺序。 - **地址对齐**:ARM 要求内存地址对齐到字边界(4 字节对齐),否则可能导致异常。 - **回写符号**:若省略 `!`,基址寄存器不会更新,这在某些场景下有用(如临时存储),但堆栈操作通常使用 `!` 以确保栈指针更新。 - **性能优化**:STMDB 是原子操作,比多条单一存储指令更高效,但需注意寄存器数量限制(通常最多 16 个通用寄存器)。 - **与其他指令对比**: - vs STMIA(Increment After):STMIA 先存储后递增地址,适用于正向内存填充。 - 堆栈模式:STMFD(STMDB)用于满减栈,而其他如 STMFA(STMIB)用于空增栈[^2][^1]。 - **常见错误**:寄存器列表不能为空,且必须包含至少一个寄存器;避免中断中使用未保护的关键寄存器[^4]。 #### 总结 STMDB (STMFD) 指令是 ARM 多寄存器存储的核心指令,特别适用于高效堆栈管理和批量内存写入。其“先递减地址后存储”机制优化了内存访问,在函数调用、中断处理等系统级编程中广泛使用[^1][^2][^4]。理解其工作原理和别名关系(如 STMFD)能帮助您编写更可靠的底层代码。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值