汇编笔记

## 前言

最近在看一些关于linux startup的东西,对于其中使用到的AT&T的汇编语法有点陌生,所以写下这篇文章来帮助自己和更多的人了解一些常见的AT&T汇编的语法。

因为之前看过一段时间的汇编语法,所以并不会对其中的语法有过多的深入(主要是自己学的还不够好,大大的羞愧),仅针对自己感兴趣的方面,如果有同学对其中的部分感兴趣或者想给予扩充,非常欢迎!(你问我支不支持,我是支持滴!)

## 学习环境

因为自己平时主要是使用Mac进行编程,所以文章中如果出现部分示例,仅仅确保在Mac的环境中能够正常运行(周知~)。如果有热心的同学能够对不同的环境下的运行结果进行反馈,也是欢迎的(我是认真的~)。

## 汇编常用的语法

### section directive

1. data section

用来声明程序中用来存储数据的内存区域;这个区域在声明之后不能被扩充,在程序中全局为static。

2. bss section

bss也是静态内存区域,包含在程序中定义的数据缓冲,这段内存区域的独特之处是使用了0进行填充。

3. text section

这段内存区域用来存储指令代码,这段区域是固定的。

### register

1. EAX

累加器,用来进行加法运算,存储结果。

2. EBX

指向数据内存区域中的数据指针。

3. ECX

string和循环操作的计数器。

4. EDX

I/O指针。

5. EDI

指向string操作目的地址的数据指针。

6. ESI

指向string操作源地址的数据指针。

7. ESP

栈指针。

8. EBP

栈数据指针。

### segment registers

1. CS

代码段,CS寄存器中包含了指向内存中代码段的指针,代码段是内存中指令代码存储的地方。处理器基于CS寄存器的值从内存中获取指令代码,而相关的偏移量则存储在EIP指令指针寄存器当中。

2. DS

数据段,DS、ES、FS、GS均指向数据段。使用这4种不同的数据段,可以帮助程序分离不同的数据对象,使得他们直接没有交集。

3. SS

堆栈段,SS寄存器当中包含了指向内存中堆栈段的指针。栈中包含了程序中传递给函数的数据。

4. ES

5. FS

6. GS

### instruction pointer register

Instruction pointer register(EIP, 指令指针寄存器)有时也被称之为程序计数器,指向下一个要被执行的指令代码。通常情况下,不能直接去修改EIP中的值,可以通过jump等指令的方式间接的修改EIP中的值,并将下一个指令代码进行cache。

### control register

Control register在x86系列中包含CR0-7,在x86_64中则额外增加了EFER、CR8这两个控制寄存器。通过控制寄存器,可以决定处理器的操作模式、当前执行任务的特性等。

在通常情况下,不能够直接获取到控制寄存器的数值。需要将控制寄存器的数值转到通用寄存器当中,才能获取到;如果希望对控制寄存器进行赋值,则需要将数值转移到通用寄存器当中,然后将通用寄存器的值赋给控制寄存器。

### flags

通过flag来表明一个程序是否被正确执行了。

按照功能,flag被分为以下几种:

1. Status flags

被用来标识算数操作的结果。

|flag      |bit        |name            |describe|

| -------------|:--------------:|:--------------:|:--------------:|

|CF|0|Carry flag|在算术运算中,数字溢出时使用|

|PF|2|Parity flag|奇偶校验符|

|AF|4|Adjust flag|类似于十进制加减法,在进位或者借位的时候使用|

|ZF|6|Zero flag|当一个操作的结果为0时,此标识位置为1|

|SF|7|Sign flag||

2. Control flags

3. System flags

## 未完待续~~

你可能感兴趣的:(汇编笔记)