我反汇编了一个小程序,要求用户输入他们的名字,然后输出“你好+ [用户名]”
这是反汇编的输出:
主要功能:
说出你好的功能:
我注意到,对于function verifyCredentials(req, res, next) {
User.findOne({username: req.body.username}, function(err, user) //query Mongo
{
if(user === null) {
return next(new Error('Username does not exist in database'));
} else {
user.comparePassword(req.body.password, function(err, match) {
if(match) {
next(null, {id: username, name: username});
} else {
next(new Error('not match'));
}
});
}
});
}
app.post('/login', verifyCredentials, authRoutes.loginCheck);
函数,ESP寄存器按Ox10递减,对于main()
函数,ESP寄存器递减0x20。为什么会这样?
仅供参考:我的处理器是1.4 GHz Intel Core i5,我正在运行OSX
原始C代码:
say_hello()
答案 0 :(得分:2)
它在堆栈上为局部变量分配空间。第一个BP它设置为SP的当前值,然后SP递减,以便为函数使用的局部变量腾出空间。如您所见,稍后[ss:rbp + ???]用于访问此保留空间的部分内存。
这与在堆栈上重复推送一些虚拟值基本相同。
在函数离开之前,确切的数量被添加回SP是至关重要的,否则RET指令将使用错误的返回地址,程序很可能会崩溃。
答案 1 :(得分:2)
通过堆栈指针“实现”堆栈,堆栈指针指向堆栈段。每次在堆栈上推送一些东西(通过pushl,call或类似的堆栈操作码),它就会写入堆栈指针指向的地址,并且堆栈指针递减( 堆栈正在增长)向下,即较小的地址 )。当您从堆栈中弹出一些东西(popl,ret)时,堆栈指针会递增,并从堆栈中读取值。
对于不同的函数调用,我们为堆栈中的局部变量保留空间,因此我们减少它并获得空间。这通常使用prologue and epilogue完成。
<强>序言强>
如果体系结构具有基指针(也称为帧指针)和堆栈指针,则函数序言通常执行以下操作(以下操作可能不适用于缺少基指针或堆栈指针的那些体系结构) :
<强>后记强>
函数结尾会反转函数序言的动作并将控制权返回给调用函数。它通常执行以下操作(此过程可能因架构而异):
答案 2 :(得分:0)
据我所知,这种减少主要用于&#34;保留&#34;放在堆栈上或保证内存对齐。