mov 及常见指令;汇编分析指针、引用、is-else

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  
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值