## 前言
最近在看一些关于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
## 未完待续~~
网友评论