资源描述
,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,第1章 什么是汇编语言,1.1,处理器指令,1.2,高级语言,1.3,汇编语言,1.4,小结,本章主要内容,处理器指令的特点,汇编语言的定义,如何将汇编语言融入程序设计模型,了解汇编语言与高级语言的区别与联系,1.1处理器指令,在操作的最低层,所有计算机处理器都按照制造厂商在处理器芯片内部定义的二进制代码操作数据。这些预置的代码被称为指令码(instruction code)。,不同类型的处理器包含不同类型的指令码,但是它们处理指令码程序的方式是类似的。,处理器工作模式,处理器芯片先将待处理的数据和决定如何处理这些数据的指令码存储在内存中,CPU按步骤从内存中一步步取出程序中的各条指令,并听从于这些指令从指定内存中取得数据进行处理,再将处理的中间结果及最终结果存放于内存中。,CPU也按人们事先编制好的程序指挥输入设备和输出设备工作。这一处理模式(即程序和数据存于内存中、指令顺序执行)是由冯诺依曼最早提出的,所以现代的大大小小的计算机系统都属于冯诺依曼体系。,指令码处理,当计算机处理器芯片运行时,它读取存储在内存中的指令码,以及指令码所需的数据。,指令指针(instruction pointer,IP)用于帮助处理器了解哪些指令码已经处理过了,以及接下来要处理的是哪条指令码。,数据指针(data pointer)用于帮助处理器了解内存中数据区域的起始位置是哪里。,每条指令都包含一个或者多个字节的处理器要处理的信息,且必须至少包含一个字节的操作码(operation code)。每个处理器系列都有其自己预定义好的操作码,它们定义所有可用的功能。,指令码举例,C7,45 FC,01 00 00 00,操作码C7,代表把值传送到内存位置的指令。,内存位置修饰符45 FC,定义从EBP寄存器中的值(45)指向内存开始的4字节(FC)。,最后4字节01 00 00 00表示数值1。,注意!数值的表示,小尾数表示法,基于Intel的处理器采用小尾数表示法,即最低有效位被先存储。所以00000001在内存中被存储为01000000。这种格式被硬化于CPU内,而且不能改变。通常情况下,程序员不用担心使用哪种格式;然而以下场合下关心它是重要的:,当在不同的计算机之间传送二进制数据时(不管是通过文件还是网络传输)。,在汇编语言程序设计中指定数据和内存位置时,指令码格式,IA-32指令码格式由四个主要部分构成:,a.可选的指令前缀,b.操作码(opcode),c.可选的修饰符,d.可选的数据元素,指令前缀,04,操作码,13,ModR/M,01,SIB,01,移位,04,数据元素,04,操作码,IA-32指令码格式中唯一必须的部分,它定义由处理器执行的基本功能或者任务,长度为13字节。,指令前缀,可以包含14个修改操作码行为的1字节前缀。按照功能的不同,这些前缀可分为四个组:,a.锁定前缀和重复前缀,b.段覆盖前缀和分支提示前缀,c.操作数长度覆盖前缀,d.地址长度覆盖前缀,0或1,0或1,0或1,0或1(字节数),锁定前缀和重复前缀,段覆盖前缀和分支提示前缀,操作数长度覆盖前缀,地址长度覆盖前缀,段覆盖前缀,定义可以覆盖定义了的段寄存器值的指令。当要求一条指令不按缺省规则使用某个段寄存器时,必须以段覆盖前缀明确指明此段寄存器,。,分支提示前缀,尝试向处理器提供程序在条件跳转语句中最可能的路径的线索。,操作数长度覆盖前缀,通知处理器,程序将在这个操作码之内切换16位和32位的操作数长度。,地址长度覆盖前缀,通知处理器,程序将切换16位和32位的内存地址。,锁定前缀,表示指令将独占地使用共享内存区域,用于多CPU环境中对共享存储器的排他性访问。,重复前缀,表示重复的功能,常用于字符串,修饰符,用来定义执行功能中涉及到寄存器和内存位置,即,寻址方式,包含在3个单独的值中:,a.寻址方式说明符(ModR/M)字节,b.比例-索引-基址(SIB)字节,c.1、2或者4个的地址移位字节(offset),数据元素,一些指令码从内存位置或者处理器寄存器读取数据,而一些指令码在其本身之内包含数据。,1.2高级语言,高级语言(high-level language,HLL)使程序员可以使用简单的术语创建功能,而不是原始的处理器指令码。,特殊的保留关键字用于定义变量、创建循环和处理程序的输入和输出。,必须通过某种机制把用高级语言编写的程序代码转换(编译/解释)为处理器能够处理的简单的指令码格式。,按照HLL程序在计算机上的运行方式,所有的HLL可以分为三类:,a.编译语言(如C,C+),b.解释语言(如Basic),c.混和语言 即把编译程序的特性和解释程序的通用性和简易性结合在了一起(如Java)。,1.2.1 高级语言的种类,1.2.2 高级语言的特性,可移植性通过简单地在新的平台上进行重新编译,HLL就能够移植到其它操作系统和其它处理器平台上。,标准化HLL具有丰富的标准。每种编译器都被设计为把标准语言结构解释为目标处理器的指令码,以便跨处理器平台产生相同的功能。,1.3汇编语言,汇编语言允许程序员直接创建指令码程序,汇编语言程序使用助记符表示指令码,助记符使程序员可以使用英语样式的词表示各个指令码。汇编器可以很容易地把汇编语言助记符转换为原始指令码,汇编语言程序的构成,操作码助记符,数据段,命令,操作码助记符,汇编器把助记符词汇和指令码功能(比如传送或者添加数据元素)等同对待,,例:,汇编语言程序员不必了解指令码的每个字节表示什么,他们可以使用更加容易记忆的助记符来表示指令码。,不同的汇编器使用不同的助记符表示指令码,操作码助记符例,55 push%ebp,B9 E5 mov%esp,%ebp,83 EC 08 sub$0 x8,%esp,C7 45 FC 01 00 00 00 movl$0 x1,-4(%ebp),83 EC 0C sub$0 xc,%esp,6A 00 push$0 x0,E8 D1 FE FF FF call 8048348,返回,1.3.2 定义数据,汇编语言允许程序员定义将存储在内存中的数据项目。,使用汇编语言进行程序设计的一个优势是它提供了更大的控制权,来决定在内存中的什么位置存储和如何存储数据。,汇编语言中存储和检索数据有两个方法,使用内存位置,使用堆栈,使用内存位置(定义变量),指向一个内存位置的标记,内存字节的数据类型和默认值,testvalue:,.long 150,message:,.ascii“this is a test message.”,pi:,.float 3.14159,使用堆栈,堆栈是在计算机为应用程序保留的内存范围的结尾位置保留的内存区域,经常保留用在程序中的函数之间传递数据元素,也可以使用它临时地存储和检索数据元素。,1.3.3 命令,不同的命令用于帮助使程序员创建指令码的工作更加容易。,命令前面有一个,点,号,这是命令和标记的不同之处。,.section,.数据段,.bss(Block Started by Symbol),.文本段(或称代码段)。,比较高级语言与汇编语言的特性,高级语言,可移植性通过简单地在新的平台上进行重新编译,高级语言就能够移植到其它操作系统和其它处理器平台上。,标准化高级语言具有丰富的标准。每种编译器都被设计为把标准语言结构解释为目标处理器的指令码,以便跨处理器平台产生相同的功能。,汇编语言,与机器相关性汇编语言指令是机器指令的一种符号表示,而不同类型的CPU有不同的机器指令系统,也就有不同的汇编语言。,执行的高效率程序员用汇编语言编写程序时,可对机器内部的各种资源进行合理的安排,让它们始终处于最佳的使用状态。,1.4 小结,在汇编出最终的程序时,每种汇编器用来表示指令码、数据和专门命令的格式都稍有不同。,使用汇编语言进行程序设计的第一个步骤是决定你需要使用哪种汇编器,并且了解它使用什么格式。,使用汇编语言的目的,是使编码工作尽可能地靠近原始处理器指令码,。汇编语言程序设计使程序员可以使用指令码进行编程,但是使用简单的助记符引用这些指令码。,汇编语言汇编器没有被标准化,并且汇编语言有很多不同的格式。,
展开阅读全文