没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
3
高级语言程序员应具备的
80x86 汇编知识
80X86 ASSEMBLY FOR THE HLL
PROGRAMMER
贯穿本书,我们会检视高级语言程序,并将其与编译器为之生成的
机器码做对照。搞懂编译器的输出需要一些汇编语言的知识。成为汇编
语言高手需要时间和经验,幸而这并非我们达到目标的必要条件。我们
只要能看懂编译器产生的代码及其他汇编语言程序员写的代码就够了,
无需白手写出汇编语言代码。本章将:
描绘出80x86机器的基本架构
对80x86汇编语言做个基本的综述,以便看懂每种编译器的80x86输出
说明32位80x86 CPU支持的寻址方式
表述几种常见80x86汇编器(HLA、MASM/TASM及Gas)所用的语法
编程卓越之道 第二卷:运用底层语言思想编写高级语言代码
22
第 3 章 高级语言程序员应具备的 80x86 汇编知识
给出汇编语言编程时常量的用法和数据的声明方法
除 了 本 章 内 容 , 我 们 还 可 以 看 看 网 上 资 源 www.writegreatcode.com 和
webster.cs.ucr.edu,它们提供了“80x86 最简指令集”,我们检查编译器输出时用得着这份
资料。
3.1 学一种汇编语言很好,能学几种更好
倘若我们想为 80x86 之外的处理器编程,就应当学会看懂至少两种汇编语言。这么
做可以免除高级语言中只为 80x86 编码的隐患,找出只适合于 80x86 CPU 的优化措施。
正因为如此,第 4 章作为 PowerPC CPU 的入门教材。我们会发现两种处理器家族在许多
方面概念是相通的,但也有若干关键的差异之处,附录中有所总结。
诸如 80x86的复杂指令集计算机(CISC:Complex Instruction Set Computer)与 PowerPC
之类的精简指令集计算机(RISC:Reduced Instruction Set Computer)相比,主要区别大
概在于它们使用内存的方式。RISC 架构提供的内存访问方法相当笨拙,为了避免访问内
存,应用程序大大加长;另一方面,80x86 架构可以用多种模式访问内存,应用程序往往
能利用这种便利条件。每种方式各有千秋。总之,运行于 80x86 上的代码与 PowerPC 等
RISC 架构上的对应代码有一些根本区别。
3.2 80x86 汇编语言的语法
80x86 程序员可以从大量编程开发工具中挑选自己喜欢的工具使用,但这种丰富性有
个小缺点:语法可能存在不兼容性。对同样一个程序,80x86 家族上的不同编译器和调试
器会产生不同的汇编语言清单。这是因为那些工具为不同的汇编器发出代码。例如,
Microsoft 的 Visual C++软件包产生的汇编语言代码兼容于 Microsoft 的 MASM,Borland
的 C++编译器与 Borland 的 TASM 兼容,GNU 的编译器套件 GCC 产生与 Gas 兼容的源
代码——Gas 是自由软件基金会(Free Software Foundation)的 GNU 汇编器。除了编译器
发出的代码,我们还会发现大批汇编语言编程示例是用 FASM、NASM、GoAsm、HLA
等等汇编器写成的。
要是只用某种汇编器的语法贯穿本书自然不错,但由于我们的方法并不特定于某个
编译器,必须考虑到几种常见汇编器的语法。本书通常用 HLA 给出不特定编译器的示例。
因此,本章将讨论 4 种汇编器的语法:MASM、TASM、Gas 和 HLA。幸运的是,如果我
编程卓越之道 第二卷:运用底层语言思想编写高级语言代码
3.3 80x86 基本架构
23
们掌握了一种汇编器的语法,学习其他汇编器的语法将会非常轻松,就像从某种 BASIC
方言转到另一种那样。
3.3 80x86 基本架构
Intel 的 CPU 一般归类于冯·\u35834X依曼(Von Neumann)结构。冯·\u35834X依曼计算机系统
主要包含 3 大部分:中央处理单元(CPU)、内存和输入/输出(I/O)设备。这 3 个组件
通过系统总线(包括地址总线、数据总线和控制总线)相连。图 3-1 给出了其相互关系。
图 3-1 冯·\u35834X依曼计算机系统模块图
CPU 向地址总线放入地址值,以此选择内存单元位置或 I/O 设备端口位置,从而与
内存和外设通信。这些内存单元或端口位置在系统中占有唯一的二进制地址值。然后
CPU、内存和 I/O 设备通过数据总线互相传递数据。控制总线里的信号线控制着数据进出
内存或 I/O 设备的方向。
3.3.1 寄存器
寄存器组是 CPU 内部最突出的特性。几乎所有的 80x86 CPU 操作都涉及至少一个寄
存器。例如,要将两个变量的值加起来,结果放入第三个变量中,必须将其中一个变量
放入寄存器,对其加上第二个操作数,然后将结果送入目标变量。寄存器差不多是每个
操作的中介。因此在 80x86 汇编语言程序中,寄存器是必不可少的。
80x86 CPU 的寄存器可以分成 4 类:通用寄存器、特殊目的寄存器(应用可访问)、
段寄存器和特殊目的核心模式寄存器。由于段寄存器在 Windows、BSD、BeOS 和 Linux
等现代 32 位操作系统中不怎么用,而特殊目的核心模式寄存器是用来编写操作系统、调
编程卓越之道 第二卷:运用底层语言思想编写高级语言代码
24
第 3 章 高级语言程序员应具备的 80x86 汇编知识
试器和其他系统级工具的,这些软件的构建方法已超出了本书范围,所以我们不再考虑
段寄存器和特殊目的核心模式寄存器。
3.3.2 80x86 通用寄存器
Intel 的 80x86 CPU 家族为应用程序提供若干通用寄存器,包括如下 8 个 32 位寄存器:
EAX、EBX、ECX、EDX、ESI、EDI、EBP、ESP
每个寄存器名的“E”前缀表示“扩展(Extended)”,以便将这些 32 位寄存器与下列
16 位寄存器区分开来:
AX、BX、CX、DX、SI、DI、BP、SP
80x86 CPU 还提供如下 8 个 8 位寄存器:
AL、AH、BL、BH、CL、CH、DL、DH
特别要注意的是,这些通用寄存器并非各为一体,即 80x86 并不提供 24 个单独的寄
存器,而是将 32 位寄存器与 16 位寄存器重叠,后者又重叠以 8 位寄存器。图 3-2 给出了
其相互关系:
图 3-2 Intel 80x86 CPU 的通用寄存器
因此实际修改某个寄存器内容时,可能没有特别指明就改动了三个寄存器的值。例
如,修改寄存器 EAX 也许会改变寄存器 AL、AH 和 AX 的值。我们将会经常看到编译器
所产生的代码用到 80x86 的这种特性。举个例子,编译器会清除(置 0)寄存器 EAX 的
所有位,然后将 AL 设为 1 或 0,以便得到一个 32 位的 True(1)或 False(0)值。有的
编程卓越之道 第二卷:运用底层语言思想编写高级语言代码
3.3 80x86 基本架构
25
机器指令只操纵 AL 寄存器,而程序也许需要以 EAX 返回这些指令的结果。利用寄存器
重叠的优点,编译器产生的代码就能够通过操纵 AL 的指令而返回整个 EAX 值。
虽然 Intel 将这些寄存器称作“通用寄存器”,但不能因此就以为它们可用于任何目的。
比如说,寄存器 SP/ESP 就有着专门用途,切勿挪作它用,因为它是堆栈指针。类似地,
寄存器 BP/EBP 也是专用的,无法当作通用寄存器使用。所有 80x86 寄存器都有各自的特
殊意图,仅可在特定环境下使用。在讨论使用这些寄存器的机器指令时,我们会考虑这
些特殊用法的,请参看在线资源。
3.3.3 80x86 的 EFLAGS 寄存器
32 位EFLAGS寄存器将许多单一比特位的布尔值(True/False)或标志位集合在一起。
这些比特位中的大部分要么为操作系统的核心模式函数保留,要么与应用程序员没有太
大关系。应用程序员只要会以汇编语言代码读写其中 8 位即可——溢出标志位、方向标
志位、中断禁止位
1
、符号标志位、零标志位、辅助进位标志位、奇偶标志位和进位标志
位。图 3-3 展示了这些标志位在寄存器EFLAGS低 16 位中的布放位置。
图 3-3 80x86 标志寄存器低 16 位的布局
应用程序员可用的这 8 个标志位中,4 个具有特别价值:溢出标志位、进位标志位、
符号标志位和零标志位。我们将这 4 个标志位称为“条件码(condition code)”。每个标志
位都有一个状态——要么是设置(1),要么是清除(0),可以用来检验上次运算的结果。
例如在比较两个值后,条件码标志可告诉我们其中一个值是小于、等于还是大于另一个
值。
1 应用程序不能修改中断标志位,但本书后面我们会研讨这一标志位,所以在此还是提到了它。
编程卓越之道 第二卷:运用底层语言思想编写高级语言代码
剩余25页未读,继续阅读
资源评论
- haishia2012-04-28很不错...虽然自有第三章..不过很不错了
- Coder个人博客2023-05-15#内容缺失
DancingCalf
- 粉丝: 5
- 资源: 8
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 623fd5bb33a205b30c05407d316be83b.xlsm
- ST5461D13-2_Ver2.1_20190119_202003181873.pdf
- JE695R3HC2L_LD-S18Y15A_20210617_202110266789.pdf
- python机器学习库中Scikit-learn和TensorFlow如何选择
- 博通纪要中文.pdf
- 太平洋证券-电子行业-公司深度-华兴源创:全球领先的面板和半导体设备供应商-20190625.pdf
- 1711977150.jpeg
- CC500PV5D_Rev.03_20201023_202110263689.pdf
- ST3151A07-2_Ver2.4_20190425_202006169287.pdf
- 2 决策树.docx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功