x86编译语言入门(史上最全面,一学就会)

目录

一、X86汇编语言程序设计的基本框架

1.1.数据段

1.2.堆栈段

1.3.代码段

 二、三种程序设计方法及常用函数

2.1.顺序结构

2.2.分支结构

2.3.循环结构

三、cs寄存器和IP寄存器的使用

四、8086寄存器

4.1.通用寄存器

4.2.堆栈寄存器

4.3.数据寄存器

4.4.标志寄存器

4.5指令寄存器IP

4.6.代码段寄存器CS

五、寻址方式

1、立即寻址:

2、直接寻址:

3、R寻址:

4、R间接寻址:

5、变址寻址:

6、基址寻址:

7、基址变址寻址:

8、相对寻址:


来都来了点个赞再走呗~~~

一、X86汇编语言程序设计的基本框架

1.1.数据段

  • 数据段用于存储程序中静态和全局变量的数据
  • 它通常包含初始化的数据,这些数据在程序开始执行时就被加载到内存中。
  • 数据段通常被设置为只读,以防止程序意外地修改这些数据。

 

1.2.堆栈段

  • 堆栈段用于存储局部变量、函数调用的返回地址以及程序中的临时数据。
  • 堆栈是一个后进先出(LIFO)的数据结构,最后一个进入堆栈的元素将是第一个出来的。
  • 堆栈的增长和缩小通常由汇编语言中的PUSH和POP指令控制。

 

1.3.代码段

  • 代码段用于存储程序的指令。
  • 它包含程序开始执行时需要执行的机器代码。
  • 代码段通常被设置为只读,以防止程序意外地修改其指令。

 二、三种程序设计方法及常用函数

MOV,LEA,ADD,SUB,TEST,CMP,XLAT,DEC,INC,AND,XOR,OR,SHL,SAL,SHR,SARJMP,JC,JNC,JE/JZ,JS,JNS,JO,JNO,JP/JPE,JNP/JPO;LOOP,LOOPE/LOOPZ,LOOPNE/LOOPNZ,JCXZ

2.1.顺序结构

        顺序结构是最简单的程序结构,它按照指令的顺序逐条执行。在x86汇编语言中,顺序结构由一系列指令组成,按照它们在代码段中的顺序执行。没有条件或跳转指令中断程序的正常执行流程。

例如:

MOV AX, 10 ; 将10移入AX寄存器

ADD AX, 5 ; 将5加到AX寄存器上

        在这个例子中,两条指令按照它们在代码中的顺序执行,首先是将10移入AX寄存器,然后是将5加到AX寄存器上。

常用指令

  1. MOV:移动指令。用于将数据从一个位置复制到另一个位置。

    例如:MOV AX, [BX] 将内存地址为BX的内容复制到AX寄存器中。

  2. LEA:加载有效地址指令。用于将操作数的有效地址加载到寄存器中。

    例如:LEA BX, [AX] 将AX寄存器的值作为偏移量加载到BX寄存器中。

  3. ADD:加法指令。用于将两个操作数相加,并将结果存储在目标操作数中。

    例如:ADD AX, BX 将BX寄存器的值加到AX寄存器的值上,并将结果存储在AX中。

  4. SUB:减法指令。用于从第一个操作数中减去第二个操作数,并将结果存储在目标操作数中。

    例如:SUB AX, BX 从AX寄存器的值中减去BX寄存器的值,并将结果存储在AX中。

  5. TEST:测试指令。用于对操作数执行按位与运算,并根据结果设置标志位。

    例如:TEST AX, BX 将AX和BX执行按位与运算,并根据结果设置标志位。

  6. CMP:比较指令。用于比较两个操作数,并根据结果设置标志位。

    例如:CMP AX, BX 比较AX和BX的值,并根据结果设置标志位。

  7. DEC:递减指令。用于将操作数的值减1。

    例如:DEC BX 将BX寄存器的值减1。
  8. INC:递增指令。用于将操作数的值加1。

    例如:INC BX 将BX寄存器的值加1。
  9. AND:按位与指令。用于对操作数执行按位与运算,并将结果存储在目标操作数中。例如:AND AX, BX 将AX和BX执行按位与运算,并将结果存储在AX中。

  10. XOR:按位异或指令。用于对操作数执行按位异或运算,并将结果存储在目标操作数中。

        例如:XOR AX, BX 将AX和BX执行按位异或运算,并将结果存储在AX中。

    11.OR:按位或指令。用于对操作数执行按位或运算,并将结果存储在目标操作数中。

        例如:OR AX, BX 将AX和BX执行按位或运算,并将结果存储在AX中。

    12.SHL 和 SAL:左移指令。SHL将操作数的位向左移动指定的位数,SAL等价于SHL 1。

        例如:SHL BX, 2 将BX寄存器的值向左移动2位。

    13.SHR 和 SAR:右移指令。SHR执行算术右移(保持符号位),SAR执行逻辑右移(复制符号位)。

        例如:SHR BX, 2 将BX寄存器的值向右移动2位并保持符号位不变(算术右移)。

