没有合适的资源?快使用搜索试试~ 我知道了~
首页80x86汇编语言入门教程 - Paul A. Carter
"PC汇编语言 - Paul A. Carter" 本书《PC汇编语言》由Paul A. Carter撰写,旨在介绍关于个人计算机上的汇编语言编程。该书的中文翻译由伍星完成,初次出版日期为2007年3月4日。作者明确指出,文档可以自由复制和分发,但不得用于商业目的,鼓励教育工作者将其作为教学资源使用。 在书中,作者首先介绍了基础的数字系统,包括十进制、二进制和十六进制,这是理解计算机和汇编语言的基础。接着,他深入讨论了计算机的结构,如内存、CPU(特别是80x86系列),以及不同模式下的运行,如8086的16位模式、80386的32位模式,以及实模式和保护模式。此外,还涉及了中断的概念,中断是计算机处理异步事件的一种关键机制。 汇编语言作为计算机科学的重要部分,作者详细阐述了它与机器语言的区别,并讲解了指令操作数、基本指令和指示符。他还讨论了输入输出(I/O)和调试技巧,这对于编写和测试汇编程序至关重要。书中还指导读者如何从创建简单的程序开始,逐步了解编译器的使用,包括编译、链接目标文件,以及分析汇编列表文件。 在第二章,作者主要关注汇编语言的基本元素。他详细解释了整数的表示方法,包括正负数的扩展和补码运算,这些都是执行算术操作的基础。此外,他还讨论了控制结构,如比较、分支和循环指令,这些是编写逻辑和控制流程的关键组成部分。他还展示了如何将传统的高级语言控制结构(如If语句)翻译成汇编语言。 《PC汇编语言》是一本全面介绍PC汇编编程的教程,适合初学者和有经验的程序员,通过深入浅出的方式,帮助读者理解底层计算机工作原理并掌握汇编语言编程技能。
资源详情
资源推荐
6
第
1
章 简介
AX
AH AL
图 1.5: AX寄存器
80386: 这种CPU极大地增强了80286的性能。首先,它扩展了许多寄存器
来容纳32位数据(EAX,EBX,ECX,EDX,ESI,EDI,EBP,ESP,
EIP)而且增加了两个新的16位寄存器(FS,GS)。它同样增加了一
个新的32
位保护模式
。在这种模式下,它可以访问4G字节。程序同样
分成段,但是现在每段大小同样可以到4G。
80486/Pentium/Pentium Pro: 这些80x86家族的成员增加了不多的新
的特征。它们主要是提高了指令执行的速度。
Pentium MMX: 这些处理器在Pentium基础上增加了MMX指令(多媒体
扩展)。这些指令可以提高普通的图像操作的速率。
Pentium II: 它是拥有MMX 指令的Pentium处理器。(Pentium III 本质上
就是一个更快的Pentium II。)
1.2.4 8086 16位位位寄寄寄存存存器器器
最初的8086CPU提供4个16位通用寄存器:AX,BX,CX 和DX。这些
寄存器都可以分解成两个8位寄存器。例如:AX寄存器可以分解成AH和AL寄
存器,像图 1.5展示的一样。AH寄存器包含AX的上(或高)8位,而AL包
含AX的低8位。通常AH和AL都当做独立的一个字节的寄存器来用;但是,
清楚它们不能独立于AX是非常重要的。改变AX的值将会改变AH和AL的值
反之亦然
。通用寄存器多数使用在数据移动和算术指令中。
这有两个16位指针寄存器:SI 和DI 。通常它们都是当作指针来使用,
但是在许多情况下也可以像通用寄存器一样使用。但是,它们不可以分解
成8位寄存器。
16位BP和SP 寄存器用来指向机器语言堆栈里的数据,被各自称为基址
寄存器 和堆栈指针寄存器。这些将在以后讨论。
16位CS,DS,SS 和ES 寄存器是
段寄存器
。 它们指出程序不同部分所
使用的内存。CS代表代码段,DS 代表数据段,SS 代表堆栈段和ES代表
附加段。ES当作一个暂时段寄存器来使用。这些寄存器的细节描述在小
节 1.2.6 和1.2.7中。
指令指针寄存器(IP) 与CS寄存器一起使用来跟踪CPU下一条执行指令
的地址。通常,当一条指令执行时,IP提前指向内存里的下一条指令。
FLAGS寄存器储存了前面指令执行结果的重要信息。这些结果在寄存
器里以单个的位储存。例如:如果前面指令执行结果是0,Z位为1,反之
为0。并不是所有指令都修改FLAGS里的位,查看附录里的表看单个指令是
如何影响FLAGS寄存器的。
1.2
计算机结构
7
1.2.5 80386 32位位位寄寄寄存存存器器器
80386及以 后的 处理器 扩展 了寄 存器。 例如 :16位AX寄存器 扩展 成
了32位。为了向后兼容,AX依然表示16位寄存器而EAX 用来表示扩展
的32位寄存器。AX是EAX 的低16位就像AL是AX(EAX)的低8位一样。但
是没有直接访问EAX 高16位的方法。其它的扩展寄存器是EBX,ECX,EDX,
ESI 和EDI 。
许多其它类型的寄存器同样也扩展了。BP变成了EBP;SP 变成了ESP;FLAGS变
成了EFLAGSEFLAGS 而IP变成了EIP。但是,不同于指针寄存器和通用
寄存器,在32位保护模式下(下面将讨论的)只有这此寄存器的扩展形式被使
用。
在80386里,段寄存器依然是16位的。这儿有两个新的段寄存器:FS和GS。
它们名字并不代表什么。它们是附加段寄存器(像ES一样)。
术语中
字
的一个定义为CPU数据寄存器的大小。对于80x86家族,这个
术语现在有一点混乱了。在表 1.2里,可以看到
字
被定义成两个字节。它是
当8086第一次发行时被定义成这样的。当80386开发出来后,它被决定依旧
保持这个
字
定义不改变,即使寄存器的大小已经改变了。
1.2.6 实实实模模模式式式
在实模式下,内存被限制为仅有1M字节(2
20
字节)。有效的地址从00000
那么,无耻的
DOS640K
限
制来自哪里?
BIOS
为它的
代码和硬件设备如显示器
要求了
1M
内存中的一些内
存。
到FFFFF (十六进制)。 这些地址需要用20位的数来表示。显然,一个20位
的数不适合任何一个8086的16位寄存器。Intel通过利用两个16位数值来决
定一个地址的方法来解决这个问题。开始的16位值称为
段地址
(selector)。
段地址的值必须存储在段寄存器中。第二个16位值称为
偏移地址
(offset)。
用32位
段地址:偏移地址
表示的物理地址可以由下面的公式计算:
16 ∗ selector + offset
在十六进制中乘以16是非常容易的,只需要在数的右边加0。例如:表示
为047C:0048的物理地址通过这样得到:
047C0
+0048
04808
实际上,段地址的值是一节的首地址(看表 1.2)。
真实的段地址有以下的缺点:
• 一个段地址只能指向64K内存(16位偏移的上限)。如果一个程序拥有
大于64K的代码那又怎么办呢?在CS里的一个单一的值不能满足整个
程序执行的需要。程序必须分成小于64K的段(segment)。当执行从一
段移到另一段时,CS里的值必须改变。同样的问题发生在大量的数据
和DS 寄存器之间。这样使用是非常不方便的!
8
第
1
章 简介
• 每个字节在内存里并不只有唯一的段地址。物理地址04808可以表示
为:047C:0048,047D:0038,047E:0028 或047B:0058。 这将使段地
址的比较变得复杂。
1.2.7 16位位位保保保护护护模模模式式式
在80286的16位保护模式下,段地址的值与实模式相比解释得完全不
同。在实模式下,一个段地址的值是物理内存里的一节的首地址。在保护
模式下,一个段地址的值是一个指向
描述符表
的
指针
。两种模式下,程序
都是被分成段。在实模式下,这些段在物理内存的固定位置而且段地址的
值表示段开始处所在节的首地址。在保护模式下,这些段不是在物理内存
的固定的地址。事实上,它们根本不一定需要在内存中。
保护模式使用了一种叫做
虚拟内存
的技术。虚拟内存的基本思想是仅仅
保存程序现在正在使用的代码和数据到内存中。其它数据和代码暂时储存
在硬盘中直到它们再次需要时。当一段从硬盘重新回到内存中,它很有可
能放在不同于它移动到硬盘之前时的位置的内存中。所有这些都由操作系
统透明地执行。程序并不需要因为要让虚拟内存工作而使用不同的书写方
法。
在保护模式下,每一段都分配了一条描述符表里的条目。这个条目拥有
系统想知道的关于这段的所有信息。这些信息包括:现在是否在内存中;
如果在内存中,在哪;访问权限(
例如:
只读)。段的条目的指针是储存在
段寄存器里的段地址值。
16位保护模式的一个大的缺点是偏移地址依然是16位数。这个的后果就
一 个 非 常 著 名 的
PC
专
家称
286CPU
为
“
死了的大
脑
”
是段的大小依然限制为最大64K。这会导致使用大的数组时会有问题。
1.2.8 32位位位保保保护护护模模模式式式
80386引入了32位保护模式。386 32位保护模式和286 16位保护模式之间
最主要的区别是:
1. 偏移地址扩展成了32位。这就允许偏移地址范围升至4G。因此,段的
大小也升至4G。
2. 段可以分成较小的4K大小的单元,称为
内存页
。虚拟内存系统工作在
页的方式下,代替了段方式。这就意味着一段在任何一个时刻只有部
分可能在内存中。在28616位保护模式下,要么整个段在内存中,要
么整个不在。这样在32位模式下允许的大的段的情况下很不实用。
在Windows 3.x系统中,
标准模式
为286 16位保护模式而
增强模式
为32位
保护模式。Windows 9X,Windows NT/2000/XP,OS/2和Linux都运行在
分页管理的32位保护模式下。
1.3
汇编语言
9
1.2.9 中中中断断断
有时候普通的程序流必须可以被要求快速反应的处理事件中断。电脑提
供了一个称为
中断
的结构来处理这些事件。例如:当一个鼠标移动了,硬
件鼠标中断现在的程序来处理鼠标移动(移动鼠标,
等等
)。中断导致控制权
转移到一个
中断处理程序
。中断处理程序是处理中断的程序。每种类型的
中断都分配了一个中断号。在物理内存的开始处,存在一张包含中断处理
程序段地址的
中断向量
表。中断号是这张表中最基本的指针。
外部中断由CPU的外部引起。(鼠标就是这一类型的例子。)许多I/O设
备引起中断(
例如:
键盘,时钟,硬盘驱动器,CD-ROM和声卡)。内部
中断由CPU的 内部引起 ,要么 是由一个 错误引起 ,要么由 中断指 令引
起。 错误中 断称为
陷阱
。由 中断指 令引起的 中断称 为
软中 断
。DOS使
用这些类型的中断来实现它的API(应用程序接口)。许多现代的操作系
统(如:Windows和UNIX)使用一个基于C的接口。
5
许多中断处理程序当它执行完成时,将控制权返回给被中断的程序。它
们恢复寄存器,里面的值与中断发生之前的值相同。因此,被中断的程序
就像没有任何事情发生一样运行(除了它失去了一些CPU周期)。陷阱通常
不返回。通常它们中止程序。
1.3 汇汇汇编编编语语语言言言
1.3.1 机机机器器器语语语言言言
每种类型的CPU都能理解它们自己的机器语言。机器语言里的指令是
以字节形式在内存中储存的数字。每条指令有它唯一的数字码称为
操作代
码
,或简称为
操作码
。80x86处理器的指令大小不同。操作码通常是在指令
的开始处。许多指令还包含指令使用的数据(
例如:
常量或地址)。
机器语言很难直接进行编程。解译这些数字代码指令的意思对人类来说
是沉闷的。例如:执行将EAX 和EBX 寄存器相加然后将结果送回到EAX
的指令以十六进制码编译如下:
03 C3
这个很难理解。幸运的是,一个叫做
汇编的程序
可以为程序员做这个沉闷
的工作。
1.3.2 汇汇汇编编编语语语言言言
一个汇编语言程序以文本格式储存(正如一个高级语言程序)。每条汇编
指令代表确切的一条机器指令。例如:上面描述的加法指令在汇编语言中
将描述成:
add eax, ebx
5
然而,它们在内核级可能会使用一个更低等级的接口。
10
第
1
章 简介
这里指令的意思比在机器代码表示得
更
清楚。代码add是加法指令的
助记符
。一条汇编指令的通常格式为:
mnemonic(
助记符
) operand(s)(
操作数
)
汇编程序
是一个读包含汇编指令的文本文件和将汇编语言转换成机器代
码的程序。
编译器
是为高级编程语言做同样转换的程序。一个汇编程序比
一个编译器要简单。每条汇编语句接代表一个唯一的机器指令。高级语言
它花费了电脑科学家几年
的时间来揣测如何编写一
个编译器!
更
复杂而且可能要求更多的机器指令。
汇编和高级语言之间另一个更重要的区别是因为每种不同类型的CPU有
它自己的机器代码,所以它同样有它自己的汇编语言。在不同的电脑构造
中移植汇编语言比高级语言要困难
得多
。
这本书使用了Netwide Assembler,或简称为NASM 。它在Internet上是
免费提供的(要得到URL,请看前言)。更普遍的汇编程序是Microsoft As-
sembler(MASM) 或Borland Assembler (TASM)。MASM/TASM和NASM
之间有一些汇编语法区别。
1.3.3 指指指令令令操操操作作作数数数
机器代码指令拥有个数和类型不同的操作数;然而,通常每个指令有几
个固定的操作数(0到3个)。操作数可以有下面的类型:
寄寄寄存存存器器器: 这些操作数直接指向CPU寄存器里的内容。
内内内存存存: 这些操作数指向内存里的数据。数据的地址可能是硬编码到指令里
的常量或可能直接使用寄存器的值计算得到。距离段的起始地址的偏
移值即为此地址。
立立立即即即数数数: 这些操作数是指令本身列出的固定的值。它们储存在指令本身(在
代码段),而不在数据段。
暗暗暗指指指的的的操操操作作作数数数: 这些操作数没有明确显示。例如:往寄存器或内存增加1的
加法指令。1是暗指的。
1.3.4 基基基本本本指指指令令令
最基本指令是MOV 指令。它将数据从一个地方移到另一个地方(像高级语
言里面的赋值操作一样)。它携带两个操作数:
mov dest (
目的操作数
), src(
源操作数
)
src指定的数据拷贝到了dest。一个指令的两个操作数不能同时是内存操作
数。这就指出了一个汇编古怪的地方。通常,对于各种各样指令的使用都
有某些强制性的规定。操作数必须是同样的大小。AX里的值就不能储存
到BL 里去。
这儿有一个例子(分号表示注释的开始):
剩余176页未读,继续阅读
「已注销」
- 粉丝: 8
- 资源: 15
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 前端面试必问:真实项目经验大揭秘
- 永磁同步电机二阶自抗扰神经网络控制技术与实践
- 基于HAL库的LoRa通讯与SHT30温湿度测量项目
- avaWeb-mast推荐系统开发实战指南
- 慧鱼SolidWorks零件模型库:设计与创新的强大工具
- MATLAB实现稀疏傅里叶变换(SFFT)代码及测试
- ChatGPT联网模式亮相,体验智能压缩技术.zip
- 掌握进程保护的HOOK API技术
- 基于.Net的日用品网站开发:设计、实现与分析
- MyBatis-Spring 1.3.2版本下载指南
- 开源全能媒体播放器:小戴媒体播放器2 5.1-3
- 华为eNSP参考文档:DHCP与VRP操作指南
- SpringMyBatis实现疫苗接种预约系统
- VHDL实现倒车雷达系统源码免费提供
- 掌握软件测评师考试要点:历年真题解析
- 轻松下载微信视频号内容的新工具介绍
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功