汇编语言程序设计(基于8086处理器)

本文介绍了汇编语言的基础知识,包括机器指令、操作、寄存器、存储器结构、CPU与存储器的交互以及地址总线、数据总线和控制总线的作用。还探讨了内存地址空间的概念,以及BIOS和不同类型的存储器如ROM和RAM的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

tip:本笔记均取自b站小甲鱼学汇编,为入门汇编的好课程,我自己个人上半年汇编成绩也取得了班上第一的成绩,所以想把自己所做的汇编笔记贡献给互联网的朋友们,由于本人水平有限,如有出错还请朋友们指出改正。

# 第一章

## 1.机器指令:1000 1001 1101 1000
## 2.操作:寄存器Bx的内容送到Ax中
## 3.汇编指令:Mov Ax,Bx

##  4.寄存器:简单的讲是Cpu中可以存储数据的器件,一个cpu中有多个寄存器。
    •     Ax是其中一个寄存器的代号
    •     Bx是其中一个寄存器的代号
    •     Cx是其中一个寄存器的代号
5.汇编语言的组成:
5.1.汇编指令(机器码的助记符)
     汇编语言的核心是汇编指令
5.2.伪指令(由编译器执行)
    它决定了汇编语言的特性。
5.3.其他符号(由编译器识别)

6.存储器:
cpu是计算机的核心部件,它控制整个计算机的运作并执行运算,要想让一个cpu工作,就必须向它提供指合和数据。
指令和数据在存储器中存放,也就是平时所说的内存。

7.指令和数据:
指令和数据是应用上的概念。
在内存或磁盘上,指令和数据没有任何区别,都是二进制消息。
—————————————————
二进制消息:
1000 1001 1101 1000 
    8    | 9    |D|8      H
89D8H(数据)“H”表示hex(十六),即十六进制。
1000 1001 1101 1000表示的机器码为Mov ax,bx(程序)

1.6存储单元
存储器被划分为若干个存储单元,每个存储单元从零开始顺序编号。
例如:
一个存储器有128个存储单元
编号从0~127

60cba940a1dd44cca23c8d37c0f3feec.png

B=Byte
ロ 1kb=1024bロ 1MB = 1024kBロ 1GB = 1024MB  ロ1TB=10241Gb

磁盘的容量单位同内存的一样,实际上以上的单位是微机中常用的计量单位。

1.7  cpu对存储器的读写
cpu要想进行数据的读写,必领和外部器件(标准的说法是芯片)进行二进制信息的交互:
口1.存储单元的地址(地址信息)
口2.器件的选择,读或写命令(控制信息)
口3.读或写的数据(数据信息)


cpu是如何将地址,数据和控制信息传到存储芯片中的?

电子计算机能处理,传输的信号都是电信号,电信号当然要用导线传送。

在计算机中专门有连接cpu和其他芯片的导线,道常称为总线。

物理上:一根根导线的集合
逻辑上划分为:
1.地址总线
2.数据总线
3.控制总线
总线在逻辑上划分的图示
8c3c469acae24c3e92520a9e58c2fa20.png
(目前,计算机cpu的发展变化也就可以理解为1.晶体管的数量变多了2.寄存器的数量变多了3.通道的数量变多了)

1.8地址总线

CPU 是通过地址总线来指定存储单元的
地址线上能传送多少个不同的信息,cpu就可以对多个在储单无进行寻址。
64位Сpu
64位系统 WIN 7.
64位软件
6ae0f5e7089d4ce8a00da08ddb8e0360.png
上图左边的具体数据为
000001011  读1011
一个cpu有N根地址总线,则可以说这个cpu地址总线的宽度为N。
这样的cpu最多可以寻找2的n次方个内存单元。
1Byte=8bit  (8位,一位表示一个0或1的数据) 

cpu与内存或其他器件之间的数据传送是通过数据总线来进的。

数据总线的宽度,决定了Cpu和外界的数据传送速度。
1.10控制总线
cpu对外部期间的控制是通过控制总线来进行的。在这里控制总线是个总称,控制总线是一些不同控制线的集合。

有多少根控制总线,就意味着cpu提供了对外部器件的多少种控制,所以控制总线的宽度决定了cpu对外部器件的控制能力。

前面所讲的内存读或写命令是由几根控制线综合发出的。

1.10.1其中有一根名为读信号输出控制线负责由cpu向外传送读信号,cpu向该控制线上输出低电平表示将要读取数据。

1.10.2有一根名为写信号输出控制线,负责由cpu向外传送写信号

1.汇编指令是机器指令的助记符,同机器指令一一对应。
2.每一种cpu都有自己的汇编指令集。(由此说明汇编语言编写的程序可移植性不佳)
3.cpu可以直接使用的信息在存储器中存放。
4.在存储器中指令和数据没有任何区别,都是二进制信息。
5.存储单元从零开始顺序编号。
6.一个存储单元可以存储8个bit(用作单位写成“b”),即8位二进制数。
7.每一个cpu芯片都有许多的管脚,这些管教和总线相连,也可以说,这些管脚引出总线。一个cpu可以引出三种总线的宽度,标志了这个cpu的不同方面的性能。
8.地址总线的宽度决定了cpu的寻址能力。
9.数据总线的宽度决定了cpu与其他期间进行数据传送时一次数据的传送量。
10.控制总线的宽度决定了cpu对系统中其他期间的控件能力。
1.1.1内存地址空间(概述)
什么是内存地址空间呢?
一个cpu的地址线宽度为10,那么可以寻址1024个内存单元,这1024个可寻址的内存单元就构成这个cpu的内存地址空间。下面深入讨论:
1.12主板:
口 在每一台PC机中,都有一个主板,主板上有一个核心器件和一些主要期间。
口 这些器件通过总线(地址总线,数据总战,控制总线)相连。
1.13 接口卡
1.计算机系统中,所有可用程序控制其工作的设备,必须受到cpu的控制。
2.cpu对外部设备不能直接控制,入显示器,音箱,打印机等,直接控制这些设备进行工作的是插在扩展槽上的接口卡。
1.14各类存储器芯片
1.从读写属性上看分为两类:
随机存储器(RAM)和只读存储器(ROM)
2.从功能和连接上分类:
1.随机存储器RAM
2.装有BIOS的RAM
3.接口卡的RAM

装有BIOS的ROM
bios:basic input/output system.基本输入输出系统
bios是由主板和各类接口卡(如显卡,网卡等)厂商提供的软件系统,可以通过它利用该硬件设备进行最基本的输入输出。在主板和某些接口卡上插着存储相应Bios的ROM。

1.15内存地址空间
上述的那些在储器在物理上是独立的器件,但是它们在以下两点上相同:
1.都和cpu的总线相连
2.cpu对他们进行读或写的时候都通过控制线发出的内存读写命令。
不同的计算机系统的内存地址空间分配情况是不同的。
内存地址空间:
1. 最终运行程序的是cpu,我们用汇编编程的时侯,必须要从cpu角度考虑问题。
2.对cpu来讲,系统中的所有存储器中的存储单元都处于一个统一的逻辑存储器中,它的容量受cpu寻址能力的限制)。这个逻辑存储器即是我们所说的内存地址空间。

本书分为三部分。第一部分是基础部分,以8086/8088为背景,以DOS和PC兼容机为软硬件平台,以MASM和TASM为汇编器,介绍汇编语言的有关概念,讲解汇编语言程序设计技术。第二部分是提高部分,以80386为背景,以新一代微处理器Pentium为目标,细致和通俗地介绍了保护方式下的有关概念,系统和详细地讲解了保护方式下的编程技术,真实和生动地展示了保护方式下的编程细节。第三部分是上机实验指导。 本书的第一部分适合初学者,可作为学习汇编语言程序设计的教材。本书的第二部分适合已基本掌握8086/8088汇编语言的程序员,可作为学习保护方式编程技术的教材或参考书,也可作为其他人员了解高档微处理器和保护方式编程技术的参考书,还可作为程序员透彻地了解Windows程序设计技术的参考书。 第一部分 基础部分 第1章 绪论 1.1 汇编语言概述 1.1.1 汇编语言 1.1.2 汇编语言的特点 1.1.3 恰当地使用汇编语言 1.2 数据的表示和类型 1.2.1 数值数据的表示 1.2.2 非数值数据的表示 1.2.3 基本数据类型 1.3 Intel系列CPU简介 1.3.1 8位微处理器 1.3.2 16位微处理器 1.3.3 32位微处理器 1.3.4 Pentium和Pentium Pro 1.4 习题 第2章 8086/8088寻址方式和指令系统 2.1 8086/8088寄存器组 2.1.1 8086/8088 CPU寄存器组 2.1.2 标志寄存器 2.2 存储器分段和地址的形成 2.2.1 存储单元的地址和内容 2.2.2 存储器的分段 2.2.3 物理地址的形成 2.2.4 段寄存器的引用 2.3 8086/8088的寻址方式 2.3.1 立即寻址方式 2.3.2 寄存器寻址方式 2.3.3 直接寻址方式 2.3.4 寄存器间接寻址方式 2.3.5 寄存器相对寻址方式 2.3.6 基址加变址寻址方式 2.3.7 相对基址加变址寻址方式 2.4 8086/8088指令系统 2.4.1 指令集说明 2.4.2 数据传送指令 2.4.3 堆栈操作指令 2.4.4 标志操作指令 2.4.5 加减运算指令 2.4.6 乘除运算指令 2.4.7 逻辑运算和移位指令 2.4.8 转移指令 2.5 习题 第3章 汇编语言及其程序设计初步 3.1 汇编语言的语句 3.1.1 语句的种类和格式 3.1.2 数值表达式 3.1.3 地址表达式 3.2 变量和标号 3.2.1 数据定义语句 3.2.2 变量和标号 3.3 常用伪指令语句和源程序组织 3.3.1 符号定义语句 3.3.2 段定义语句 3.3.3 汇编语言源程序的组织 3.4 顺序程序设计 3.4.1 顺序程序举例 3.4.2 简单查表法代码转换 3.4.3 查表法求函数值 3.5 分支程序设计 3.5.1 分支程序举例 3.5.2 利用地址表实现多向分支 3.6 循环程序设计 3.6.1 循环程序举例 3.6.2 多重循环程序举例 3.7 习题 第4章 子程序设计和DOS功能调用 4.1 子程序设计 4.1.1 过程调用和返回指令 4.1.2 过程定义语句 4.1.3 子程序举例 4.1.4 子程序说明信息 4.1.5 寄存器的保护与恢复 4.2 主程序与子程序间的参数传递 4.2.1 利用寄存器传递参数 4.2.2 利用约定存储单元传递参数 4.2.3 利用堆栈传递参数 4.2.4 利用CALL后续区传递参数 4.3 DOS功能调用及应用 4.3.1 DOS功能调用概述 4.3.2 基本I/O功能调用 4.3.3 应用举例 4.4 磁盘文件管理及应用 4.4.1 DOS磁盘文件管理功能调用 4.4.2 应用举例 4.5 子程序的递归和重入 4.5.1 递归子程序 4.5.2 可重入子程序 4.6 习题 第5章 输入输出与中断 5.1输 入和输出的基本概念 5.1.1 I/O端口地址和I/O指令 5.1.2 数据传送方式 5.1.3 存取RT/CMOS RAM 5.2 查询方式传送数据 5.2.1 查询传送方式 5.2.2 读实时钟 5.2.3 查询方式打印输出 5.3 中断 5.3.1 中断和中断传送方式 5.3.2 中断向量表 5.3.3 中断响应过程 5.3.4 外部中断 5.3.5 内部中断 5.3.6 中断优先级和中断嵌套 5.3.7 中断处理程序的设计 5.4 基本输入输出系统BIOS 5.4.1 基本输入输出系统BIOS概述 5.4.2 键盘输入 5.4.3 显示输出 5.4.4 打印输出 5.5 软中断处理程序举例 5.5.1 打印I/O程序 5.5.2 时钟显示程序 5.6 习题 第6章 简单应用程序的设计 6.1 字符串处理 6.1.1 字符串操作指令 6.1.2 重复前缀 6.1.3 字符串操作举例 6.2 十进制数算术运算调整指令及应用 6.2.1 组合BCD码的算术运算调整指令 6.2.2 未组合BCD码的算术运算调整指令 6.2.3 应用举例 6.3 DOS程序段前缀和特殊情况处理程序 6.3.1 DOS程序段前缀PSP 6.3.2 对Ctrl+C键和Ctrl+Break键的处理 6.4 TSR程序设计举例 6.4.1 驻留的时钟显示程序 6.4.2 热键激活的TSR程序 6.5 习题 第7章 高级汇编语言技术 7.1 结构和记录 7.1.1 结构 7.1.2 记录 7.2 宏 7.2.1 宏指令的定义和使用 7.2.2 宏指令的用途 7.2.3 宏指令中参数的使用 7.2.4 特殊的宏运算符 7.2.5 宏与子程序的区别 7.2.6 与宏有关的伪指令 7.2.7 宏定义的嵌套 7.3 重复汇编 7.3.1 伪指令REPT 7.3.2 伪指令IRP 7.3.3 伪指令IRPC 7.4 条件汇编 7.4.1 条件汇编伪指令 7.4.2 条件汇编与宏结合 7.5 源程序的结合 7.5.1 源程序的结合 7.5.2 宏库的使用 7.6 习题 第8章 模块化程序设计技术 8.1 段的完整定义 8.1.1 完整的段定义 8.1.2 关于堆栈段的说明 8.1.3 段组的说明和使用 8.2 段的简化定义 8.2.1 存储模型说明伪指令 8.2.2 简化的段定义伪指令 8.2.3 存储模型说明伪指令的隐含动作 8.3 模块间的通信 8.3.1 伪指令PUBLIC和伪指令EXTRN 8.3.2 模块间的转移 8.3.3 模块间的信息传递 8.4 子程序库 8.4.1 子程序库 8.4.2 建立子程序库 8.4.3 使用举例 8.5 编写供Turbo C调用的函数 8.5.1 汇编格式的编译结果 8.5.2 汇编模块应该遵守的约定 8.5.3 参数传递和寄存器保护 8.5.4 举例 8.6 习题 第二部分 提高部分 第9章 80386程序设计基础 9.1 80386寄存器 9.1.1 通用寄存器 9.1.2 段寄存器 9.1.3 指令指针和标志寄存器 9.2 80386存储器寻址 9.2.1 存储器寻址基本概念 9.2.2 灵活的存储器寻址方式 9.2.3 支持各种数据结构 9.3 80386指令集 9.3.1 数据传送指令 9.3.2 算术运算指令 9.3.3 逻辑运算和移位指令 9.3.4 控制转移指令 9.3.5 串操作指令 9.3.6 高级语言支持指令 9.3.7 条件字节设置指令 9.3.8 位操作指令 9.3.9 处理器控制指令 9.4 实方式下的程序设计 9.4.1 说明 9.4.2 实例 9.5 习题 第10章 保护方式下的80386及其编程 10.1 保护方式简述 10.1.1 存储管理机制 10.1.2 保护机制 10.2 分段管理机制 10.2.1 段定义和虚拟地址到线性地址转换 10.2.2 存储段描述符 10 2.3 全局和局部描述符表 10.2.4 段选择子 10.2.5 段描述符高速缓冲寄存器 10.3 80386控制寄存器和系统地址寄存器 10.3.1 控制寄存器 10 3.2 系统地址寄存器 10.4 实方式与保护方式切换实例 10.4.1 演示实方式和保护方式切换的实例(实例一) 10.4.2 演示32位代码段和16位代码段切换的实例(实例二) 10.5 任务状态段和控制门 10.5.1 系统段描述符 10.5.2 门描述符 10.5.3 任务状态段 10.6 控制转移 10.6.1 任务内无特权级变换的转移 10.6.2 演示任务内无特权级变换转移的实例(实例三) 10.6.3 任务内不同特权级的变换 10.6.4 演示任务内特权级变换的实例(实例四) 10.6.5 任务切换 10.6.6 演示任务切换的实例(实例五) 10.7 80386的中断和异常 10.7.1 80386的中断和异常 10.7.2 异常类型 10.7.3 中断和异常的转移方法 10.7.4 演示中断处理的实例(实例六) 10.7.5 演示异常处理的实例(实例七) 10.7.6 各种转移途径小结 10.8 操作系统类指令 10.8.1 实方式和任何特权级下可执行的指令 10.8.2 实方式及特权级0下可执行的指令 10 8.3 只能在保护方式下执行的指令 10.8.4 显示关键寄存器内容的实例(实例八) 10.8.5 特权指令 10.9 输入/输出保护 10.9.1 输入/输出保护 10.9.2 重要标志保护 10.9.3 演示输入/输出保护的实例(实例九) 10.10 分页管理机制 10.10.1 存储器分页管理机制 10.10.2 线性地址到物理地址的转换 10.10.3 页级保护和虚拟存储器支持 10.10.4 页异常 10.10.5 演示分页机制的实例(实例十) 10.11 虚拟8086方式 10.11.1 V86方式 10.11.2 进入和离开V86方式 10.11.3 演示进入和离开V86方式的实例(实例十一) 10.11.4 V86方式下的敏感指令 10.12 习题 第11章 80486及Pentium程序设计基础 11.1 80486程序设计基础 11.1.1 寄存器 11.1.2 指令系统 11.1.3 片上超高速缓存 11.2 80486对调试的支持 11 2.1 调试寄存器 11.2.2 演示调试故障/陷阶的实例 11.3 Pentium程序设计基础 11.3.1 寄存器 11.3.2 指令系统 11.3.3 处理器的识别 11.3.4 片上超高速缓存 11.4 基于Pentium的程序优化技术 11.4.1 流水线优化技术 11.4.2 分支优化技术 11.4.3 超高速缓存代化技术 11.5 习题 第三部分 上机实验指导 第12章 实验指导 12.1 实验的一般步骤 12.2 汇编器和连接器的使用 12.2.1 MASM的使用 12.2.2 LINK的使用 12.2.3 TASM的使用 12.2.4 TLINK的使用 12.3 调试器DEBUG的使用 12.3.1 启动和退出DEBUG 12.3.2 命令一览 12.3.3 利用DEBUG调试程序 12.4 Turbo Debugger的使用 12.4.1 启动和退出TD 12.4.2 利用TD调试汇编程序 参考文献 附录 Pentium指令与标志参考表
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

逆向爱好者

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值