没有合适的资源?快使用搜索试试~ 我知道了~
首页nasm教程:入门到精通PC汇编语言与8086/386体系结构
PC汇编语言教程是关于nasm(Netwide Assembler)的一种教学资料,该教程由Paul A. Carter撰写,并由伍星翻译。发布日期为2007年1月17日,其版权归Paul Carter所有。教程允许在不侵犯作者权益的前提下进行复制和分发,但必须保留作者身份、版权信息和许可声明,且不得以此为盈利目的。它适用于课堂教育,作者鼓励教师将其作为教学工具,并希望在使用时得到通知。 本教程详细介绍了PC汇编语言的基础知识,包括数制转换(如十进制、二进制和十六进制)、计算机体系结构,特别是针对Intel的80x86系列,如8086和80386的16/32位寄存器、实模式与保护模式,以及中断处理。此外,还深入探讨了汇编语言本身,如机器语言、汇编指令的操作数、基本指令、操作符和指令集,以及输入输出、调试等实用技巧。 创建一个程序的部分涵盖了如何编写第一个汇编程序,包括编译器的依赖性、汇编代码的编写、将C代码转化为汇编,以及目标文件的链接和理解汇编列表文件。骨架文件的概念也在这一章节中有所提及,它们可能是模板或者结构化的代码框架。 控制结构是汇编编程中的关键部分,教程详细讲解了整形工作方式,如不同表示法、正负号扩展、补码运算以及如何在程序中应用这些概念。控制结构包括比较操作、分支指令(如if语句)和循环指令,这些都是实现程序逻辑控制的基础。 通过这个教程,学习者可以逐步掌握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页未读,继续阅读
tinggkong
- 粉丝: 0
- 资源: 1
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 多模态联合稀疏表示在视频目标跟踪中的应用
- Kubernetes资源管控与Gardener开源软件实践解析
- MPI集群监控与负载平衡策略
- 自动化PHP安全漏洞检测:静态代码分析与数据流方法
- 青苔数据CEO程永:技术生态与阿里云开放创新
- 制造业转型: HyperX引领企业上云策略
- 赵维五分享:航空工业电子采购上云实战与运维策略
- 单片机控制的LED点阵显示屏设计及其实现
- 驻云科技李俊涛:AI驱动的云上服务新趋势与挑战
- 6LoWPAN物联网边界路由器:设计与实现
- 猩便利工程师仲小玉:Terraform云资源管理最佳实践与团队协作
- 类差分度改进的互信息特征选择提升文本分类性能
- VERITAS与阿里云合作的混合云转型与数据保护方案
- 云制造中的生产线仿真模型设计与虚拟化研究
- 汪洋在PostgresChina2018分享:高可用 PostgreSQL 工具与架构设计
- 2018 PostgresChina大会:阿里云时空引擎Ganos在PostgreSQL中的创新应用与多模型存储
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功