栈回溯基础
指令集区分
thumb指令集
- 长度:thumb指令通常是 16 位。
- 特点:thumb 指令集是为了压缩指令集长度减少程序占用空间。
- 对齐方式:2字节对齐,存放 thumb 指令的地址一般会被+1,设置为奇数,用于表示地址上存放的是 thumb 指令。
thumb-2指令集
- 长度:thumb-2 扩展了thumb指令集,可以是16位或 32位。
- 特点:32 位长的 thumb-2 指令通过特定的编码模式来表示,指令通常具有一些特定前缀,例如:‘0b11101’ 和 ‘0b11110’ 和 ‘0b11111’。
- 对齐方式:2字节对齐,存放 thumb 指令的地址一般会被+1,设置为奇数,用于表示地址上存放的是 thumb 指令。
arm 指令集
-
长度:arm指令固定为32位。
-
特点:arm 指令不区分前缀,因为所有arm指令都是32位长,它们是统一的,没有特别的前缀来表示。arm指令集通过处理器的状态决定使用,与thumb指令集通过特定指令(如bx, blx)进行状态切换。
-
对齐方式:4字节对齐。
Thumb 和 arm 的切换
- 切换到 arm 模式:在使用 bx 或 blx 是确保地址的最低位为0。
- 切换到 thumb 模式:在使用 bx 或 blx 是确保地址的最低位为1。
例如:
// 切换到 thumb 模式
add r3, pc, #1
bx r3
当使用bx跳转指令,跳到一个奇数地址时,实际上是跳到这个 奇数地址 - 1 的位置,然后CPSR寄存器的标志位T位会置1,表示切换到Thumb指令集,执行后面的指令。
函数跳转指令
ARM 指令集中的跳转指令可以完成从当前指令向前或向后地址空间的跳转,最大 32MB 跳转范围,包括以下 4 条指令:
- B 跳转指令
- BL 带返回的跳转指令
- BLX 带返回的跳转指令,并根据目标地址的最低位切换处理器状态(ARM 或 Thumb(指令+1为奇数表示))
- BX 不返回跳转指令,并根据目标地址的最低位切换处理器状态(ARM 或 Thumb(指令+1为奇数表示))
B 指令
介绍
B 指令是最简单的跳转指令,跳转后不在返回。存储在跳转指令中的实际值是相对当前 PC 值的一个偏移量,而不是一个绝对地址,它的值由汇编器来计算(参考寻址方式中的相对寻址)。
格式:
T1 有条件跳转指令:B<c> <label>
比特位 | 15~12 | 11~8 | 7~0 |
---|---|---|---|
指令码 | 1101 | cond | imm8 |
cond :为条件码指令,例如EQ、NE等,可以根据条件决定是否进行跳转
imm8:为8位的立即数(label 偏移量),最大跳转范围 range(-256 ~ 254)
实际偏移量计算:
imm32 = SignExtend(imm8:'0', 32);
注意:cond 不可为‘1110’ 和‘1111’
适用架构:ARMv4T, ARMv5T*, ARMv6*, ARMv7
T2 无条件跳转指令:B<label>
比特位 | 15~11 | 10~0 |
---|---|---|
指令码 | 11100 | imm11 |
imm11:为11位的立即数(label 偏移量),最大跳转范围 range(-2048 ~ 2046)
实际偏移量计算:
imm32 = SignExtend(imm11:'0', 32);
适用架构:ARMv4T, ARMv5T*, ARMv6*, ARMv7
T3 有条件跳转指令:B<c>.W <label>
比特位 | 15~11 | 10 | 9~6 | 5~0 | 15~14 | 13 | 12 | 11 | 10~0 |
---|---|---|---|---|---|---|---|---|---|
指令码 | 11110 | S | cond | imm6 | 10 | J1 | 0 | J2 | imm11 |
S:符号位
cond :为条件码指令,例如EQ、NE等,可以根据条件决定是否进行跳转
J1/J2:计算参数位
imm6/imm11:立即数,最大跳转范围range(-1048576 ~ 1048574)
实际偏移量计算:
imm32 = SignExtend(S:J2:J1:imm6:imm11:'0', 32);
适用架构:ARMv6T2, ARMv7
T4 无条件跳转指令:B.W <label>
比特位 | 15~11 | 10 | 9~0 | 15~14 | 13 | 12 | 11 | 10~0 |
---|---|---|---|---|---|---|---|---|
指令码 | 11110 | S | imm10 | 10 | J1 | 1 | J2 | imm11 |
S:符号位
J1/J2:计算参数位
imm10/imm11:立即数,最大跳转范围 range (-16777216 ~ 16777214)
实际偏移量计算
I1 = NOT(J1 EOR S);
I2 = NOT(J2 EOR S);
imm32 = SignExtend(S:I1:I2:imm10:imm11:'0', 32);
适用架构:ARMv6T2, ARMv7
A1 arm 有条件跳转指令:B<c><label>
比特位 | 31~28 | 27~24 | 23~0 |
---|---|---|---|
指令码 | cond | 1010 | imm24 |
cond :为条件码指令,例如EQ、NE等,可以根据条件决定是否进行跳转
imm24:立即数,最大跳转范围 range (-33554432 ~ 33554428)
实际偏移量计算:
imm32 = SignExtend(imm24:'00', 32);
适用架构:ARMv4*, ARMv5T*, ARMv6*, ARMv7
BX 指令
介绍
BX 指令中跳转到寄存器所指定的目标地址, 目标地址处的指令既可以是ARM 指令,也可以是Thumb指令。跳转后不在返回,并且根据寄存器中地址的最低位是否为 1 决定使用 Thumb模式还是 arm 模式。
格式
T1 无条件跳转指令:BX<Rm>
比特位 | 15~10 | 9~8 | 7 | 6~3 | 2~0 |
---|---|---|---|---|---|
指令码 | 010001 | 11 | 0 | Rm | 000 |
Rm:寄存器R1、LR
实际偏移量计算:
m = Uint(Rm);
适用架构:ARMv4T, ARMv5T*, ARMv6*, ARMv7
A1 arm 有条件跳转指令:BX<c> <Rm>
比特位 | 31~28 | 27~20 | 19~16 | 15~12 | 11~8 | 7~4 | 3~0 |
---|---|---|---|---|---|---|---|
指令码 | cond | 00010010 | 1111 | 1111 | 1111 | 0001 | Rm |
cond :为条件码指令,例如EQ、NE等,可以根据条件决定是否进行跳转
Rm:寄存器R1、LR
实际偏移量计算:
m = Uint(Rm);
适用架构:ARMv4T, ARMv5T*, ARMv6*, ARMv7
BL 指令
介绍
BL 是一个带返回的跳转指令,跳转之前,会在寄存器 R14 中保存当前指令的下一条指令地址,因此,可以通过将 R14 的内容重新加载到 PC 中,来返回到跳转指令之前的位置继续执行。
格式
T1 无条件跳转指令:BL <label>
比特位 | 15~11 | 10 | 9~0 | 15~14 | 13 | 12 | 11 | 10~0 |
---|---|---|---|---|---|---|---|---|
指令码 | 11110 | S | imm10 | 11 | J1 | 1 | J2 | imm11 |
S:符号位
imm6/imm11:立即数,最大跳转范围 range(-16777216 ~ 16777214)
实际偏移量计算:
I1 = NOT(J1 EOR S);
I2 = NOT(J2 EOR S);
imm32 = SignExtend(S:I1:I2:imm10:imm11:'0', 32);
适用架构:ARMv4T, ARMv5T*, ARMv6*, ARMv7 if J1 == J2 == 1 ARMv6T2, ARMv7 otherwise
A1 arm 有条件跳转指令:BL<c> <label>
比特位 | 31~28 | 27~24 | 23~0 |
---|---|---|---|
指令码 | cond | 1011 | imm24 |
cond :为条件码指令,例如EQ、NE等,可以根据条件决定是否进行跳转
imm24:立即数,最大跳转范围 range (-33554432 ~ 33554428)
实际偏移量计算:
imm32 = SignExtend(imm24:'0', 32);
适用架构:ARMv4*, ARMv5T*, ARMv6*, ARMv7
BLX 指令
介绍
BLX 指令是一个即带有返回值的跳转指令,同时也能指示在调整之后使用 Thumb 模式还是 arm 模式,在寄存器 R14 中保存当前指令的下一条指令地址,用于返回调用前的位置。
格式
T1 无条件立即数跳转指令:BLX<label>
比特位 | 15~11 | 10 | 9~0 | 15~14 | 13 | 12 | 11 | 10~1 | 0 |
---|---|---|---|---|---|---|---|---|---|
指令码 | 11110 | S | imm10H | 11 | J1 | 0 | J2 | imm10L | H |
S:符号位
imm10H/imm10L:立即数,最大跳转范围 range(-16777216 ~ 16777212)
H:
实际偏移量计算:
if CurrentInstrSet() == InstrSet_ThumbEE || H == ‘1’ then UNDEFINED;
I1 = NOT(J1 EOR S); I2 = NOT(J2 EOR S);
imm32 = SignExtend(S:I1:I2:imm10H:imm10L:’00’, 32);
targetInstrSet = InstrSet_ARM;
适用架构:ARMv5T*, ARMv6*, ARMv7 if J1 == J2 == 1ARMv6T2, ARMv7 otherwise
T2 无条件寄存器跳转指令:BLX<Rm>
比特位 | 15~10 | 9~8 | 7 | 6~3 | 2~0 |
---|---|---|---|---|---|
指令码 | 010001 | 11 | 1 | Rm | 000 |
cond :为条件码指令,例如EQ、NE等,可以根据条件决定是否进行跳转
Rm:寄存器R1、LR
实际偏移量计算:
m = Uint(Rm);
适用架构:ARMv5T*, ARMv6*, ARMv7
A1 arm 无条件立即数跳转指令:BLX<label>
比特位 | 31~28 | 27~25 | 24 | 23~0 |
---|---|---|---|---|
指令码 | 1111 | 101 | H | imm24 |
H:
imm24:立即数,最大跳转范围 range (-33554432 ~ 33554428)
实际偏移量计算:
imm32 = SignExtend(imm24:H:'0', 32);
targetInstrSet = InstrSet_Thumb;
适用架构:ARMv5T*, ARMv6*, ARMv7
A2 arm 无条件寄存器跳转指令:BLX<c> <Rm>
比特位 | 31~28 | 27~20 | 19~16 | 15~12 | 11~8 | 7~4 | 3~0 |
---|---|---|---|---|---|---|---|
指令码 | cond | 00010010 | 1111 | 1111 | 1111 | 0011 | Rm |
cond :为条件码指令,例如EQ、NE等,可以根据条件决定是否进行跳转
Rm:寄存器R1、LR
实际偏移量计算:
m = Uint(Rm);
适用架构:ARMv5T*, ARMv6*, ARMv7
栈操作指令
PUSH 指令
介绍
PUSH 指令一般在函数开始的地方出现,专门用于将寄存器进行压栈操作。在ARM的指令系统中,满栈递减栈入栈操作的参数入栈顺序是从右到左依次入栈,而参数的出栈顺序则是从左到右的逆操作。对于递增栈,相应的操作则全部取反。
格式
T1 多寄存器压栈指令:PUSH<c> <registers>
比特位 | 15~12 | 11 | 10~9 | 8 | 7~0 |
---|---|---|---|---|---|
指令码 | 1011 | 0 | 10 | M | reg_list |
M:表示LR寄存器是否存在于 reg_list 列表中
reg_list:待入栈寄存器列表,以 bit 位表示,真正的寄存器列表 registers = ‘0’:M:‘000000’:reg_list
注:在 thumb1 指令下寄存器过多时可能会使用T1压栈指令进行2次压栈。
适用架构:ARMv4T, ARMv5T*, ARMv6*, ARMv7
T2 多寄存器压栈指令:PUSH<c>.W <registers>
比特位 | 15~11 | 10~9 | 8~6 | 5~0 | 15 | 14 | 13 | 12~0 |
---|---|---|---|---|---|---|---|---|
指令码 | 11101 | 00 | 100 | 1 0 1101 | 0 | M | 0 | reg_list |
M:表示LR寄存器
reg_list:待入栈寄存器列表,以 bit 位表示,真正的寄存器列表 registers = ‘0’:M:‘0’:reg_list
注:reg_list 列表中的寄存器个数小于2个则会出错误。
适用架构:ARMv6T2, ARMv7
T3 单寄存器压栈指令:PUSH<c>.W <register>
比特位 | 15~11 | 10~9 | 8~0 | 15~12 | 11~0 |
---|---|---|---|---|---|
指令码 | 11111 | 00 | 0 0 10 0 1101 | Rt | 1 101 00000100 |
Rt:表示入栈寄存器的值,例如 r3 时 Rt 就是 3
计算方式:
t = UInt(Rt); // 转 Rt 转无符号整数
registers = Zeros(16); // 创建16位寄存器,初始化为0
registers<t> = '1'; // 将16位寄存器的第 t 位设置为1
注:t 的值不能为 13 或 15,即不能压栈SP 和 PC 寄存器
适用架构:ARMv6T2, ARMv7
A1 arm 多寄存器压栈指令:PUSH<c> <registers>
比特位 | 31~28 | 27~20 | 19~16 | 15~0 |
---|---|---|---|---|
指令码 | cond | 100100 1 0 | 1101 | reg_list |
cond:条件码,可以根据条件码决定是否压栈
reg_list:待入栈寄存器列表,以 bit 位表示某个寄存器,registers = reg_list
注:如果压栈小于两个寄存器则使用 STMDB / STMFD 指令
适用架构:ARMv4*, ARMv5T*, ARMv6*, ARMv7
A2 arm 单寄存器压栈指令:PUSH<c> <registers>
比特位 | 31~28 | 27~20 | 19~16 | 15~12 | 11~0 |
---|---|---|---|---|---|
指令码 | cond | 010 1 0 0 1 0 | 1101 | Rt | 000000000100 |
cond:条件码,可以根据条件码决定是否压栈
Rt:需要压栈的寄存器值,r3 就是 3
适用架构:ARMv4*, ARMv5T*, ARMv6*, ARMv7
STMDB (STMFD) 指令
介绍
STMDB 指令将寄存器的值存储到指定的内存地址,这个内存地址可以是堆栈,也可以是其他内存地址,常用于函数入口处的压栈操作,其中 DB 表示 down before 先递减,然后将寄存器值存入,在ARM的指令系统中,满栈递减栈入栈操作的参数入栈顺序是从右到左依次入栈,而参数的出栈顺序则是从左到右的逆操作。
格式
T1 多寄存器存储指令:STMDB<Rn>{!}, <registers>
比特位 | 15~11 | 10~9 | 8~6 | 5 | 4 | 3~0 | 15 | 14 | 13 | 12~0 |
---|---|---|---|---|---|---|---|---|---|---|
指令码 | 11101 | 00 | 100 | W | 0 | Rn | 0 | M | 0 | reg_list |
W:Writeback 写回标志,表示对 Rn 地址的操作是否影响 Rn 寄存器
Rn:Rn 基地址寄存器,需要操作的寄存器,Rn! 是会自动设置W=1,例如 sp 时Rn=13
M:表示LR寄存器
reg_list:待写入的寄存器列表, registers = ‘0’:M:‘0’:reg_list
注:W=1且Rn =‘1101’ t是为PUSH指令
适用架构:ARMv6T2, ARMv7
A1 arm 多寄存器存储指令:STMDB<c> <Rn>{!}, <registers>
比特位 | 31~28 | 27~22 | 21 | 20 | 19~16 | 15~0 |
---|---|---|---|---|---|---|
指令码 | cond | 100100 | W | 0 | Rn | reg_list |
cond:条件码,可以根据条件码决定是否压栈
W:Writeback 写回标志,表示对 Rn 地址的操作是否影响 Rn 寄存器
Rn:Rn 基地址寄存器,需要操作的寄存器,Rn! 是会自动设置W=1,例如 sp 时Rn=13
reg_list:reg_list:待写入的寄存器列表, registers = reg_list
注:W=1且Rn =‘1101’ t是为PUSH指令
适用架构:ARMv4*, ARMv5T*, ARMv6*, ARMv7
栈空间申请操作
SUB 指令
介绍
SUB 指令可以用于栈申请。在ARM汇编语言中,可以使用SUB指令来调整堆栈指针的值,从而为栈的使用提供空间。
格式
T1 栈申请指令:SUB SP,SP,#<imm>
比特位 | 15~12 | 11~8 | 7 | 6~0 |
---|---|---|---|---|
指令码 | 1011 | 0000 | 1 | imm7 |
imm7:需要减去的立即数
实际值:
imm32 = ZeroExtend(imm7:'00', 32);
适用架构:ARMv4T, ARMv5T*, ARMv6*, ARMv7
T2 栈申请指令:SUB{S}.W <Rd>, SP, #<const>
比特位 | 15~11 | 10 | 9~5 | 4 | 3~0 | 15 | 14~12 | 11~8 | 7~0 |
---|---|---|---|---|---|---|---|---|---|
指令码 | 11110 | i | 0 1101 | S | 1101 | 0 | imm3 | Rd | imm8 |
i:参与立即数计算
S:符号位
Rd:省略时默认为SP寄存器
imm3/imm8:需要减去的立即数组合位
实际值计算:
imm32 = ThumbExpandImm(i:imm3:imm8)
适用架构:ARMv6T2, ARMv7
T3 栈申请指令:SUBW<Rd>, SP, #<imm12>
比特位 | 15~11 | 10 | 9~5 | 4 | 3~0 | 15 | 14~12 | 11~8 | 7~0 |
---|---|---|---|---|---|---|---|---|---|
指令码 | 11110 | i | 1 0101 | 0 | 1101 | 0 | imm3 | Rd | imm8 |
i:参与立即数计算
Rd:省略时默认为SP寄存器
imm3/imm8:需要减去的立即数组合位
实际值计算:
imm32 = ZeroExtend(i:imm3:imm8, 32)
适用架构:ARMv6T2, ARMv7
A1 arm 栈申请指令:SUB{S}<c> <Rd>, SP, #<const>
比特位 | 31~28 | 27~21 | 20 | 19~16 | 15~12 | 11~0 |
---|---|---|---|---|---|---|
指令码 | cond | 00 1 0010 | S | 1101 | Rd | imm12 |
cond:条件码,可以根据条件码决定是否压栈
S:符号位
Rd:省略时默认为SP寄存器
imm12:需要减去的立即数组合位
实际值计算:
imm32 = ARMExpandImm(imm12)
适用架构:ARMv4*, ARMv5T*, ARMv6*, ARMv7
cond 条件码
ABI下入栈规范
APCS 规范
APCS 规范在ARM架构上定义了程序函数调用和栈帧定义以及寄存器的使用的规范,中定义了 FP 和IP 寄存器的作用,进行子函数调用时会都会进行 push {fp, ip, lr, pc} 压栈操作。
APCS | Reg | 意义 |
---|---|---|
fp | r11 | 栈帧指针寄存器,指向函数栈开始位置 |
ip | r12 | 临时变量寄存器 |
sp | r13 | 栈指针寄存器 |
lr | r14 | 链接寄存器 |
pc | r15 | 程序位置寄存器 |
AAPCS 规范
AAPCS 属于型的规范,在AAPCS 规范发布之后 APCS 规范基本不在使用,并且在新规范中精简了压栈的寄存器个数。
AAPCS | Reg | 意义 |
---|---|---|
sp | r13 | 栈指针寄存器 |
lr | r14 | 链接寄存器 |
pc | r15 | 程序位置寄存器 |
函数调用和异常发生的LR行为
子函数调用函数时前,CPU会自动更新 LR 的值为当前地址的下一条指令地址,注意:是自动,程序员不用管,相当于跟 BX 自动绑定了。更新的值就是下一步要执行的地址。
如果是中断调用则会把 LR 的值更新为 EXC_RETURN 的值,出现异常时栈中保存的 PC 是发生异常时执行的指令地址。
参考文档
Armv7-M Architecture Reference Manual
🌀路西法 的个人博客拥有更多美文等你来读。
相关文章:
栈回溯基础
指令集区分 thumb指令集 长度:thumb指令通常是 16 位。特点:thumb 指令集是为了压缩指令集长度减少程序占用空间。对齐方式:2字节对齐,存放 thumb 指令的地址一般会被1,设置为奇数,用于表示地址上存放的是…...
JavaScript系列(76)--浏览器API深入
JavaScript浏览器API深入 🌐 浏览器提供了丰富的API,使JavaScript能够与浏览器环境进行交互。本文将深入探讨常用的浏览器API、最佳实践和性能优化技巧。 核心浏览器API 🌟 💡 小知识:浏览器API是连接JavaScript与浏…...
计算机网络(3)TCP格式/连接
1、TCP三大特点:面向连接、可靠、基于字节流 2、如何唯一确定一个TCP连接?TCP四元组:源地址、源端口、目的地址、目的端口 源地址和目标地址的字段(32 位)是在 IP 头部中,作用是通过 IP 协议发送报文给对方主机源端口和目标端口…...
下载安装运行测试开源vision-language-action(VLA)模型OpenVLA
1. 安装 项目官网OpenVLA 首先按照官网提示的以下代码,执行创建环境->安装最小依赖->git克隆项目等 # Create and activate conda environment conda create -n openvla python3.10 -y conda activate openvla# Install PyTorch. Below is a sample comma…...
3D与2D机器视觉机械臂引导的区别
3D与2D机器视觉在机械臂引导中的主要区别如下: 数据维度 2D视觉:仅处理平面图像,提供X、Y坐标信息,无法获取深度(Z轴)数据。 3D视觉:处理三维空间数据,提供X、Y、Z坐标及物体的姿态…...
网站搭建基本流程
需求分析: 实现网站搭建的过程:首先进行网站的需求性分析 网站可分为前台系统和后台系统,由不同的功能拆分为不同的模块 如下是一个电商网站可以拆分出的模块: 在编写代码前,我们要先对网站进行架构,通过…...
SpringBoot启动时报错:cannot use an unresolved DNS server address: I:53
报错如下: 2025-02-17 13:59:41.374 [main] ERROR org.springframework.boot.SpringApplication:835 - Application run failed org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name mySwaggerResourceProvider def…...
Ollama命令使用指南
Ollama 命令使用指南 Ollama 命令使用指南1. Ollama 命令概览2. Ollama 命令详解2.1 启动 Ollama2.2 创建模型2.3 查看模型信息2.4 运行模型2.5 停止运行的模型2.6 从注册表拉取模型2.7 推送模型到注册表2.8 列出本地模型2.9 查看正在运行的模型2.10 复制模型2.11 删除模型 3. …...
每日一题——将数字字符串转化为IP地址
将数字字符串转化为IP地址 题目描述解题思路回溯法步骤分解 代码实现全局变量有效性验证函数回溯函数主函数完整代码 复杂度分析关键点说明总结 这题难度还挺大的,整体上实现并不容易。建议参考视频 和https://programmercarl.com/0093.%E5%A4%8D%E5%8E%9FIP%E5%9C%…...
2013年下半年软件设计师上午题考察知识点及其详细解释(附真题及答案解析)
以下是2013年下半年软件设计师上午题的所有题目(从第1题到第75题)的总结,按顺序列出每道题目的考察知识点及其详细解释,供考生背诵记忆: 1. Cache与主存的地址映像 知识点:存储管理解释:Cache与…...
实现可拖拽的 Ant Design Modal 并保持下层 HTML 可操作性
前言 在开发复杂的前端界面时,我们常常需要一个可拖拽的弹窗(Modal),同时又希望用户能够在弹窗打开的情况下操作下层的内容。Ant Design 的 Modal 组件提供了强大的功能,但默认情况下,弹窗会覆盖整个页面&…...
unity学习43:子状态机 sub-state machine
目录 1sub-state machine子状态机 1.1 创建 sub-state machine 1.2 sub-state machine 内容 1.3 子状态机的应用 2 子状态机不同于blend tree的嵌套 3 应用例子:若角色拿不同武器的动画设计,可以使用2种方法 3.1 在1个图层layer里,使用…...
HTML之JavaScript DOM(document)编程处理事件
HTML之JavaScript DOM(document)编程处理事件 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"…...
线性模型 - Logistic 回归
Logistic 回归(Logistic Regression,LR)是一种常用的处理二分类问题的 线性模型。 Logistic 回归是一种用于二分类问题的统计模型,它通过将输入特征的线性组合映射到一个概率值来进行分类决策。 Logistic回归是机器学习中最经典的分类算法之一…...
分割 学习笔记cvpr2024
目录 LiteMedSam 模型37m LightM-Unet 500 str 依赖项: MLWnet 73 star memsam 340M 126 star LiteMedSam 模型37m https://github.com/bowang-lab/MedSAM/blob/LiteMedSAM/README.md LightM-Unet 500 str https://github.com/MrBlankness/LightM-UNet/blob model = Li…...
ShenNiusModularity项目源码学习(9:项目结构)
ShenNiusModularity源码主要有11个project(其实还有officialweb、test两个文件夹,大致有4、5个project,但看着跟主要项目代码没太大关系,暂时不管),这11个project的依赖关系如下图所示,其中最下…...
【复现DeepSeek-R1之Open R1实战】系列6:GRPO源码逐行深度解析(上)
目录 4 GRPO源码分析4.1 数据类 GRPOScriptArguments4.2 系统提示字符串 SYSTEM_PROMPT4.3 奖励函数4.3.1 accuracy_reward函数4.3.2 verify函数4.3.3 format_reward函数 4.4 将数据集格式化为对话形式4.5 初始化GRPO Trainer 【复现DeepSeek-R1之Open R1实战】系列3࿱…...
【LangChain实践开发】如何对大模型I/O封装?
LangChain 的核心组件 模型 I/O 封装 LLMs:大语言模型Chat Models:一般基于 LLMs,但按对话结构重新封装PromptTemple:提示词模板OutputParser:解析输出 数据连接封装 Document Loaders:各种格式文件的加载…...
LangChain4j
LangChain4j 是一个基于 Java 的框架,旨在简化与大型语言模型(LLMs)的集成和应用开发。它类似于 Python 的 LangChain 框架,但专为 Java 开发者设计,提供了构建基于 LLM 的应用程序所需的工具和组件。 主要功能 LLM …...
如何系统成为高级Qt工程师?
要系统性地成为高级Qt工程师,需要从基础到进阶逐步构建知识体系,并结合实战经验、源码分析和架构设计能力的提升。以下是分阶段的系统性学习路径和建议: 一、夯实基础阶段 C++深度掌握 精通C++11/14/17特性(智能指针、lambda、移动语义等)理解面向对象设计、设计模式(如观…...
LLM 架构
LLM 分类 : 自编码模型 (encoder) : 代表模型 : BERT自回归模型 (decoder) : 代表模型 : GPT序列到序列模型 (encoder-decoder) : 代表模型 : T5 自编码模型 (AutoEncoder model , AE) 代表模型 : BERT (Bidirectional Encoder Representation from Transformers)特点 : Enc…...
MVTEC数据集笔记
前言 网上的博客只有从论文里摘出的介绍,没有数据集文件详细的样子,下载数据集之后,对数据集具体的构成做一个补充的笔记。 下载链接:https://ai-studio-online.bj.bcebos.com/v1/7d4a3cf558254bbaaf4778ea336cb14ed8bbb96a7f2a…...
[算法学习笔记]1. 枚举与暴力
一、枚举算法 定义 枚举是基于已有知识来猜测答案的问题求解策略。即在已知可能答案的范围内,通过逐一尝试寻找符合条件的解。 2. 核心思想 穷举验证:对可能答案集合中的每一个元素进行尝试终止条件:找到满足条件的解,或遍历完…...
javacv将mp4视频切分为m3u8视频并播放
学习链接 ffmpeg-demo 当前对应的 gitee代码 Spring boot视频播放(解决MP4大文件无法播放),整合ffmpeg,用m3u8切片播放。 springboot 通过javaCV 实现mp4转m3u8 上传oss 如何保护会员或付费视频?优酷是怎么做的? - HLS 流媒体加密 ffmpe…...
docker 进阶命令(基于Ubuntu)
数据卷 Volume: 目录映射, 目录挂载 匿名绑定: 匿名绑定的 volume 在容器删除的时候, 数据卷也会被删除, 匿名绑定是不能做到持久化的, 地址一般是 /var/lib/docker/volumes/xxxxx/_data 绑定卷时修改宿主机的目录或文件, 容器内的数据也会同步修改, 反之亦然 # 查看所有 vo…...
鸿蒙(HarmonyOS)开发学习路线指南:从零到实战
随着鸿蒙生态的快速发展,HarmonyOS 已成为物联网时代的重要开发平台。其分布式架构和“一次开发、多端部署”的理念吸引了大量开发者。本文将从零开始梳理鸿蒙开发的学习路径,帮助开发者高效掌握核心技能。 一、学习路线概览 总目标:掌握鸿蒙…...
小白win10安装并配置yt-dlp
需要yt-dlp和ffmpeg 注意存放路径最好都是全英文 win10安装并配置yt-dlp 一、下载1.下载yt-dlp2. fffmpeg下载 二、配置环境三、cmd操作四、yt-dlp下视频操作 一、下载 1.下载yt-dlp yt-dlp地址 找到win的压缩包点下载,并解压 2. fffmpeg下载 ffmpeg官方下载 …...
CUBEAI详细使用教程(STM32运行神经网络)---以手写识别为例
系列文章目录 文章目录 系列文章目录前言一、CUBEMX配置步骤二、模型结构及模型存储方式三、常用API函数1.ai_(name)_create()2.ai_(name)_init3.ai_(name)_create_and_init()3.ai_(name)_run()官方提供的示例代码 四、如何获取官方开发文档五、手写识别案例 前言 实验效果&am…...
[NOIP 1998 提高组] 拼数
https://www.luogu.com.cn/problem/P1012 将每个数用字符串的形式读进来,对于任意两个数 x x x, y y y,如果 x y > y x xy>yx xy>yx,对最后的答案来说, x x x一定排在 y y y的前面。 简单证明:假设最后的…...
PHP Web 开发基础
PHP 学习资料 PHP 学习资料 PHP 学习资料 在 PHP Web 开发领域,掌握一些基础概念和技术是构建功能强大、用户体验良好的 Web 应用的基石。接下来,我们将深入探讨 HTTP 协议、表单处理、Cookie 和 Session 的管理、URL 处理等关键内容。 一、HTTP 协议…...
MME-CoT:专为评估大型多模态模型CoT推理能力的基准测试。涵盖了数学、科学、OCR、逻辑、时空和一般场景6个领域。
2025-02-09 ,由CUHK MMLab、CUHK MulLab、字节跳动、、东北大学等机构联合发布MME-CoT数据集,该数据集目的评估大型多模态模型(LMMs)中的思维链(CoT)推理能力,涵盖数学、科学、OCR、逻辑、时空和…...
HDFS应用-后端存储cephfs-java-API
HDFS(Hadoop Distribute FileSystem)是一个适合运行在通用硬件之上,具备高度容错特性,支持高吞吐量数据访问的分布式文件系统,非常适合大规模数据集应用。 HDFS适用于如下场景: • 处理海量数据(TB或PB级别以上) • 需要很高的吞吐量 • 需要高可靠性 • 需要很好的可扩…...
A与B组件自动对齐与组装,无映射直接补偿。
网上针对组装的从视觉到控制动作,要不就是收费,要不就是简单介绍。这么详细的比较难找~ 手下留情,不喜勿喷! Show time~ 分步解决方案: 标定阶段(Calibration) 9点张氏标定(每个位置A1、A2、B1、B2): 使用机械手在相机视野内沿Z字形路径移动,覆盖9个点(XY方…...
SQL知识体系
SQL复习 MySQL SQL介绍 SQL SQL的全拼是什么? SQL全拼:Structured Query Language,也叫结构化查询语言。 SQL92和SQL99有什么区别呢? SQL92和SQL99分别代表了92年和99年颁布的SQL标准。 在 SQL92 中采用(ÿ…...
编译安装php
前置准备 这里的可能不全,每个人安装的模块不一致,依赖也不不相同,按实际情况调整 yum install libxml2 -y yum install libxml2-devel -y yum install openssl-devel -y yum install sqlite-devel -y yum install libcurl-devel -yyum ins…...
【分果果——DP(困难)】
题目 分析 分果果题解参考,下面是补充https://blog.csdn.net/AC__dream/article/details/129431299 关于状态 设f[i][j][k]表示第i个人取到的最后一个糖果编号是j,第i-1个人取到的最后一个糖果编号小于等于k时的最大重量的最小值 关于转移方程 关于 j …...
利用ffplay播放udp组播视频流
ffplay -fs -fflags nobuffer -flags low_delay -analyzeduration 0 -probesize 32 -framedrop -sync ext -strict experimental udp://224.1.1.1:5001 -fs : 全屏显示 -fflags nobuffer : 禁用输入缓冲(减少100-200ms缓冲延迟) -an…...
C++中变量与容器的默认初始化:0的奥秘
在C编程的世界里,初始化是一个至关重要的概念。它决定了变量或容器在程序开始执行时的初始状态。然而,对于不同的数据类型和容器,C标准对于默认初始化的行为有着不同的规定。本文将深入探讨C中变量与容器的默认初始化规则,特别是关…...
VScode内接入deepseek包过程(本地部署版包会)
目录 1. 首先得有vscode软件 2. 在我们的电脑本地已经部署了ollama,我将以qwen作为实验例子 3. 在vscode上的扩展商店下载continue 4. 下载完成后,依次点击添加模型 5. 在这里可以添加,各种各样的模型,选择我们的ollama 6. 选…...
spark
阶段性 阶段一: 单机时代 阶段二: 大数据时代-分布式处理 阶段三: 实时大数据时代 hadoop慢因为她的计算结果保存在磁盘 处理在spark中可解决属于内存 Hadoop特点: 高可靠性 高拓展性 高效性 高容错性...
蓝桥杯---排序数组(leetcode第912题)
文章目录 1.题目重述2.思路分析3.代码解释 1.题目重述 题目的要求是不使用库函数或者是其他的内置的函数(就是已经实现好的函数),也就是这个排序的逻辑需要我们自己进行实现; 2.思路分析 其实这个例子也是很容易理解的ÿ…...
【Javascript Day18】
目录 标签事件绑定的属性参数 阻止默认行为 dialog的实现及组织冒泡(捕获)传递 基于冒泡的事件委托 键盘事件的事件源对象信息 JS的自动触发操作 标签事件绑定的属性参数 <!-- 标签上的事件绑定,事件源对象通过 关键字event传递 --…...
轻量级C通用库Klib解读 —— kalloc
前言 Klib是一个独立的轻量级c通用库,里面大多数组件除了C标准库外不包含外部库,想用对应组件直接拷贝对应文件即可使用。 该库致力于高效和较小的内存占用,其中部分组件(如khash、kbtree、ksort、kvec),无…...
认识HTML的标签结构
一、HTML的基本概念 1.什么是HTML? ①HTML是描述网页的一种标记语言,也被称为超文本标记语言【并不是一种编程语言】 ②HTML包含了HTML标签和文本内容 ③HTML文档也称为web页面 2.HTML的标签 HTML的标签通常成对出现,HTML文档由标签和受…...
C语言 实现一个比较两个整型的函数 / qsort的使用 /qsort排序结构体
一、qsort的一般使用方法 int cmp_int(const void* e1, const void* e2) {return *(int*)e1 - *(int*)e2; } // //使用qsort对数组进行排序,升序 void test1() {int arr[] { 9,8,7,6,5,4,3,2,1,0 };int sz sizeof(arr) / sizeof(arr[0]);//bubble_sort(arr, sz);…...
Arcmap python环境安装sklearn
Arcmap自带的环境为Python2.7,默认安装目录为C:\Python27\ArcGIS10.7 直接安装sklearn会发生兼容性问题,且默认环境不包括pip,因此需要先安装pip 下载 get-pip.py 访问 https://bootstrap.pypa.io/pip/2.7/get-pip.py 并下载 get-pip.py。运…...
FastAdmin后端列表导入表格数据
后台添加数据的时候增加通过表格导入功能 如下图index.html页面增加导入和模板下载按钮代码如下 <div class"panel panel-default panel-intro">{:build_heading()}<div class"panel-body"><div id"myTabContent" class"ta…...
R语言用逻辑回归贝叶斯层次对本垒打数据与心脏移植数据后验预测检验模拟推断及先验影响分析|附数据代码...
全文链接:https://tecdat.cn/?p40152 在统计学领域中,层次建模是一种极为强大且实用的工具。它能够巧妙地处理复杂的数据结构,通过分层的方式对数据进行建模。在贝叶斯统计的框架内,层次建模优势尽显,其可以有效地融合…...
Python基于自然语言处理技术的新闻文本分类系统【附源码、文档说明】
博主介绍:✌Java老徐、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇&…...
mybatis存储过程返回list
在MyBatis中调用存储过程并返回列表(List)通常涉及以下几个步骤: 定义存储过程:首先,在数据库中定义存储过程,并确保它返回结果集。配置MyBatis映射文件:在MyBatis的映射文件中配置调用存储过程…...