C++中通过指针,引用方式做返回值的汇编代码分析

本文分析了C++中实现的一个max函数的汇编代码,该函数接收两个整型指针并返回较大的值。文章详细解释了如何通过指针获取实际数值进行比较,并将较大值写回指针所指向的位置。

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

C++中通过指针,引用方式做返回值的汇编代码分析

write by 九天雁翎(JTianLing) -- blog.youkuaiyun.com/vagrxie

源代码因为是《加密与解密》(第3版)一书中的代码,我就不贴了,不然好像是侵犯版权吧。见书中79面。

基本原理可以讲讲,其实就是一个max(int*,int*)的函数,将大的值放入第一个参数返回,原书可能是在debug下编译的版本,我是在release下编译的,反汇编结果如下:

.text:00401040 ; void __cdecl max(int *, int *)

.text:00401040 void __cdecl max(int *, int *) proc near ; CODE XREF: _main+1Dp

.text:00401040

.text:00401040 arg_0 = dword ptr 4

.text:00401040 arg_4 = dword ptr 8

.text:00401040

.text:00401040 000 mov eax, [esp+arg_4]

.text:00401044 000 mov ecx, [esp+arg_0]

.text:00401048 000 mov eax, [eax] ; 相当于C语言中的dereference操作

.text:0040104A 000 mov edx, [ecx]

.text:0040104C 000 cmp edx, eax ; Compare Two Operands

.text:0040104E 000 jge short locret_401052 ; Jump if Greater or Equal (SF=OF)

.text:00401050 000 mov [ecx], eax ; 假如dex>=eax(a>=b)直接跳到locret_401052返回,即不变

.text:00401050 ; 假如dex<eax><p>.text:00401050 ; 此处相当于*ecx = eax,:)注释扭曲了 </p> <p>.text:00401052 </p> <p>.text:00401052 locret_401052: ; CODE XREF: max(int *,int *)+Ej </p> <p>.text:00401052 000 retn ; Return Near from Procedure </p> <p>.text:00401052 void __cdecl max(int *, int *) endp </p> <p> </p> <p> </p> <p>这里唯一需要注意的就是 </p> <p>mov eax, [esp+arg_4] </p> <p>mov ecx, [esp+arg_0] </p> <p>mov eax, [eax] </p> <p>mov edx, [ecx] </p> <p>这4句了,先将一个地址传入,eax/ecx,然后通过[eax]/[ecx]取值,就相当于dereference的操作,即相当于*操作符的作用。 </p> <p> </p> <p style="text-align: right"><span style="color:#c0504d; text-decoration:underline"><strong>write by <span style="font-family:宋体">九天雁翎</span>(JTianLing) -- blog.youkuaiyun.com/vagrxie</strong></span> </p> </eax>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值