Linux汇编之汇编语言介绍

汇编 2015年02月25日 ,

asm

本文中枫竹梦主要介绍什么是汇编语言,说明使用汇编语言进行程序设计的原因,阐明汇编语言与高级语言的区别。

与其他程序设计语言不同的是,并不是所有的汇编器都使用一种标准的格式。所以学习汇编语言的第一步就是明确在什么环境中使用什么类型的汇编语言。

处理器指令

在操作的最底层,所有的计算机都按照芯片内部定义的二进制代码操作数据。这些预置在芯片内部的代码被称为指令码(instruction code)。不同类型的处理器拥有不同的指令码,但它们处理指令码程序的方式是类似的。如果在单片机上进行过程序设计,一定会了解不同类型的芯片有不同的指令。

指令码处理

当处理器芯片运行时,读取内存中的指令码。每个指令码可能包含一个或多个字节信息,根据这些信息处理器完成指定的任务。有些指令码还需要额外的数据,数据同样存储在内存中。为了区别数据与指令码,使用专门的指针(pointer)帮助处理器跟踪数据和指令码存储在内存中的位置。

指令指针(instruction pointer)用于指定要执行的指令码。

数据指针(data pointer)用于指定数据区域的起始位置。这个区域称为堆栈(stack)。

处理器完成一个指令码的功能后,指令指针将指向下一条要执行的指令码。每条指令都必须至少包含一个字节的操作码(operation code,简称opcode)。操作码定义处理器应该完成什么操作。每个处理器都具有其自己预定义好的操作码。

指令码格式

IA-32(Intel Architecture)常被称为i386、x86-32、x86。当然也包含AMD公司与Intel CPU兼容的产品。枫竹梦博文如无其他说明,所有Linux汇编都指IA-32系列处理器的汇编语言。IA-32指令码格式包含如下4部分:

  • 可选的指令前缀
  • 操作码
  • 可选的修饰符
  • 可选的数据元素

指令码格式
操作码

IA-32指令码中唯一必须的部分是操作码。它定义由处理器执行的基本功能或者任务。

指令前缀

按照前缀的功能将其分为4个组,每个组的前缀一次只能使用一个。

  • 锁定前缀和重复前缀
  • 段覆盖前缀和分支提示前缀
  • 操作数长度覆盖前缀
  • 地址长度覆盖前缀

锁定前缀表示独占地使用共享内存。在多处理器及多线程条件下非常重要。重复前缀表示重复的功能。常常用在字符处理中。

段覆盖前缀用于覆盖段寄存器的值。分支提示前缀尝试向处理器提供程序在条件跳转语句中最可能的路径,与预报分支的硬件一同使用。

操作数长度覆盖前缀用于切换16位与32位操作数长度。

地址长度覆盖前缀用于切换16位与32位地址长度。

修饰符

修饰符用于定义执行的功能中需要的寄存器的内存位置。包含在3个单独的值中。

  • 寻址方式说明符(ModR/M)
  • 比例-索引-基址(SIB)
  • 1、2或者4个地址移位字节

数据元素

指令码的最后一部分是该功能使用的数据元素。一些指令从内存位置或者寄存器读取数据,而一些指令在其本身内包含数据。

高级语言

使用处理器指令进行程序设计是困难的,即使最简单的程序也需要指定许多操作码和数据字节。为了更方便程序设计,才有了高级语言(high-level language,HLL)。

高级语言的分类

按照它们如何在计算机上运行可以将他们分为:

  • 编译语言
  • 解释语言

编译语言

编译(compile)一个程序一般指:

  • 把HLL语句编译为原始指令码
  • 连接原始指令码来生成可执行程序

编译程序

编译程序有C语言等。

解释语言

解释程序是由单独的程序读取和运行的。它在进行处理时读取并解释程序。程序运行时,把解释程序代码转换为适应处理器的正确的指令码是宿主程序的任务。

解释语言有Javascript、Python等。

混合语言

它将编译程序的特性与解释程序的通用性和简易性结合在一起。典型代表是Java语言。Java语言被编译为称为字节码(byte code)的形式,字节码再由Java虚拟机(Java Virtual Machine,JVM)进行解释。

高级语言特性

高级语言最有用的两个特性是:

  • 可移植性
  • 标准化

汇编语言

虽然高级语言有以上的优势,不过,其为了提高可移植性和标准化,为高级处理器创建指令码的编译器可能不使用只在这些处理器才在的特殊指令码,因此不能创建更快的应用程序。

汇编语言允许直接创建指令码程序,汇编语言使用助记符(mnemonics)表示指令码,汇编器很容易将汇编语言轮换为原始指令码。

汇编语言程序由以下几部分构成:

  • 操作码助记符
  • 数据段
  • 命令

操作码助记符

汇编语言程序的核心是用于创建程序的指令码。汇编器将助记符与指令码功能等同对待。不同的汇编器使用不同的助记符。

数据段

除指令码外,程序还需要用到变量及常量。

在汇编语言中使用内存位置和堆栈保存数据。

命令

命令用于提示汇编器将助记符转换为指令码时如何执行特有的功能。汇编中的命令如.long、.section等。

(完)

如无特别说明,本站文章皆为原创,若要转载,务必请注明以下原文信息:
日志标题:《Linux汇编之汇编语言介绍》
日志链接:http://furzoom.com/linux-asm-assembly-language/
博客名称:枫竹梦

发表评论

插入图片

NOTICE1:请申请gravatar头像,没有头像的评论可能不会被回复!

回到顶部