文档介绍:该【在修改源程序代码使得字节数变化或者重新编译汇编情况下若偏移量 】是由【kuailonggua】上传分享,文档一共【76】页,该文档可以免费在线阅读,需要了解更多关于【在修改源程序代码使得字节数变化或者重新编译汇编情况下若偏移量 】的内容,可以使用淘豆网的站内搜索功能,选择自己适合的文档,以下文字是截取该文章内的部分文字,如需要获得完整电子版,请下载此文档到您的设备,方便您编辑和打印。2025/3/6
Chen Kaiming Copyright 2007
1
按引用方式返回一个函数值
int xdiv( int a, int b, int *c=0)
{
if (!b) return -1;
if (c) c[0]= a % b;
return a/b;
}
2025/3/6
Chen Kaiming Copyright 2007
2
用return 操作符返回值
16位: AX 寄存器
32位: EAX 寄存器
浮点数(float): DX :AX
EDX:EAX
2025/3/6
Chen Kaiming Copyright 2007
3
返回几百个字节数据怎么办?( >8字节)
2025/3/6
Chen Kaiming Copyright 2007
4
使用return返回值的机制(16位编译器)
类型(长度)
返回方式
1字节
AL 或者AX
2字节
AX
4字节
DX:AX
实型
DX:AX
浮点型
DX:AX或协处理器堆栈
双精度型
协处理器堆栈
近指针
AX
远指针
DX:AX
多于4字节
引用方式的隐含参数
2025/3/6
Chen Kaiming Copyright 2007
5
使用return返回值的机制(32位编译器)
类型(长度)
返回方式
1字节
AL 或AX或EAX
2字节
AX 或 EAX
4字节
EAX
8字节
EDX:EAX
浮点型
协处理器堆栈 或 EAX
双精度型
协处理器堆栈 或EDX:EAX
近指针
EAX
多于8字节
引用方式的隐含参数
2025/3/6
Chen Kaiming Copyright 2007
6
引用方式的隐含参数
如果寄存器中没有用于返回值的空间, 则编译器会在不告诉程序员的情况下, 给函数传递一个隐式参数(指向保存返回结果的局部变量的引用).
struct mystruct MyFunc(int a, int b)
void MyFunc(struct mystruct *my, int a, int b)
2025/3/6
Chen Kaiming Copyright 2007
7
Microsoft Visual C ++ 处理
struct mystruct *MyFunc(struct mystruct *my, int a,
int b)---返回指向被返回变量的指针.
Borland C++:
void MyFunc(struct mystruct *my, int a, int b)
2025/3/6
Chen Kaiming Copyright 2007
8
1. 如果函数显式地在EAX 或 EDX 中存放一个值并终止函数的运行, 那么,该值的类型可通过上表大致地确定下来.
2. 如果撇下寄存器而不给出定义, 那么最可能出现的结果是出现一个 void 类型的值.
3. 针对调用函数进行的分析会得到关于被调用函数如何存取EAX[EDX] 方面的更为准确的信息. 例如字符类型寻址 AX 处于低8位.
返回值的补充说明
2025/3/6
Chen Kaiming Copyright 2007
9
实验结果
列表103: 返回主要的值类型.
列表105: 按值方式返回一个结构.
列表108_666: 传递一个字节数非常多的结构体, 观察其目标代码的实现形式.
2025/3/6
Chen Kaiming Copyright 2007
10
返回浮点值
cdecl 与 stdcall 调用规范:
都要求通过协处理器堆栈来返回浮点值.
EAX(EDX) 在函数退出运行时,可以保存任何值.
解释: 虽然有些浮点数(实型) 能通过寄存器返回浮点值,但很少这样做, 其中一个原因为协处理器不能直接读取主处理器的值(寄存器, 可从浮点指令看出这点).
实例: ida