通过汇编代码学习函数和参数调用

前言

在用WinDbg调试CoreCLR源码的时候,想起在VS Studio也是反汇编调试的.这里在VS中进行汇编调试.

C++代码

int addNum(int a, int b)
{
    return a + b;
}

int main(int argc, char* argv[])
{
    int a = 10;
    int b = 20;
    int result = addNum(a, b);

    cin.get();
}

汇编代码:

int addNum(int a, int b)
{
        mov         dword ptr[rsp + 10h], edx    ;; 先将变量b从edx寄存器上加载栈上
        mov         dword ptr[rsp + 8], ecx      ;; 将变量a从ecx寄存器上加载到栈上rsp + 8
        push        rbp
        push        rdi
        sub         rsp, 0E8h
        lea         rbp, [rsp + 20h]
        lea         rcx, [__592BE506_main@cpp(07FF66A872076h)]
        call        __CheckForDebuggerJustMyCode(07FF66A7B52C4h)
        return a + b; ;; 从这里开始看
        mov         eax, dword ptr[b]            ;; 变量b加载eax寄存器上
        mov         ecx, dword ptr[a]            ;; 变量a加载ecx寄存器上
        add         ecx, eax                     ;; 将eaxde值在ecx寄存器上进行加法运算
        mov         eax, ecx                     ;; 在将ecx的值移到eax上
}


int main(int argc, char* argv[])
{
        mov         qword ptr[rsp + 10h], rdx
        mov         dword ptr[rsp + 8], ecx
        push        rbp
        push        rdi
        sub         rsp, 148h
        lea         rbp, [rsp + 20h]
        lea         rcx, [__592BE506_main@cpp(07FF66A872076h)]
        call        __CheckForDebuggerJustMyCode(07FF66A7B52C4h)
        int a = 10;
        mov         dword ptr[a], 0Ah   ;; 在栈上对变量a初始化并赋值10
        int b = 20;
        mov         dword ptr[b], 14h   ;; 在栈上对变量b初始化并赋值20
        int result = addNum(a, b);
        mov         edx, dword ptr[b]    ;; 在调用方法时, 参数自右向左, 先将变量b加载到edx寄存器上
        mov         ecx, dword ptr[a]    ;; 将变量a的值加载ecx寄存器上
        call        addNum(07FF66A7B48B5h);; 调用addNum方法
        mov         dword ptr[result], eax;;从eax获取addNum的返回值

        cin.get();
        mov         rcx, qword ptr[__imp_std::cin(07FF66A86E3E8h)]
        call        qword ptr[__imp_std::basic_istream<char, std::char_traits<char> >::get(07FF66A86E3F0h)]
}

由于不是系统性学习汇编,这里只是根据汇编指令推断.

秋风 2023-07-09