汇编语言的种类

  1. 8086汇编(16bit)。
  2. x86汇编(32bit)。
  3. x64汇编(64bit)。
  4. ARM汇编(嵌入式、移动设备)。

x64汇编根据编译器的不同,有2种书写格式:

  1. Intel。
  2. AT&T。

汇编语言不区分大小写。

x64汇编-寄存器

通常,CPU会将内存中的数据存储到寄存器中,然后再对寄存器中的数据进行运算。

假设内存中有块红色内存空间的值是3,现在想把它的值加1,并将结果存储到蓝色内存空间。

image-20210703121835190

  1. CPU首先将红色内存空间的值放到EXA寄存器中:mov eax, 红色内存空间。
  2. 让EAX寄存器与1相加:add eax, 1。
  3. 赋值给蓝色内存空间:mov 蓝色内存空间, eax。

对应代码大概是这样子:

int a = 1;
int b = a + 1;

通用寄存器

64bit:RAXRBXRCXRDX

32bit:EAXEBXECXEDX

16bit:AXBXCXDX

image-20210703122847668

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开头的一般都是跳转,大多数是带条件的跳转,一般跟testcmp等指令配合使用。