免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 6754 | 回复: 11
打印 上一主题 下一主题

[学习分享]汇编语言 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-07-14 16:05 |只看该作者 |正序浏览
第1章 预备知识
本章介绍汇编语言的一些基本概念,给出一些用汇编语言编程所需要的基本知识。

1.1 汇编语言的由来及其特点
1.1.1 机器语言
机器指令是CPU能直接识别并执行的指令,它的表现形式是二进制编码。机器指令通常由操作码和操作数两部分组成,操作码指出该指令所要完成的操作,即指令的功能,操作数指出参与运算的对象,以及运算结果所存放的位置等。

由于机器指令与CPU紧密相关,所以,不同种类的CPU所对应的机器指令也就不同,而且它们的指令系统往往相差很大。但对同一系列的CPU来说,为了满足各型号之间具有良好的兼容性,要做到:新一代CPU的指令系统必须包括先前同系列CPU的指令系统。只有这样,先前开发出来的各类程序在新一代CPU上才能正常运行。

机器语言是用来直接描述机器指令、使用机器指令的规则等。它是CPU能直接识别的唯一一种语言,也就是说,CPU能直接执行用机器语言描述的程序。

用机器语言编写程序是早期经过严格训练的专业技术人员的工作,普通的程序员一般难以胜任,而且用机器语言编写的程序不易读、出错率高、难以维护,也不能直观地反映用计算机解决问题的基本思路。

由于用机器语言编写程序有以上诸多的不便,现在几乎没有程序员这样编写程序了。

1.1.2 汇编语言
虽然用机器语言编写程序有很高的要求和许多不便,但编写出来的程序执行效率高,CPU严格按照程序员的要求去做,没有多余的额外操作。所以,在保留“程序执行效率高”的前提下,人们就开始着手研究一种能大大改善程序可读性的编程方法。

为了改善机器指令的可读性,选用了一些能反映机器指令功能的单词或词组来代表该机器指令,而不再关心机器指令的具体二进制编码。与此同时,也把CPU内部的各种资源符号化,使用该符号名也等于引用了该具体的物理资源。

如此一来,令人难懂的二进制机器指令就可以用通俗易懂的、具有一定含义的符号指令来表示了,于是,汇编语言就有了雏型。现在,我们称这些具有一定含义的符号为助忆符,用指令助忆符、符号地址等组成的符号指令称为汇编格式指令(或汇编指令)。

汇编语言是汇编指令集、伪指令集和使用它们规则的统称。伪指令是在程序设计时所需要的一些辅助性说明指令,它不对应具体的机器指令,有关内容在以后的各章节中会有详细叙述,在此不展开介绍。

用汇编语言编写的程序称为汇编语言程序,或汇编语言源程序,在本教材中或特定的环境下,也可简称为源程序。汇编语言程序要比用机器指令编写的程序容易理解和维护。

1.1.3 汇编程序
用汇编语言编写的程序大大提高了程序的可读性,但失去了CPU能直接识别的特性。例如用汇编语言书写的指令:MOV AX, BX,CPU不会知道这几个字符所表达出来的功能,但程序员一看就知道:要求CPU把寄存器BX的值传送给寄存器AX。

把机器指令符号化增加了程序的可读性,但引起了如何让CPU知道程序员的用意,并按照其要求完成相应操作的问题。解决该问题就需要一个翻译程序,它能把汇编语言编写的源程序翻译成CPU能识别的机器指令序列。这里,我们称该翻译程序为汇编程序。



图1.1 汇编语言指令到机器指令的示意图

