Assembly 汇编语言调用约定

Assembly 汇编语言调用约定,assembly,stdcall,cdecl,Assembly,Stdcall,Cdecl,有人能给我一些真实的例子来帮助我理解什么是被调用者,什么是汇编语言中的调用者吗?我已经浏览了大部分信息来源,但仍然不知道如何区分被叫方和呼叫者。 先谢谢你。 (我正在添加此解释-再次感谢!抱歉,我是新来的,不知道如何插入代码以正确显示) 我试图理解这段代码——学习汇编的基础知识。我正在尝试为每个命令添加注释(我确信像我这样的其他人也需要它: sub_401040 proc near .text:00401040 .text:00401040 .text:0

有人能给我一些真实的例子来帮助我理解什么是被调用者,什么是汇编语言中的调用者吗?我已经浏览了大部分信息来源,但仍然不知道如何区分被叫方和呼叫者。 先谢谢你。 (我正在添加此解释-再次感谢!抱歉,我是新来的,不知道如何插入代码以正确显示) 我试图理解这段代码——学习汇编的基础知识。我正在尝试为每个命令添加注释(我确信像我这样的其他人也需要它:

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
我读到,为了定义调用约定,我需要找出谁是调用方,谁是被调用方:)我花了很多时间来理解逻辑:is call ds:lstrlenA是指被调用方吗?sub_401040是呼叫方吗?我们可以在一个程序中有多个调用约定吗?像cdecl和stdcall? 我不是程序员,也不是在写代码,我只是想了解这是如何帮助分析病毒的

调用方是具有相关
调用
(或rcall/blx/jalr/etc.函数调用指令)的调用方,被调用方是被调用的函数

func:
    do_stuff

func2:
    call func
在本例中,当
func2
调用
func
时,
func2
称为调用者,
func
称为被调用者


任何函数都可以是调用者或被调用者(或在不同的上下文中都可以),除非它不包含
call
指令。在后一种情况下,它将被称为“叶函数”,并且可能会应用一些优化。

当某个函数/子例程a调用另一个函数/子例程B时,a是调用方,B是被调用方。如果B调用C,则B成为C的调用者,C成为B的被调用者。因此,B既是调用者又是被调用者,这取决于您如何看待它。

在汇编语言中,函数调用与简单跳转(又称goto)没有太大区别。唯一的区别是函数参数在跳转之前存储在一些众所周知的地方,所以函数可以读取和使用它们。其中一个参数通常是函数完成工作后应该跳转的地址,称为“返回地址”。在跳转到此地址之前,函数可能会将返回值存储在某个众所周知的位置

所以调用者是一段代码,它将参数存储在已知位置,调用跳转到函数的开头,然后在函数跳转回它之后,从已知位置读取返回值


被调用方本身是一个函数,即调用方跳转到的一段代码,它从已知位置读取参数,根据这些参数执行一些工作,在已知位置存储返回值,并使用提供的返回地址跳回调用方。

不确定您的意思。你在写代码,对吗?所以您定义了调用约定。你是从内存中读取、写入内存、保存寄存器等的人。