汇编语言
王爽
目录
汇编语言... 1
王爽... 1
第一章:基础知识
第二章:寄存器
第三章 寄存器(内存访问)
第四章 第一个程序
第六章 包含多个段的程序
第七章 更灵活定位内存的方法
第八章 数据处理的两个基本问题
第一章:基础知识
汇编语言:汇编语言是什么?为什么学习汇编语言?学习汇编语言是学习什么?
早起使用机器语言,但机器语言 晦涩难懂也难以使用,所以出现了汇编语言。即用通熟易懂的汇编指令替代全是二进制0和1的机器指令。
于是也就出现了编译器,即把汇编指令翻译成机器指令。
机器指令和汇编指令都不能脱离具体的硬件设计和内部结构,没有可移植性故而又产生了高级语言。
汇编语言发展至今,由一下3类指令组成。
1、 汇编指令:即机器码的助记符,有对应的机器码
2、 伪指令: 没有对应的机器码,有编译器执行,计算机并不执行
3、 其他符号:如:+ 、- 、*、%等有编译器识别,没有对应的机器码
汇编语言的核心即汇编指令,它也决定了汇编语言的特性
何为CPU 即 指令和数据的处理!
指令和数据存储的地方 即内存
CPU来完成具体指令和数据的动作,那么存取就要和内存交互
1、 存储单元的地址(地址信息)
2、 器件的选择、读或写的命令 (控制信息)
3、 读或写的数据(数据信息)
地址总线: 决定寻址能力
数据总线:决定一次传输的数据位数
控制总线:决定了CPU对外部器件提供了多少种控制 即CPU对外部器件的控制能力
一句话:CPU为具体外部器件分配对应内存地址空间并通过各种控制器(接口卡)对其进行控制。
8086地址总线宽度为20,(0~220)即内存地址空间为1MB
80386地址总线款第为32, (0~232)内存地址空间为4GB
大B 小 b ,默认一个内存空间大小为1BYTE = 8bit 即字节和位的区别
为什么一个内存单元是8位? 看计算机组成原理吧
第二章:寄存器
一个典型的CPU由运算器 寄存器 和控制器组成;运算器进行运算,寄存器负责存储,控制器控制各个器件进行工作;内部总线负责连接各个器件在他们之间传递数据。
对于一个程序员来讲,CPU主要器件是寄存器,我们通过改变各种寄存器中的内容来现实对CPU的控制。
8086CPU有14个寄存器:AX BX CX DX
CS DS SS ES
SI DI SP BP IP PSW
CPU如何寻址内存?
20位地址线 16位宽寄存器
8086采用 物理地址 = 段地址X16 + 偏移地址 的方式
由地址加法器完成
“段地址X 16 + 偏移地址 = 物理地址” 的本质含义是: CPU在访问内存时 用一个基础地址(段地址X16)和一个相对于基础地址的偏移地址相加 给出内存单元的物理地址
注意: 分不分段 段的大小 代码段 数据段 堆栈段 。。。和内存绝无关系 内存只是内存
一切只是CPU如何根据我们的安排操作而已
段地址自然由四个段寄存器提供 CS DS ES SS
CS 和IP
CS为代码段寄存器 IP 为指令指针寄存器 CS:IP 指向的内容当作当前指令执行
CS:IP指令段寄存器
MOV 传送指令
JMP 转移指令 能够修改CS IP内容的指令被统称为转移指令
jmp 段地址:偏移地址
Jmp 某一合法寄存器 : 用寄存器中的值修改IP
Jmp 2AE3:3 执行后: CS=2AE3H IP=0003H
Jmp ax, 执行前: ax=1000H CS=2000H IP=0003H
执行后: ax=1000H CS=2000H IP=1000H
第二章从CPU如何执行指令的角度讲解了8086CPU的逻辑结构、形成物理地址的方法、相关的寄存器以及一些指令。
关于DEBUG实验
1、R 查看 改变寄存器内容 -r, r ax
2、D 查看 内存中内容 d 1000:0 (指定地址开始的128个内存单元)
使用d之后 可以继续d
d 1000:0 10
3、E 修改内存的内容 e 1000:0 0 1 2 3 4 5 6 7 8 9
4、U 查看机器码对应汇编指令
5、T 执行一条或多条指令
6、A 以汇编指令形式在内存中写入机器码
实验一:
查看、修改CPU中寄存器的内容: R指令
查看内存中的内容: D 命令
修改内存中的内容: E 命令(可以写入数据、指令,在内存中他们实际没有区别)
将内存中的内容解释为机器指令和对应的汇编指令:U命令
执行CS:IP指向的内存单元处的指令: T 指令
以汇编形式向内存中写入指令: A指令
第三章 寄存器(内存访问)
字节单元
字单元
DS和[address]
DS 通常用来存放要访问数据的段地址
Mov bx,1000H
Mov ds,bx
Mov al,[0]
[…] 表示一个内存单元 数据表示内存单元的偏移地址 自动取DS为段地址
思考: 写几条指令 ,将al 数据传送到内存单元10000H处
即: Mov al,[0] mov [0],al
MOV 内存单元地址,寄存器名
目前为止:
MOV 寄存器,数据
MOV 寄存器,寄存器
MOV 寄存器,内存单元---MOV 段寄存器,内存单元
MOV 内存单元,寄存器---MOV 内存单元,段寄存器
MOV 段寄存器,寄存器—MOV 寄存器,段寄存器
第三章从内存访问角度学习寄存器
字单元 N地址字单元
8086CPU 不支持将数据直接送入段寄存器的操作 只好用一个寄存器中转
这属于硬件设计的问题,不必深究
Mov bx,1000H
Mov ds,bx
栈
栈 是一种具有特殊的访问方式的存储空间,其特殊性在于,最后进入这个空间的数据最先出去。
LIFO Last In First Out 后进先出
入栈 出栈
CPU提供栈机制
于是我们可以把一段内存当作栈来使用
最基本的两个指令即 PUSH(入栈) POP(出栈)
相应的 提供两个寄存器 段寄存器SS 和 寄存器SP
栈顶的段地址放在SS中 任意时刻,SS:SP指向栈顶元素
PUSH 和POP 是 CPU从SS:SP中得到栈顶的地址
入栈时 栈顶从高地址到底地址方向增长
SS:SP指向栈空间最高地址单元的下一个单元
CPU对栈的操作是否越界不负责任
Push 寄存器
Pop 寄存器
栈也是内存一部分
自然有
PUPSH 内存单元
POP内存单元
PUSH 段寄存器
POP 段寄存器
改变SP后 写入内存
读内存后 改变SP
[1]
第四章 第一个程序
1、 编辑 预处理 编译 链接 执行(载入内存)
伪指令格式:
XXX segment
XXX ends
end 汇编程序的结束标记
assume “假设” 某些情况下可以将段寄存器和某一段关联
DOS程序加载过程
学习汇编的目的就是通过汇编语言进行编程而深入理解计算机底层的基本工作机理,进而随心所欲的控制计算机。
第五章 [bx] 和loop
1、[bx] 和[0]类似 段地址也都在ds中
2、loop 循环
3、定义描述性符号”()”
(ax) 表示ax中的内容
4、 约定idata 表示常量
@来个[bx] 有啥意思呢???
Loop指令执行过程
1、(cx)=(cx)-1
2、判断cx值 不为0则转至标号处执行,为0 向下执行
考虑这样一个问题: 计算ffff:0006单元中的数乘以3,结果存到dx中.
Debug 和masm 处理mov a1,[0]方式不同
段前缀
第六章 包含多个段的程序
第七章 更灵活定位内存的方法
第八章 数据处理的两个基本问题
第九章 转移指令的原理
段内转移
段间转移
短转移
近转移
[1]