从图中不难看出:汇编程序能把左边汇编语言源程序翻译成右边的机器指令序列。其中,把汇编语言指令“MOV AX, BX”和“ADD AX, 5”分别转换成机器指令89D8H和050500H,而后者都是CPU能直接识别的,所以,可执行它们。
目前,常用的汇编程序有:MASM、TASM和DEBUG等。
1.1.4 汇编语言的主要特点
一方面,汇编语言指令是用一些具有相应含义的助忆符来表达的,所以,它要比机器语言容易掌握和运用,但另一方面,它要直接使用CPU的资源,相对高级程序设计语言来说,它又显得难掌握。
汇编语言程序归纳起来大概有以下几个主要特性。
1、与机器相关性
汇编语言指令是机器指令的一种符号表示,而不同类型的CPU有不同的机器指令系统,也就有不同的汇编语言,所以,汇编语言程序与机器有着密切的关系。
由于汇编语言程序与机器的相关性,所以,除了同系列、不同型号CPU之间的汇编语言程序有一定程度的可移植性之外,其它不同类型(如:小型机和微机等)CPU之间的汇编语言程序是无法移植的,也就是说,汇编语言程序的通用性和可移植性要比高级语言程序低。
2、执行的高效率
正因为汇编语言有“与机器相关性”的特性,程序员用汇编语言编写程序时,可充分发挥自己的聪明才智,对机器内部的各种资源进行合理的安排,让它们始终处于最佳的使用状态,这样做的最终效果就是:程序的执行代码短,执行速度快。
现在,高级语言的编译程序在进行寄存器分配和目标代码生成时,也都有一定程度的优化(在后续课程《编译原理》的有关章节会有详细介绍),但由于所使用的“优化策略”要适应各种不同的情况,所以,这些优化策略只能在宏观上,不可能在微观上、细节上进行优化。而用汇编语言编写程序几乎是程序员直接在写执行代码,程序员可以在程序的每个具体细节上进行优化,这也是汇编语言程序执行高效率的原因之一。
3、编写程序的复杂性
汇编语言是一种面向机器的语言,其汇编指令与机器指令基本上一一对应,所以,汇编指令也同机器指令一样具有功能单一、具体的特点。要想完成某件工作(如计算:A+B+C等),就必须安排CPU的每步工作(如:先计算A+B,再把C加到前者的结果上)。另外,在编写汇编语言程序时,还要考虑机器资源的限制、汇编指令的细节和限制等等。
由于汇编语言程序要安排运算的每一个细节,这就使得编写汇编语言程序比较繁琐、复杂。一个简单的计算公式或计算方法,也要用一系列汇编指令一步一步来实现。
4、调试的复杂性
在通常情况下,调试汇编语言程序要比调试高级语言程序困难,其主要原因有四:

  汇编语言指令涉及到机器资源的细节,在调试过程中,要清楚每个资源的变化情况;
  程序员在编写汇编语言程序时,为了提高资源的利用率,可以使用各种实现技巧,而这些技巧完全有可能破坏程序的可读性。这样,在调试过程中,除了要知道每条指令的执行功能,还要清楚它在整个解题过程中的作用;
  高级语言程序几乎不显式地使用“转移语句”,但汇编语言程序要用到大量的、各类转移指令,这些跳转指令大大地增加了调试程序的难度。如果在汇编语言程序中也强调不使用“转移指令”,那么,汇编语言程序就会变成功能单调的顺序程序,这显然是不现实的;
  调试工具落后,高级语言程序可以在源程序级进行符号跟踪,而汇编语言程序只能跟踪机器指令。不过,现在这方面也有所改善,CV(CodeView)、TD(Turbo Debug)等软件也可在源程序级进行符号跟踪了。
1.1.5 汇编语言的使用领域
综上所说,汇编语言的特点明显,其诱人的优点直接导致其严重的缺点,其“与机器相关”和“执行的高效率”导致其可移植性差和调试难。所以,我们在选用汇编语言时要根据实际的应用环境,尽可能避免其缺点对整个应用系统的影响。
下面简单列举几个领域以示说明,但不要把它们绝对化。
1、适用的领域

要求执行效率高、反应快的领域,如:操作系统内核,工业控制,实时系统等;

系统性能的瓶颈,或频繁被使用子程序或程序段;

与硬件资源密切相关的软件开发,如:设备驱动程序等;

受存储容量限制的应用领域,如:家用电器的计算机控制功能等;

没有适当的高级语言开发环境。

2、不宜使用的领域

大型软件的整体开发;

没有特殊要求的一般应用系统的开发等。

[ 本帖最后由 ylcqen 于 2008-7-14 16:09 编辑 ]

评分

参与人数 1可用积分 +15 收起 理由
mik + 15 支持一下

查看全部评分

论坛徽章:
0
12 [报告]
发表于 2009-06-29 07:50 |只看该作者
原帖由 wotacid 于 2009-5-26 08:26 发表
这个带图画的我下载过完整的。不过不是特别齐全图少几幅
10字节具体如何用,16位机器可以双精度占有2个寄存器
还是32位独占10字节

最早只在FPU里用。做浮点计算时,内部做的是80位计算,计算后再截割成64(32)位,以保证计算精度。

论坛徽章:
3
数据库技术版块每日发帖之星
日期:2016-05-28 06:20:00综合交流区版块每日发帖之星
日期:2016-05-29 06:20:00每日论坛发贴之星
日期:2016-05-29 06:20:00
11 [报告]
发表于 2009-06-29 00:29 |只看该作者
还没有总理ok?

论坛徽章:
0
10 [报告]
发表于 2008-07-16 23:59 |只看该作者
LZ 好好再整理一下,给你加个精华

论坛徽章:
0
9 [报告]
发表于 2008-07-16 14:55 |只看该作者
这是外面找不到的教程!先分享一部份给大家.后面的在补上!

论坛徽章:
0
8 [报告]
发表于 2008-07-15 15:44 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
7 [报告]
发表于 2008-07-14 16:38 |只看该作者
IA32,比较详细啊。

