天天看点

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

作者:秋风技术

前言

在用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)]
}           

个人能力有限,如果您发现有什么不对,请私信我

如果您觉得对您有用的话,可以点个赞或者加个关注,欢迎大家一起进行技术交流

继续阅读