在C++中学习汇编语言

汇编的分类

8086汇编(16bit)
x86汇编(32bit)
x64汇编(64bit)
ARM汇编(嵌入式、移动设备)

汇编语言不区分大小写

x64汇编根据编译器的不同,有2种书写格式:Intel 和 AT&T

Intel 和 AT&T的区别

在这里插入图片描述

寄存器

寄存器就是用来存放运算结果的硬件,把内存里的树调入寄存器,经过cpu运算后,再放入寄存器,最后再调入内存
这是因为有些汇编指令只能对寄存器操作,不能直接对内存操作,这是由cpu架构决定的

比如mov指令不能直接从内存赋值到内存,必须借助寄存器
不同编译器寄存器不同
R开头的寄存器是bit,占8字节;E开头的寄存器是32bit,占4字节;
在这里插入图片描述
x86汇编寄存器
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

汇编指令

要在编译器中debug模式下调试,在release下编译器会优化

在这里插入图片描述

mov

mov dest, src将src的内容赋值给dest,类似于dest = src
◼ [ 地址值 ],括号[ ]里面放的都是内存地址
◼ word是2字节,dword是4字节(double word),qword是8字节(quad word)

在这里插入图片描述
在汇编下查看
在这里插入图片描述
在这里插入图片描述
a的内存地址就是EBP-C,不知道为什么,这编译器没有显示
在汇编页面右击只显示源代码,就能看到
在这里插入图片描述
调试的时候你会发现每一次调试,a的值都会发生变化,这是因为a是个局部变量,每次调用main这个局部函数,都会在内存中创建一个栈,分配空间,用完后销毁,而每一次分配的内存并不一定是同一块区域(即每次EBP是不一样的)。
放在外面就是全部变量,每次打开输出a的地址都是一样的。
在这里插入图片描述

call

在这里插入图片描述
f11跳转到指定位置
在这里插入图片描述
在这里插入图片描述

lea(load effect address)

lea dest, [ 1111H ]
将地址值赋值给dest,类似于dest = 地址值

ret

函数返回

xor op1, op2

将op1和op2异或的结果赋值给op1,类似于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等指令配合使用
在这里插入图片描述

	int a = 3;
 mov         dword ptr [ebp-8],3  
	int b = 4;
 mov         dword ptr [ebp-14h],4  
	if (a > b) {
 mov         eax,dword ptr [ebp-8]  
 cmp         eax,dword ptr [ebp-14h]  
 jle         008D2057  
		a = 1;
 mov         dword ptr [ebp-8],1  
	}else {
 jmp         008D205E  
		b = 1;
 mov         dword ptr [ebp-14h],1  
	}
	getchar();
 mov         esi,esp  
 call        dword ptr ds:[008DA194h]  
 cmp         esi,esp  
 call        008D1226  
	return 0;
 xor         eax,eax  
}

不同编程语言编译出来的汇编代码不同,取决于编译器,还有CPU架构(x86还是X64还是ARM)

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值