汇编

来源:互联网 发布:梯形螺纹加工编程 编辑:程序博客网 时间:2024/06/05 15:07

1 intel 80X86系列寄存器

以Intel 80x86 CPU为例,80x86 CPU的寄存器组包括若干个8位、16位和32位寄存器,其中,32位寄存器是从80386 CPU开始才引入的。这些寄存器可以被分为4类,它们是通用寄存器、段寄存器、专用寄存器及其他寄存器。通常,应用程序主要使用前3类寄存器。

1.1 通用寄存器

80x86 CPU的通用寄存器包括8个8位通用寄存器,它们是AL、AH、BL、BH、CL、CH、DL、DH;8个16位通用寄存器,它们是AX、BX、CX、 DX、SI、DI、BP、SP;8个32位通用寄存器,它们是EAX、EBX、ECX、EDX、ESI、EDI、EBP、ESP。
AX、BX、CX、DX、SI、DI、BP和SP分别对应于EAX、EBX、ECX、EDX、ESI、 EDI、EBP和ESP的低16位,EAX、EBX、ECX、EDX、ESI、EDI、EBP和ESP都是32位的。
EAX(含AX、AH和AL)、EBX(含BX、BH和BL)、ECX(含CX、CH和CL)和EDX(含DX、DH和DL)统称为数据寄存器;ESI(含SI)和EDI(含DI)统称为变址寄存器; EBP(含BP)和ESP(含SP)统称为指针寄存器

EAX(累加器)
EBX(基址寄存器)
ECX(计数寄存器)
EDX(数据寄存器)
ESI(源变址寄存器,Source Index)
EDI(目的变址寄存器,Destination Index)
EBP(基址指针,Base Pointer)
ESP(堆栈指针,Stack Pointer)

1.2 段寄存器

代码段(Code Segment):用来存放程序的指令序列。
数据段(Data Segment):用来存放程序的数据。
堆栈段(Stack Segment):作为堆栈使用的内存区域。
Intel 80x86 CPU提供了6个16位的段寄存器,它们是CS、DS、ES、SS、FS和GS。其中FS和GS是从Intel 80386 CPU才开始引入的。
一般来说,CS、DS和SS分别用来确定当前代码段、数据段和堆栈段的段地址。
ES(Extra Segment)、FS和GS常被称为附加段寄存器,它们也用来存放数据段的段地址。

1.3 专用寄存器

Intel 80x86 CPU有两个32位的专用寄存器,它们分别是指令指针EIP(Instruction Pointer)和标志寄存器EFLAGS(Flags Register)。
IP和FLAGS是其低16位。

2 汇编编写

2.1 AT&T汇编

2.1.1 编译方式

  • 使用汇编程序GAS和连接程序LD
    第一步: as sourcecode.s -o objfile.o,将汇编源文件编译成目标文件;
    第二步:ld objfile.o -o execode,将目标文件链接成可执行文件。

  • 使用GCC
    gcc -o execode sourcecode.S
    使用GCC编译一步就可以编译成可执行文件

2.1.2 AT&T中的节

.data
.text
.bss

AT&T和Intel汇编语言的语法区别主要体现在操作数前缀、赋值方向、间接寻址语法、操作码的后缀上。

2.1.3 以下的内容都是AT&T汇编的特点:

(1)寄存器前面要加”%”,如 mov %eax,%ebx
这里要注意的一点是,AT&T汇编中,源寄存器和目的寄存器的顺序和intel汇编刚好相反,AT&T汇编中,左边的是源寄存器,右边的是目的寄存器,在上边那个例子中,%eax是源寄存器,%ebx是目的寄存器。

(2)立即数/常数前面要加$,如 mov $4,%ebx 把4这个数装入ebx这个寄存器。
符号常数直接用, 如 mov value,%eax 即把value代表的那个值装入eax寄存器。
mov $value,%eax 即把value的值作为地址,而把对应那个地址中的值装入eax。

(3)b(byte):8位,w(word):16位,l(long):32位
如:movb %ax,%bx movw %eax,%ebx

(4)jum/call的操作数前要加上“*”作为前缀, 远跳转ljmp,远调用lcall
如:ljmp $section,$offset lcall $section,$offset
这里section和offset表示的就是,以section为段地址,offset为段内偏移地址。因此,ljmp $section,$offset即跳转到section:offset地址。

(5)远返回lret
如:lret $stack_adjust

(6)寻址方式

2.2 GCC内嵌汇编

2.2.1 基本行内汇编

asm
volatile

2.2.2 内嵌汇编语法如下

__asm__(    汇编语句模板:     输出部分:     输入部分:     破坏描述部分);
原创粉丝点击