前言
在用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)]
}
个人能力有限,如果您发现有什么不对,请私信我
如果您觉得对您有用的话,可以点个赞或者加个关注,欢迎大家一起进行技术交流