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
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值