论坛徽章:
0
6 [报告]
发表于 2008-07-14 16:19 |只看该作者
2.1.2、通用寄存器的作用通用寄存器可用于传送和暂存数据,也可参与算术逻辑运算,并保存运算结果。除此之外,它们还各自具有一些特殊功能。汇编语言程序员必须熟悉每个寄存器的一般用途和特殊用途,只有这样,才能在程序中做到正确、合理地使用它们。
表2.1 通用寄存器的主要用途
寄存器的分类寄存器
主 要 用 途
通 用
寄 存 器
数据  
寄存器
AX乘、除运算,字的输入输出,中间结果的缓存
AL字节的乘、除运算,字节的输入输出,十进制算术运算
AH字节的乘、除运算,存放中断的功能号
BX存储器指针
CX串操作、循环控制的计数器
CL移位操作的计数器
DX字的乘、除运算,间接的输入输出
变址
寄存器
SI存储器指针、串指令中的源操作数指针
DI存储器指针、串指令中的目的操作数指针
变址
寄存器
BP存储器指针、存取堆栈的指针
SP堆栈的栈顶指针
指令指针
IP/EIP
标志位寄存器Flag/EFlag
32位 CPU的
段寄存器
16位CPU的 段寄存器
ES 附加段寄存器
CS 代码段寄存器
SS 堆栈段寄存器
DS 数据段寄存器
新增加的
段寄存器
FS 附加段寄存器
GS 附加段寄存器

论坛徽章:
0
5 [报告]
发表于 2008-07-14 16:17 |只看该作者
第2章 CPU资源和存储器计算机的硬件资源是用汇编语言编程所必须要了解的重要内容,因为汇编语言允许、也需要程序员直接使用这些硬件资源,只有这样才能编写出高效的目标代码。
在汇编语言中,需要访问的硬件资源主要有:CPU内部资源、存储器和I/O端口。本章将着重讲解CPU内部寄存器的命名、功能及其常见的用途,还要介绍存储器的分段管理模式、存储单元地址的表示法以及其物理地址的形成方式。
2.1 寄存器组寄存器是CPU内部重要的数据存储资源,是汇编程序员能直接使用的硬件资源之一。由于寄存器的存取速度比内存快,所以,在用汇编语言编写程序时,要尽可能充分利用寄存器的存储功能。
寄存器一般用来保存程序的中间结果,为随后的指令快速提供操作数,从而避免把中间结果存入内存,再读取内存的操作。在高级语言(如:C/C++语言)中,也有定义变量为寄存器类型的,这就是提高寄存器利用率的一种可行的方法。
另外,由于寄存器的个数和容量都有限,不可能把所有中间结果都存储在寄存器中,所以,要对寄存器进行适当的调度。根据指令的要求,如何安排适当的寄存器,避免操作数过多的传送操作是一项细致而又周密的工作。有关“寄存器的分配策略”在后续课程《编译原理》中会有详细的介绍。
由于16位/32位CPU是微机CPU的两个重要代表,所以,在此只介绍它们内部寄存器的名称及其主要功能。
2.1.1 寄存器组1、 16位寄存器组
16位CPU所含有的寄存器有(见图2.1中16位寄存器部分):
4个数据寄存器(AX、BX、CX和DX)
2个变址和指针寄存器(SI和DI)2个指针寄存器(SP和BP)
4个段寄存器(ES、CS、SS和DS)
1个指令指针寄存器(IP)1个标志寄存器(Flags)
2、 32位寄存器组
32CPU除了包含了先前CPU的所有寄存器,并把通用寄存器、指令指针和标志寄存器从16位扩充成32位之外,还增加了216位的段寄存器:FSGS
32位CPU所含有的寄存器有(见图2.1中的寄存器):
4个数据寄存器(EAX、EBX、ECX和EDX)
2个变址和指针寄存器(ESI和EDI)2个指针寄存器(ESP和EBP)
6个段寄存器(ES、CS、SS、DS、FSGS)
1个指令指针寄存器(EIP)1个标志寄存器(EFlags)

论坛徽章:
0
4 [报告]
发表于 2008-07-14 16:13 |只看该作者
1.2.3 基本的数据类型
汇编语言所用到的基本数据类型为:字节、字、双字等,这些数据类型在以后的章节中都有相应的类型说明符。下面对它们进行最基本的描述。

1、字节

一个字节有8位二进制组成,其最高位是第7位,最低位是第0位,如右图所示。在表示有符号数时,最高位就是符号位。

通常情况下,存储器按字节编址,读写存储器的最小信息单位就是一个字节。


图1.2 字节数据类型示意图


2、字

由2个字节组成一个字,其最高位是第15位,最低位是第0位。高8位称为高字节,低8位称为低字节,如右图所示。

字节和字是汇编语言程序中最常用的两种数据类型,也是最容易出错的数据类型。


图1.3 字数据类型示意图


3、双字

用2个字(4个字节)来组成一个双字,其高16位称为高字,低16位称为低字,如右图所示。

双字有较大的数据表示范围,它通常是为了满足数据的表示范围而选用的数据类型,也可用于存储远指针。

字节、字和双字是汇编语言最常用的三种数据类型,下图表现出它们三者之间的组成关系。


图1.4 双字数据类型示意图





4、四字

由4个字(8个字节)组成一个四字类型,它总共有64个二进制位,当然,也就有更大的数据表示范围,但在汇编语言中很少使用该数据类型。

5、十字节

由10个字节组成一个十字节类型,它总共有80个二进制位。在汇编语言中很少使用该数据类型。

6、字符串

字符串是由若干个字节组成的,字节数不定,通常每个字节存储一个字符。该数据形式是汇编语言程序中经常使用的另一种数据形式。

[ 本帖最后由 ylcqen 于 2008-7-14 16:16 编辑 ]
  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP