没有合适的资源?快使用搜索试试~ 我知道了~
首页NASM汇编语言基础教程-中文版
NASM汇编语言基础教程-中文版
需积分: 9 4 下载量 89 浏览量
更新于2024-08-02
收藏 1.21MB PDF 举报
"nasm汇编-中文翻译" 本书是一本关于nasm汇编语言的中文翻译版,适合初学者入门学习。作者Paul A. Carter在书中详细介绍了汇编语言的基础知识,包括数制、计算机结构、汇编语言的概念以及如何创建和理解汇编程序。 在第一章中,作者首先讲解了不同数制,如十进制、二进制和十六进制,这些是理解计算机基础的重要部分。接着,他深入讨论了计算机的内存、CPU结构,特别是80x86系列,如8086和80386的寄存器布局。此外,还介绍了实模式、16位和32位保护模式,这些都是理解x86架构的关键。中断的概念也在这一章中被提及,它是操作系统与硬件交互的重要机制。汇编语言的基础,如机器语言、指令操作数、基本指令、指示符、输入输出和调试技巧也在此章节中进行了阐述。作者还通过创建简单程序的实例,让读者了解编写汇编代码的过程,包括编译器的使用和目标文件的连接。 第二章主要探讨了汇编语言的细节。作者讲解了整数的表示方法,包括正负号延伸和补码运算,并通过实例加深理解。控制结构,如比较、分支和循环指令,是程序设计的核心,作者详细介绍了这些概念以及如何用汇编语言实现常见的控制结构,如if语句和循环。这有助于读者更好地理解和编写复杂的逻辑流程。 这本书为读者提供了一个全面的nasm汇编语言学习平台,涵盖了从基础知识到实际编程的各个方面。通过阅读和实践书中的内容,初学者能够逐步掌握汇编语言,为更深入的系统级编程和底层开发打下坚实的基础。
资源详情
资源推荐
![](https://csdnimg.cn/release/download_crawler_static/1494273/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/1494273/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/1494273/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/1494273/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/1494273/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/x-rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![application/x-rar](https://img-home.csdnimg.cn/images/20210720083606.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/default.jpg!1)
donaverhuang
- 粉丝: 0
- 资源: 4
上传资源 快速赚钱
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助
![](https://csdnimg.cn/release/wenkucmsfe/public/img/voice.245cc511.png)
最新资源
- 构建Cadence PSpice仿真模型库教程
- VMware 10.0安装指南:步骤详解与网络、文件共享解决方案
- 中国互联网20周年必读:影响行业的100本经典书籍
- SQL Server 2000 Analysis Services的经典MDX查询示例
- VC6.0 MFC操作Excel教程:亲测Win7下的应用与保存技巧
- 使用Python NetworkX处理网络图
- 科技驱动:计算机控制技术的革新与应用
- MF-1型机器人硬件与robobasic编程详解
- ADC性能指标解析:超越位数、SNR和谐波
- 通用示波器改造为逻辑分析仪:0-1字符显示与电路设计
- C++实现TCP控制台客户端
- SOA架构下ESB在卷烟厂的信息整合与决策支持
- 三维人脸识别:技术进展与应用解析
- 单张人脸图像的眼镜边框自动去除方法
- C语言绘制图形:余弦曲线与正弦函数示例
- Matlab 文件操作入门:fopen、fclose、fprintf、fscanf 等函数使用详解
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
![](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)