mov
- mov dest,src
将src的内容赋值给dest - []
中括号内放的为内存地址 - word(2字节)、dword(4字节)、qword(8字节quad word)
a的地址:008FF918h
[ebp-8]:8F F920h-8h = a的地址
ptr为固定写法 - Q&A
Q:为什么不直接用a的地址
A:这种寻址方式更灵活,程序每次加载到内存的地址不是固定的。
变量的地址
CPU大部分是小端模式。高存高,低存低(高地址存高字节,低地址存底字节)
一个变量的地址,是他所有字节地址中的最小值
其他指令
- call 函数地址
函数调用 - lea dest,[地址值]
lea:load effective address
将地址值赋值给dest - ret
函数返回 - xor op1,op2
异或 op1 = op1^op2 - add op1,op2
op1=op1+op2 - sub op1,op2
op1=op1-op2 - inc op
op=op+1 - dec op
op=op-1 - jmp 内存地址
跳转到某个内存地址执行代码
大多数是带条件的跳转,一般跟test、cmp等指令配合使用
汇编分析
if-else
#include <iostream>
using namespace std;
int main()
{
00452F70 push ebp
00452F71 mov ebp,esp
00452F73 sub esp,0D8h
00452F79 push ebx
00452F7A push esi
00452F7B push edi
00452F7C lea edi,[ebp-0D8h]
00452F82 mov ecx,36h
00452F87 mov eax,0CCCCCCCCh
00452F8C rep stos dword ptr es:[edi]
00452F8E mov ecx,offset _280923C9_main@cpp (0460029h)
00452F93 call @__CheckForDebuggerJustMyCode@4 (0451406h)
int a = 3;
00452F98 mov dword ptr [a],3
int b = 4;
00452F9F mov dword ptr [b],4
if (a > b) {
00452FA6 mov eax,dword ptr [a]
00452FA9 cmp eax,dword ptr [b]
//小于等于就跳转
00452FAC jle main+4Dh (0452FBDh)
printf("1111\n");
00452FAE push offset string "1111\n" (045AC38h)
00452FB3 call std::basic_ostream<char,std::char_traits<char> >::sentry::sentry (045155Ah)
00452FB8 add esp,4
}
00452FBB jmp main+5Ah (0452FCAh)
else {
printf("222\n");
00452FBD push offset string "222\n" (045AC40h)
00452FC2 call std::basic_ostream<char,std::char_traits<char> >::sentry::sentry (045155Ah)
00452FC7 add esp,4
}
return 0;
00452FCA xor eax,eax
}
00452FCC pop edi
00452FCD pop esi
00452FCE pop ebx
00452FCF add esp,0D8h
00452FD5 cmp ebp,esp
00452FD7 call __RTC_CheckEsp (04512F8h)
00452FDC mov esp,ebp
00452FDE pop ebp
00452FDF ret
}
008710B0 mov esp,ebp
008710B2 pop ebp
008710B3 ret
指针
int main()
{
009A1002 in al,dx
009A1003 sub esp,0Ch
009A1006 mov eax,dword ptr ds:[009A3004h]
009A100B xor eax,ebp
009A100D mov dword ptr [ebp-4],eax
int age = 10;
009A1010 mov dword ptr [ebp-8],0Ah
int* p = &age;
//指针一般有lea操作
//lea没有大小修饰;mov有大小修饰
009A1017 lea eax,[ebp-8]
009A101A mov dword ptr [ebp-0Ch],eax
*p = 5;
009A101D mov ecx,dword ptr [ebp-0Ch]
009A1020 mov dword ptr [ecx],5
return 0;
009A1026 xor eax,eax
}
引用
int main()
{
008A1002 in al,dx
008A1003 sub esp,0Ch
008A1006 mov eax,dword ptr ds:[008A3004h]
008A100B xor eax,ebp
008A100D mov dword ptr [ebp-4],eax
int age = 10;
008A1010 mov dword ptr [ebp-8],0Ah
int& ref = age;
//引用的本质就是指针
008A1017 lea eax,[ebp-8]
008A101A mov dword ptr [ebp-0Ch],eax
ref = 5;
008A101D mov ecx,dword ptr [ebp-0Ch]
008A1020 mov dword ptr [ecx],5
return 0;
008A1026 xor eax,eax
}