汇编语言入门(整理)
第1章 基础知识
1.1 机器语言
机器码到计算机的运算原理:机器码为一系列的01的二进制组合,计算机将这些二进制组合
转换为高低电平,驱动计算机的电子器件进行运算。
不同的计算机结构不同,驱动方式也不同,所以需要不同的机器语言。 早期的程序员使用打卡机输入计算机,进行运算。
机器语言编码和查错非常不方便。
1.2 汇编语言的产生
机器语言的麻烦-->汇编语言的产生。区别就在于指令的表示方法上。 编译器:将汇编语言转换为机器语言的工具。
1.3 汇编语言的组成
汇编语言的组成:汇编指令,伪指令,符合(+/-/*//) 1.4 存储器
CPU处理指令和数据,而存储器则负责将指令和数据传递给CPU处理。 1.5 指令和数据
只是应用上的区别。存储上都是二进制码。
1.6 存储单元
存储器由存储单元组成,每个存储单元从0开始编号。每个存储单元能存储的信息容量为1
个字节。内存单元的容量就是固定的一个字节。
1.7 CPU对寄存器的读写
信息交互分类:
? 地址信息
? 控制信息(读/写)
? 数据信息
信息的传递通过总线进行,总线及一组导线的集合。按照逻辑上分类,分为地址总线控制总
线和逻辑总线。
要命令CPU完成上述操作,则向CPU输入驱动的电平信号即可。 1.8 地址总线
地址总线宽度: 地址线的条数即地址总线的宽度,决定了CPU可以访问多少个寄存器存储单
元。
1.9 数据总线
数据总线宽度决定了传送数据的快慢。
1.10 控制总线
控制总线是一种控制信号的集合。CPU对外部器件的控制通过控制总线来进行,控制总
线的宽度决定了CPU对外部器件的控制能力。
1.11 内存地址空间(概述)
可寻址的内存单元即CPU的内存地址空间。
1.12 主板
PC机中,有一个主板,主板上有核心器件和主要器件,器件直接通过总线相连。 这些器件主要包括:CPU,存储器,外围芯片组,已经扩展插槽。 插槽一般有RAM内存条和各类接口卡。
1.13 接口卡
电脑上的所有设备必须受到CPU的控制才能工作,而CPU不能直接控制显卡,显示器等设备,这些设备必须通过接口卡来控制。而接口卡是通过总线和CPU相连的。接口卡根据CPU的指令对外设进行控制。
1.14 各类存储器芯片
PC中包含多种存储器。
1.15 内存地址空间
CPU对PC中的多种存储器进行管理,而每个存储器是独立的。但是CPU把所有的内存看做逻辑统一的器件来进行管理。所以在编程时必须了解CPU的地址空间和硬件的对应关系。
第2章 寄存器
CPU主要包括运算器,控制器,寄存器等。这些部件通过CPU的内部总线来连接。其中对于程序员来讲最重要的是对CPU的寄存器的控制。不同CPU寄存器的个数不同寄存器名称
功能 备注
AX 通用寄存器
BX 。。。
CX 。。。
DX 。。。
SI
DI
SP 栈顶偏移地址
BP
IP 指令偏移地址
CS 指令段地址
SS 栈顶段地址
DS 数据段地址
ES
PSW
2.1 通用寄存器
在8086中,所有寄存器都是16位的。可以存放两个字节。AX,BX,CX,DX用来存放一般的数据,被称为通用寄存器。为了兼容以前的系统,每个寄存器都可以分为可以独立使用的8位寄存器来使用。
2.2 字在计算机中的存储
字的高8位在16位寄存器的高8位寄存器中存储,低8位在16位寄存器的低8位寄存器中存储。
2.3 几条汇编指令
通过汇编指令控制CPU进行工作。汇编指令可以用高级语言来描述。
2.4 物理地址
所有内存单元构成的存储空间是一个一维的线性空间,每个内存单元在这个线性空间中都有唯一的地址。这个地址即物理地址。CPU通过地址总线传送的是物理地址。
2.5 16位的CPU
一次性可以处理数据的最大宽度为16位。
2.6 8086CPU给出物理地址的方法
8086CPU地址线宽度为20,而处理能力为16位,所以不能直接给出物理地址。通过CPU给出两个地址值,一个段地址,一个偏移地址。给到加法器,再由加法器计算给到输入输出控制电路,输出到地址总线上。加法器的计算方法为:段地址*16+偏移地址。 2.7 “ 段地址×16+偏移地址=物理地址”的本质含义
16即4位数据宽度,而20-16刚好为4。
2.8 段的概念
段并不是被内存定义好的,而是CPU定义的。段地址必须是16的整数倍。一个段的寻址空间最多为64K。即16根地址线的寻址空间。
2.9 段寄存器
提供给加法器的段地址存储在段寄存器中。段寄存器有4个,CS,DS,SS,ES. 2.10 CS和IP
CS指示存放指令地址的段地址,IP指示存放指令地址的偏移地址。
读取,执行指令过程的工作原理-?
(1) 从CS:IP指向的内存单元读取指令,读取的指令进入指令缓存区。
(2) IP=IP+读取的指令的长度,从而指向下一条指令。
(3) 执行指令,转向步骤1,重复上述步骤。
8086CPU加电或启动复位后,CS:IP中的内容为0Xffff:0000.即内存0XFFFF0,该单元中的指令是8086CPU开机后执行的第一条指令。
2.11 修改CS,IP的指令
CPU中修改寄存器大部分可以通过mov指令来实现,但是修改CS和IP的值不可以。需要用JMP指令来实现。
2.12 代码段
将代码放在一段连续的内存单元中,并让CS:IP执行该段内存的首地址,则称之为代码段。 .实验1 查看CPU和内存,用机器指令和汇编指令编程
1. 预备知识:debug的使用
类别 指令 描述 示例 备注
CPU R 查看
改变 r
r ax
内存 D 查看
查看具体地址 d
d 1000:0
d 1000:0 9 解释:
内存地址
内存中内容
内存中内容的ASC E 改写 e 1000:0 1 2 起始地址 数据/字符 字符要加””
翻译 U 机器->汇编 u 1000:0 将内存地址中机器码对应的汇编显示 执行指令 T 执行一条机器指令 t 执行CS:IP执行的内容
写指令 A 写入一条汇编指令 a 1000:0 mov ax,1 向指定的内存中输入汇编指令
跳转 g 跳转到指定地址 g 000d 修改IP的值
跳出循环 p 自动执行循环,到cx为0 p 跳出循环
? cmd中的debug命令,默认就是十六进制的,不需要加H或0x,加上后会报错。 ?
.实验2 哈哈
第3章 寄存器 (内存访问)
3.1 内存中字的存储
内存中字由两个连续的存储单元来存放,字的高字节放在高地址的内存单元,低字节放在低地址的内存单元。这两个内存单元合起来称为字单元。地址为低字节地址。 3.2 DS和[address]
CPU要访问的内存单元的数据地址,由DS和[„]来决定。DS中存放段地址,[..]中的..为存放的偏移地址。[..]表示一个内存单元。
8086CPU不支持直接将数据的内容通过mov指令传送到DS寄存器,必须通过其他寄存器中转。
例如:mov bx,1000H; mov ds,bx
3.3 字的传送
直接用ax/bx/cx/dx16位寄存器来进行数据的传送。原理同字节传送。 3.4 mov、add、sub指令
add为加指令
sub为减指令
3.5 数据段
在内存中,可以规定一块连续的内存为一个段。我们约定自己定义一段内存来放数据,则这段内存成为数据段。
3.6 栈
是一种具有特殊的访问方式的寄存器区域。遵循后进先出的规则。 3.7 CPU提供的栈机制
8086CPU入栈时,栈顶从高地址向低地址方向增长。
任意时刻,SS:SP指向栈顶元素。
3.8 栈顶超界的问题
8086CPU并没有保障栈越界出界的问题,必须是程序员小心防范。 3.9 push,pop指令
push/pop寄存器/内存单元
3.10 栈段
自定义栈段,让SS:SP指向该栈段即可。
第4章 第一个程序
4.1 一个源程序从写出到执行的过程
编写代码-?编译链接?执行可执行文件
4.2 源程序
汇编语言包含伪指令和汇编指令两种。汇编指令最终被翻译成机器码,伪指令只是帮住编译。
4.3 编辑源程序
程序的编辑。
4.4 编译
输入源文件名,目标名,其他直接忽略,按回车。
4.5 连接
略
4.6 以简化的方式进行编译连接
编译:直接masm c:1;
连接:直接link c:1;
4.7 执行
直接输入exe的文件名。
4.8 谁将可执行文件中的程序装载进入内存并使它运行
DOS中为command。DOS启动时,首先运行初始化程序,然后启动command.com程序。该程序接收命令行的输入,处理输入命令。
程序执行过程的跟踪
4.9 用DEBUG程序运行跟踪程序。
T:单步执行
P:到了int21时需要P
第5章 [BX]和loop指令
5.1 [BX]
bx中存放的数据为偏移地址,段地址存放在ds中。[BX]只对应的物理地址的int bx; bx的值加1.
5.2 Loop指令
格式: loop标号。
算法:先判断CX的值,如果为0,则跳过loop指令,往下执行。否则则跳转到标号所指向的地址。执行指令。
5.3 在debug中跟踪用loop指令实现的循环程序
汇编源程序中,数据不能以字母开头。例如ffffh,要写成0ffffh。 命令g地址 或者p
5.4 debug和汇编编译器masm对指令的不同处理
对于指令mov ax,[2]。编译器认为[2]表示立即数2.但在debug中,表示偏移地址2中的内容。
解决办法:
? 用bx做中转寄存器。(比较麻烦)
? 显示说明[2]为地址。增加表示段地址的寄存器。例如mov ax,ds:[2]. 5.5 loop和 [bx]的联合应用
做8位数据的累加时,需要用16位寄存器来中转。否则会造成数据不匹配或数据越界。 5.6 段前缀
显示的给出段地址所在的寄存器。该方式叫段前缀。
5.7 一段安全的空间
DOS是实模式操作系统。但是没有完全的控制权。我们要往安全的空间里面写内容。这段空间为0:200-0:2ff.
5.8 段前缀的使用
DS只是默认的段前缀寄存器,ES等其他寄存器也可以用来做段地址寄存器。
第6章 包含多个段的程序
6.1 在代码段中使用数据
目的:将数据存储在一组地址连续的内存单元
方法1:用指令一个一个传送,并制定内存地址。问题是,我们不知道哪些地址可用。所以这个方法不行。
方法2:向操作系统申请。我们只需要定义,操作系统在编译,连接时将代码段作为程序的一部分写到可执行文件中。当可执行文件的程序被加载入内存时,这些数据也被加载到内存。即分配相应的存储空间。
dw:定义字型数据。
本文档为【汇编语言入门(整理)】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑,
图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。