2.2.分支结构

        分支结构允许程序根据某个条件改变执行流程。在x86汇编语言中,分支结构通常使用跳转指令(如JMP)来实现。根据条件的不同,程序可以跳转到代码段中的不同位置。

例如:

CMP AX, 15 ; 比较AX寄存器和15

JE Label ; 如果AX等于15,则跳转到Label标签处

        在这个例子中,CMP指令将AX寄存器的值与15进行比较,并根据比较结果设置标志位。JE指令检查零标志位(ZF),如果ZF被设置(即AX等于15),则程序跳转到Label标签处。

常用指令:

1.JMP:无条件跳转指令。用于将程序的执行流无条件地跳转到指定的地址处执行。

        例如:JMP [BX] 将程序的执行流跳转到内存地址为BX处执行。

2.JC, JNC, JE/JZ, JS, JNS, JO, JNO, JP/JPE, JNP/JPO:条件跳转指令。根据特定的条件标志(如零标志、进位标志、符号标志等)进行有条件的跳转。这些指令分别表示“进位时跳转”、“非进位时跳转”、“相等/零时跳转”、“负数时跳转”、“正数时跳转”、“溢出时跳转”、“非溢出时跳转”、“奇偶校验时跳转”和“非奇偶校

2.3.循环结构

        循环结构允许程序重复执行一段代码,直到满足某个终止条件。在x86汇编语言中,循环结构通常使用LOOP指令实现。LOOP指令根据CX寄存器的值来控制循环的次数。

例如:

MOV CX, 10 ; 将10移入CX寄存器

LOOPE Label ; 如果CX不为0且ZF被设置(即CX大于0且上次循环的ZF被清除),则跳转到Label标签处

        在这个例子中,MOV指令将10移入CX寄存器,作为循环的次数。LOOPE指令检查CX的值和零标志位(ZF)。如果CX不为0且ZF被设置(即CX大于0且上次循环的ZF被清除),则程序跳转到Label标签处,并继续执行循环体中的代码。当CX变为0时,循环结束。

三、cs寄存器和IP寄存器的使用

        CS(Code Segment)寄存器和IP(Instruction Pointer)寄存器在x86汇编语言中起着非常关键的作用,它们共同决定了CPU执行指令的地址。

        CS寄存器通常用于指向包含正在执行的代码的内存段。在程序开始执行之前,操作系统会将代码段的起始地址加载到CS寄存器中。一旦程序开始执行,CS寄存器的值就固定不变,直到程序结束或发生中断。

        IP寄存器是一个指针,它指向下一条要执行的指令的地址。每条指令在内存中都有一个唯一的地址,IP寄存器用于跟踪当前指令的位置。当程序执行一条指令时,IP寄存器的值会增加相应的字节数,以指向下一条指令的地址。

        CS寄存器和IP寄存器的结合使用实现了程序中的顺序执行和分支控制。通过将程序的不同部分放置在不同的内存段中,并通过CS寄存器来指定每个段的位置,可以在程序中实现模块化和组织代码的结构。IP寄存器则用于在指令之间导航和跳转,实现程序的流程控制。

        例如,当程序遇到一个跳转指令(如JMP)时,IP寄存器的值会被更新为目标地址,从而改变程序的执行流。同样地,当遇到条件分支指令(如JE或JZ)时,IP寄存器的值会根据条件标志进行更新,决定是否跳转到目标地址。

四、8086寄存器

4.1.通用寄存器

  1. AX(Accumulator Register)

    • AX寄存器通常用作累加器,用于执行算术和逻辑运算。
    • 在许多指令中,AX是默认的寄存器,用于存储操作的结果。
    • 它也可以用作临时寄存器,存储临时数据。
  2. BX(Base Register)

    • BX寄存器通常用作基址寄存器,用于基址寻址模式。
    • 它可以与偏移量结合使用,以计算内存地址。
    • BX还可以用作通用寄存器,存储和操作数据。
  3. CX(Count Register)

    • CX寄存器通常用作计数器,用于循环和重复操作。
    • 在循环结构中,CX寄存器存储循环的次数。
    • 它可以作为索引寄存器,在字符串操作和数组访问中使用。
  4. DX(Data Register)

    • DX寄存器通常用作数据寄存器,用于存储和操作数据。
    • 在某些指令中,DX与AX一起使用,以执行32位操作。
    • 它也可以用作通用寄存器,用于临时存储数据或执行其他操作。

4.2.堆栈寄存器

        SS(Stack Segment)寄存器在x86汇编语言中用于指向堆栈段的起始地址。堆栈是一种特殊的数据结构,用于存储局部变量、函数调用的返回地址以及异常处理信息等。

当一个程序执行时,操作系统会为程序分配一个堆栈段,并初始化SS寄存器为该段的起始地址。堆栈段通常位于内存中的一段连续区域,其大小由操作系统进行管理。

