在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)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章