谁能给我一些真实的例子,帮助我理解汇编语言中什么是被调用者,什么是调用者?我已经看过了大部分资源,但我仍然不知道如何区分被调用者和调用者。提前谢谢你。(我添加了这个解释-再次感谢您!对于代码我很抱歉,我是新手,不知道如何插入代码以正确显示)我正在尝试理解这段代码-学习汇编的基础知识。我正在尝试为每个命令添加注释(我相信像我这样的其他人也会需要它:
sub_401040 proc near
.text:00401040
.text:00401040
.text:00401040 000 push ebp ; Push the content of ebp register onto the stack
.text:00401041 004 mov ebp, esp ;Allocating 8 bytes of storage ; move the esp register content into ebp register
.text:00401043 004 push ecx
.text:00401044 008 mov eax, [ebp+8]
.text:00401047 008 push eax ; Push eax contents onto the stack
.text:00401048 00C call ds:lstrlenA
.text:0040104E 008 add eax, [ebp+0Ch]
.text:00401051 008 mov edx, eax
.text:00401053 008 mov ecx, 1 ;Set buffer address
.text:00401058 008 call sub_401000
.text:0040105D 008 mov [ebp-4], eax
.text:00401060 008 mov ecx, [ebp-4]
.text:00401063 008 shl ecx, 2
.text:00401066 008 mov [ebp-4], ecx
.text:00401069 008 mov edx, [ebp-4]
.text:0040106C 008 push edx
.text:0040106D 00C push offset aResultD ; "Result: %d\n"
.text:00401072 010 call ds:printf
.text:00401078 010 add esp, 8 ; clean up the stack by adding the size of the argument to esp register
.text:0040107B 008 mov eax, 539h
.text:00401080 008 mov esp, ebp
.text:00401082 004 pop ebp ;Restore old frame pointer
.text:00401083 000 retn ; Return near
.text:00401083 sub_401040 endp我读到,为了定义调用约定,我需要弄清楚谁是调用者,谁是被调用者:)我花了很多时间来理解逻辑:调用ds:lstrlenA意味着被调用者是被调用者吗?sub_401040是调用者吗?我们可以在一个程序中有多个调用约定吗?比如cdecl和stdcall?我不是一个程序员,我也不是在写代码,我只是想知道这是如何帮助分析病毒的。
发布于 2013-02-19 15:42:13
调用者是具有相关call (或rcall/blx/jalr等函数调用指令)的调用者,被调用者是被调用的函数。
func:
do_stuff
func2:
call func在本例中,当func2调用func时,func2被称为调用方,func被称为被调用方。
任何函数都可以是调用者或被调用者(或者在不同的上下文中都是),除非它不包含call指令。在后一种情况下,它将被称为“叶函数”,且可以应用一些优化。
发布于 2013-02-19 15:43:17
当某个函数/子例程A调用其他函数/子例程B时,A是调用者,B是被调用者。如果B调用C,则B成为C的调用者,C成为B的被调用者。因此,B既是调用者又是被调用者,这取决于您如何看待它。
发布于 2013-02-19 15:46:24
在汇编语言中,函数调用与简单的跳转没有太大不同(也称为。goto)。唯一不同的是,函数参数在跳转之前存储在一些众所周知的位置,因此函数可以读取和使用它们。其中一个参数通常是函数在完成其工作后应该跳转的地址,即所谓的“返回地址”。在跳转到这个地址之前,函数可能会将返回值存储在某个众所周知的位置。
因此caller是一段存储参数的代码,它会跳转到函数的开头,然后,在函数跳回到它之后,从众所周知的地方读取返回值。
Callee本身是一个函数,即调用者跳转到的一段代码,它从众所周知的地方读取参数,基于这些参数执行一些工作,将返回值存储在众所周知的地方,并使用提供的返回地址跳回到调用者。
https://stackoverflow.com/questions/14952191
复制相似问题