通过使用SS寄存器,程序可以方便地在堆栈上创建和操作数据。当需要将数据压入堆栈时,程序会将数据存储在SS寄存器所指向的内存地址处,并将堆栈指针(通常由ESP或SP寄存器表示)递减以腾出空间。相反,当需要从堆栈中弹出数据时,程序会将堆栈指针递增以获取数据,并将其存储在指定的寄存器或内存地址中。

4.3.数据寄存器

        DS(Data Segment)寄存器在x86汇编语言中用于指向数据段的起始地址。数据段通常用于存储程序中的全局变量和静态变量。

        当程序开始执行时,操作系统会为程序分配一个数据段,并初始化DS寄存器为该段的起始地址。数据段中的数据在程序的生命周期内保持不变,除非显式地进行修改。

        通过使用DS寄存器,程序可以在数据段中访问和操作全局变量和静态变量。在访问这些变量时,程序会将它们在数据段中的偏移量与DS寄存器的值相加,以计算出变量的实际内存地址。

        除了指向数据段的起始地址外,DS寄存器还可以用于其他与数据段相关的指令和操作,如加载和存储数据等。

        需要注意的是,在使用DS寄存器时,必须确保正确地管理偏移量,以避免访问到无效的内存地址或覆盖其他重要的数据。此外,在使用特定的汇编指令进行数据访问时,也需要注意操作的正确性和顺序,以确保程序的正确执行。

4.4.标志寄存器

在x86汇编语言中,FLAG寄存器是一个用于存储处理器状态的16位寄存器。它包含了一些状态标志,用于指示算术操作的结果、零标志、符号标志、溢出标志等。这些标志用于影响和控制程序的执行流程和条件判断。

FLAG寄存器中的各个标志位具有特定的含义和用途:

  • 零标志(ZF):当算术或逻辑运算结果为0时,ZF标志会被设置。它用于条件分支指令的判断,例如JE(跳转如果等于)和JZ(跳转如果为零)。

  • 符号标志(SF):SF标志表示运算结果的符号。如果结果为负数,SF标志会被设置。它可用于条件分支指令的判断,例如JS(跳转如果为负)。

  • 溢出标志(OF):OF标志用于指示算术运算是否发生溢出。如果发生溢出,OF标志会被设置。它可用于条件分支指令的判断,例如JO(跳转如果溢出)。

  • 进位标志(CF):CF标志用于指示无符号运算的进位情况。如果在算术运算中发生进位,CF标志会被设置。它也可以用于条件分支指令的判断。

除了上述标志位外,FLAG寄存器还包含其他一些状态标志,用于指示其他处理器状态。这些标志位的具体含义和用途可能会因不同的处理器架构而有所不同。

在x86汇编语言中,可以使用特定的指令来设置、清除和测试这些标志位。例如,算术指令本身会设置相应的标志位,而SETZSETSSETO等指令可以用于设置特定的标志位。同样地,可以使用TEST指令来测试标志位的状态,并根据结果进行条件分支控制。

4.5指令寄存器IP

与上面的内容一致

4.6.代码段寄存器CS

与上面的内容一致

五、寻址方式

1、立即寻址

        操作数是直接包含在指令中的。例如,MOV AX, 1000,这条指令将1000立即加载到AX寄存器中。

2、直接寻址

        操作数的有效地址由一个或多个寄存器提供。例如,MOV AX, [BX],这条指令将BX寄存器中的值作为地址,从该地址处加载数据到AX寄存器中。

3、R寻址

        操作数的有效地址由一个或多个寄存器和一个位移量共同确定。例如,MOV AX, [BX+SI+3],这条指令将BX、SI寄存器的值加上3作为地址,从该地址处加载数据到AX寄存器中。

4、R间接寻址

        操作数的有效地址由一个或多个寄存器间接提供。例如,MOV AX, [BX][SI],这条指令将BX和SI寄存器的值作为地址,从该地址处加载数据到AX寄存器中。

5、变址寻址

        操作数是变址寄存器的值加上一个位移量。例如,MOV AX, [BX+SI+3],这条指令将BX和SI寄存器的值加上3作为地址,从该地址处加载数据到AX寄存器中。

6、基址寻址

        操作数的有效地址由基址寄存器和位移量共同确定。例如,MOV AX, [BX+3],这条指令将BX寄存器的值加上3作为地址,从该地址处加载数据到AX寄存器中。

7、基址变址寻址

        操作数的有效地址由基址寄存器、变址寄存器和位移量共同确定。例如,MOV AX, [BX+SI+3],这条指令将BX和SI寄存器的值加上3作为地址,从该地址处加载数据到AX寄存器中。

8、相对寻址

        操作数的有效地址是程序计数器PC的内容与位移量之和。例如,MOV AX, [PC+3],这条指令将PC的内容加上3作为地址,从该地址处加载数据到AX寄存器中

你可能感兴趣的:(计算机组成原理,编译语言,笔记)