IA-32运行时环境

本文详细介绍了IA-32架构下的运行时环境,包括函数调用规范、参数传递、返回结果规则以及函数调用过程中的帧指针操作。在IA-32中,caller需将参数压栈并保存返回地址,callee则负责保存和恢复特定寄存器、分配局部变量空间。参数传递遵循从右到左的顺序,并进行对齐处理。返回值通常存储在EAX或STO寄存器中,结构体返回值可能涉及额外的指针参数。

现在来看看实际的运行时环境的实现,如下的PDF中给出了几种CPU的函数调用规范,我们现在只对ia-32进行分析
其中linkage area存放caller的下一条指令的地址
saved frame pointer:caller的stack frame的地址
saved register:存放函数调用后必须回复的寄存器的内容
local storage:存放callee的局部变量
其中parameter area是caller负责的,它需要把参数push到栈中,然后调用callee,调用操作会把caller的下一条指令push到栈中,也就是linkage area的内容,之后pc会跳转到callee的代码段,后面的内容就需要callee完成了
可以通过stack frame的正偏移和负偏移来判断是caller部分还是callee部分

callee至少需要完成两个过程:
Prologs:
1.push ebp(ebp就是frame pointer)
2.esp赋值给ebp
3.把必须preserved的register入栈,如ESI,EDI,EBX
4.在栈中为local storage分配空间
Epilogs:
1.释放栈中为local storage分配的空间
2.恢复preserved reigister(ESI,EDI,EBX,EBP)
3.把linkage的值赋值给pc

参数传递规则
1.栈必须是16字节对齐的,对于非vector的参数必须是4字节对齐的,所以对于单字节和双字节的参数,会被扩展为4字节,称为promotion
2.关于入栈的顺序,是从右到左入栈的
例子:
void foo(SInt32 i, float f, double d, SInt16 s, UInt8 c);
Figure 2  Argument assignment with arguments of the fundamental data types
从这里可以看到在入站之前,首先进行的就是16字节对齐的操作,之后是data type promotion

返回结果规则:
返回标量值
1.如果只返回一个整数或者指针,使用EAX寄存器
2.如果返回浮点数,使用STO寄存器
3.调用者使用完后,需要删除寄存器中的值
返回structure
1.如果structure的大小是1或者2个字节,那么使用EAX
2.如果structure的大小是4或者8个字节,那么使用EAX和EDX
3.如果大于8字节,那么会在callee中添加一个指针参数用来传递返回值,例子如下:
typedef struct {
    float ary[8];
} big_struct;
void callee(big_struct *p, int a, float b)
{
    big_struct callee_struct;
    ...
    *p = callee_struct;
    return;
}
caller() {
    big_struct caller_struct;
    callee(&caller_struct, 3, 42.0);
}
 
Preserved Register:

Type

Name

Preserved

Notes

General-purpose register

EAX

No

Used to return integral and pointer values. The caller may also place the address to storage where the callee places its return value in this register.

 

EDX

No

Dividend register (divide operation). Available for general use for all other operations.

 

ECX

No

Count register (shift and string operations). Available for general use for all other operations.

 

EBX

Yes

Position-independent code base register. Available for general use in non–position-independent code.

 

EBP

Yes

Stack frame pointer. Optionally holds the base address of the current stack frame. A routine’s parameters reside in the previous frame as positive offsets of this register’s value. Local variables reside at negative offsets.

 

ESI

Yes

Available for general use.

 

EDI

Yes

Available for general use.

Stack-pointer register

ESP

Yes

Holds the address of the bottom of the stack.



【永磁同步电机】基于模型预测控制MPC的永磁同步电机非线性终端滑模控制仿真研究(Simulink&Matlab代码实现)内容概要:本文围绕永磁同步电机(PMSM)的高性能控制展开,提出了一种结合模型预测控制(MPC)与非线性终端滑模控制(NTSMC)的先进控制策略,并通过Simulink与Matlab进行系统建模与仿真验证。该方法旨在克服传统控制中动态响应慢、鲁棒性不足等问题,利用MPC的多步预测和滚动优化能力,结合NTSMC的强鲁棒性和有限间收敛特性,实现对电机转速和电流的高精度、快速响应控制。文中详细阐述了系统数学模型构建、控制器设计流程、参数整定方法及仿真结果分析,展示了该复合控制策略在抗干扰能力和动态性能方面的优越性。; 适合人群:具备自动控制理论、电机控制基础知识及一定Matlab/Simulink仿真能力的电气工程、自动化等相关专业的研究生、科研人员及从事电机驱动系统开发的工程师。; 使用场景及目标:①用于深入理解模型预测控制与滑模控制在电机系统中的融合应用;②为永磁同步电机高性能控制系统的仿真研究与实际设计提供可复现的技术方案与代码参考;③支撑科研论文复现、课题研究或工程项目前期验证。; 阅读建议:建议读者结合提供的Simulink模型与Matlab代码,逐步调试仿真环境,重点分析控制器设计逻辑与参数敏感性,同可尝试在此基础上引入外部扰动或参数变化以进一步验证控制鲁棒性。
一种基于有效视角点方法的相机位姿估计MATLAB实现方案 该算法通过建立三维空间点与二维图像点之间的几何对应关系,实现相机外部参数的精确求解。其核心原理在于将三维控制点表示为四个虚拟基点的加权组合,从而将非线性优化问题转化为线性方程组的求解过程。 具体实现步骤包含以下关键环节:首先对输入的三维世界坐标点进行归一化预处理,以提升数值计算的稳定性。随后构建包含四个虚拟基点的参考坐标系,并通过奇异值分解确定各三维点在该基坐标系下的齐次坐标表示。接下来建立二维图像点与三维基坐标之间的投影方程,形成线性约束系统。通过求解该线性系统获得虚拟基点在相机坐标系下的初步坐标估计。 在获得基础解后,需执行高斯-牛顿迭代优化以进一步提高估计精度。该过程通过最小化重投影误差来优化相机旋转矩阵和平移向量。最终输出包含完整的相机外参矩阵,其中旋转部分采用正交化处理确保满足旋转矩阵的约束条件。 该实现方案特别注重数值稳定性处理,包括适当的坐标缩放、矩阵条件数检测以及迭代收敛判断机制。算法能够有效处理噪声干扰下的位姿估计问题,为计算机视觉中的三维重建、目标跟踪等应用提供可靠的技术基础。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值