欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

在C++中学习汇编语言

程序员文章站 2022-03-21 08:01:14
汇编的分类汇编指令movcall...

汇编的分类

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

汇编语言不区分大小写

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

Intel 和 AT&T的区别

在C++中学习汇编语言

寄存器

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

比如mov指令不能直接从内存赋值到内存,必须借助寄存器
不同编译器寄存器不同
R开头的寄存器是bit,占8字节;E开头的寄存器是32bit,占4字节;
在C++中学习汇编语言
x86汇编寄存器
在C++中学习汇编语言

汇编指令

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

mov

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

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

call

在C++中学习汇编语言
f11跳转到指定位置
在C++中学习汇编语言
在C++中学习汇编语言

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
在C++中学习汇编语言

sub op1, op2

类似于op1 = op1 - op2

inc op

自增,类似于op = op + 1

dec op

自减,类似于op = op – 1

jmp 内存地址

跳转到某个内存地址去执行代码
开头的一般都是跳转,大多数是带条件的跳转,一般跟test、cmp等指令配合使用
在C++中学习汇编语言

	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)

本文地址:https://blog.csdn.net/m0_43450897/article/details/107178418