没有合适的资源?快使用搜索试试~ 我知道了~
首页PC汇编语言入门与基础教程
PC汇编语言入门与基础教程
需积分: 11 0 下载量 48 浏览量
更新于2024-08-01
收藏 1.18MB PDF 举报
"PC汇编语言 觉得好给个评论" 本书是关于PC汇编语言的教程,由Paul A. Carter撰写并由伍星翻译。该书的版权日期为2001年至2004年,作者允许无条件地复制和分发此文档,但不允许从中获利。这本书鼓励教师将其作为教学资源,并且作者希望在教育场合使用时能收到通知。 书中首先介绍了数制系统,包括十进制、二进制和十六进制,这些都是理解计算机基础和汇编语言的关键。接着,作者深入讲解了计算机的基本结构,如内存、CPU,特别是80x86系列的CPU,涵盖8086和80386的寄存器结构以及不同模式,如实模式、16位保护模式和32位保护模式。中断的概念也在这一部分被提及,中断在处理硬件事件和系统调用中起着重要作用。 汇编语言部分详细阐述了机器语言、汇编语言的差异,以及指令操作数、基本指令和指示符。书中还讨论了输入和输出操作以及调试技术。在实际编程中,作者引导读者如何创建一个简单的程序,包括编写第一个程序、理解编译器依赖性、汇编代码的生成、连接目标文件和解析汇编列表文件的过程。 第二章则进一步深入汇编语言的细节,包括整数的工作方式,如整形表示法、正负符号延伸、补码运算和扩充精度运算。此外,还探讨了控制结构,如比较、分支和循环指令,以及如何将这些结构转化为标准的编程语句,如If语句。这部分内容对于学习汇编语言的逻辑控制非常重要。 通过这本书,读者将能够全面了解PC平台上的汇编语言,从基本概念到实际编程技巧,从而能够编写和理解汇编代码,这对于底层系统开发、性能优化或者对计算机工作原理有深入理解的需求者来说是一份宝贵的资源。
资源详情
资源推荐
![](https://csdnimg.cn/release/download_crawler_static/2274012/bg10.jpg)
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寄存器的。
![](https://csdnimg.cn/release/download_crawler_static/2274012/bg11.jpg)
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 寄存器之间。这样使用是非常不方便的!
![](https://csdnimg.cn/release/download_crawler_static/2274012/bg12.jpg)
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位保护模式下。
![](https://csdnimg.cn/release/download_crawler_static/2274012/bg13.jpg)
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
然而,它们在内核级可能会使用一个更低等级的接口。
![](https://csdnimg.cn/release/download_crawler_static/2274012/bg14.jpg)
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页未读,继续阅读
![application/octet-stream](https://img-home.csdnimg.cn/images/20210720083646.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://profile-avatar.csdnimg.cn/b2fe6f1e3bed43e2af75e26683f286dc_tftaizi.jpg!1)
tftaizi
- 粉丝: 1
- 资源: 9
上传资源 快速赚钱
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助
![](https://csdnimg.cn/release/wenkucmsfe/public/img/voice.245cc511.png)
最新资源
- 解决本地连接丢失无法上网的问题
- BIOS报警声音解析:故障原因与解决方法
- 广义均值移动跟踪算法在视频目标跟踪中的应用研究
- C++Builder快捷键大全:高效编程的秘密武器
- 网页制作入门:常用代码详解
- TX2440A开发板网络远程监控系统移植教程:易搭建与通用解决方案
- WebLogic10虚拟内存配置详解与优化技巧
- C#网络编程深度解析:Socket基础与应用
- 掌握Struts1:Java MVC轻量级框架详解
- 20个必备CSS代码段提升Web开发效率
- CSS样式大全:字体、文本、列表样式详解
- Proteus元件库大全:从基础到高级组件
- 74HC08芯片:高速CMOS四输入与门详细资料
- C#获取当前路径的多种方法详解
- 修复MySQL乱码问题:设置字符集为GB2312
- C语言的诞生与演进:从汇编到系统编程的革命
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
![](https://img-home.csdnimg.cn/images/20220527035711.png)
![](https://img-home.csdnimg.cn/images/20220527035711.png)
![](https://img-home.csdnimg.cn/images/20220527035111.png)
安全验证
文档复制为VIP权益,开通VIP直接复制
![](https://csdnimg.cn/release/wenkucmsfe/public/img/green-success.6a4acb44.png)