通过汇编代码学习函数和参数调用
前言
在用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