在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)
本文地址:https://blog.csdn.net/m0_43450897/article/details/107178418
推荐阅读
-
在AI人工智能中如何巧妙学习大数据编程,成为五十万年薪的佼佼者
-
DEV C++在win7系统中安装以及遇到的一些问题解决
-
Android学习笔记--使用剪切板在Activity中传值示例代码
-
学习ASP.NET Core Razor 编程系列十二——在页面中增加校验
-
Linux学习之CentOS(一)----在VMware虚拟机中安装CentOS 7(图文教程)
-
在C++中,函数名前的const和函数名后的const的区别详解
-
More Effective C++在leveldb中的体现
-
C++中 char、short、long、double等在32位机中指针占几个字节?
-
在Visual C++ 6.0中为代码添加行号
-
IOS学习:在工程中添加百度地图SDK