汇编
汇编语言的种类
- 8086汇编(16bit)。
- x86汇编(32bit)。
- x64汇编(64bit)。
- ARM汇编(嵌入式、移动设备)。
- …
x64汇编根据编译器的不同,有2种书写格式:
- Intel。
- AT&T。
汇编语言不区分大小写。
x64汇编-寄存器
通常,CPU会将内存中的数据存储到寄存器中,然后再对寄存器中的数据进行运算。
假设内存中有块红色内存空间的值是3,现在想把它的值加1,并将结果存储到蓝色内存空间。

- CPU首先将红色内存空间的值放到EXA寄存器中:mov eax, 红色内存空间。
- 让EAX寄存器与1相加:add eax, 1。
- 赋值给蓝色内存空间:mov 蓝色内存空间, eax。
对应代码大概是这样子:
int a = 1;
int b = a + 1;
通用寄存器
64bit:RAX、RBX、RCX、RDX。
32bit:EAX、EBX、ECX、EDX。
16bit:AX、BX、CX、DX。

cpu会将寄存器一半(低位)拿出来,兼容以前的寄存器。以此类推。
比如,64位的寄存器,会将0-31位拿出来兼容32位。
如图,EAX就存在RAX里面。
一般规律:R开头的寄存器是64bit的,占8个字节。E开头的寄存器是32bit的,占4个字节。
x64汇编要点
mov dest src
将src的内容赋值给dest。
[ 地址值 ]
中括号里放的都是内存地址。
字节大小
| 单词 | 字节大小 |
|---|---|
| word | 2 |
| dword(double word) | 4 |
| qword(quad word) | 8 |
向1128h地址中,存入3,占2个字节。
mov word ptr [1128h], 3。
其中ptr是固定写法。每个字节都有自己的地址,而占两及以上个字节时,会向高位吞并空间。
call 函数地址
调用函数。
lea dest, [地址值]
将地址值赋值给dest。
ret
函数返回。
xor op1, op2
将op1和op2异或的结果赋值给op1,类似 op1 ^= op2。
add op1, op2
加法。类似于 op1 += op2。
sub op1, op2
减法。类似于 op1 -= op2。
inc op
自增。op = op + 1。
dec op
自减。op = op - 1。
jmp 内存地址
跳转到目标地址,执行代码。
j开头的一般都是跳转,大多数是带条件的跳转,一般跟test、cmp等指令配合使用。