第1章 汇编语言基础知识
(一)汇编语言设计概述
1.(机器)指令与程序
-
指令=操作码(做什么)+操作数(针对谁操作)
-
程序=指令序列
2.程序设计语言
(1)机器语言(二进制)
(2)汇编语言(从内存单元的地址访问)(经过寄存器、CPU)(汇编指令与机器指令一对一)
(3)高级语言(不经过寄存器、CPU)
- 面向过程
- 面向用计算机求解问题的过程,不依赖具体机器,如BASIC,PASCAL,C,FORTRAN,COBOL等
- 面向对象
- 面向求解问题本身,如C++,Smalltalk,面向对象的PASCAL等
举例
机器:01001001 00001100 00000010
汇编:ADD AX, 2 INC AX
高级:x = 4 + 2 x++
3.汇编语言的特点
- 与处理器密切相关
- 程序效率高
- 比编写高级源程序烦琐
- 比调试高级语言程序困难
4.汇编语言主要应用场合
-
执行时间短或占用存储量少
-
程序直接控制硬件
-
需提高大型软件性能
-
无合适的高级语言
5.流程图
举例:在BUF开始的三个内存单元中,放有无符号数X、Y、Z,将它们按递增顺序放到RES开始的三个单元中(RES代表内存单元的地址)
6.汇编语言程序设计基本步骤
- 问题定义
- 建数学模型
- 确定解决数学模型的算法
- 画流程图
- 编程序
- 上机调试
- 试运行
7.汇编程序编程质量标准
程序的
-
正确性
-
完整性
-
易读性
-
执行时间和效率
-
占用内存的大小
(二)数据表示方法
1.数与数制
(1)数码:数的符号,例如二进制是0、1
(2)基:数码的个数,例如二进制是2
(3)权值:每一位的值,例如二进制是 2 n ( n = 0 , 1 , 2 … … ) 2^n(n=0, 1, 2……) 2n(n=0,1,2……)
(4)数制:如二进制(B)、十进制(D)、八进制(Q)、十六进制(H)
2.数制转换
(1)非十进制——>十进制
(按权展开)
-
二进制 → \rightarrow →十进制: 101 B = 1 × 2 2 + 0 × 2 1 + 1 × 2 0 = 5 D 101B=1\times2^{2}+0\times2^{1}+1\times2^{0}=5D 101B=1×22+0×21+1×20=5D
-
八进制 → \rightarrow →十进制: 123 Q = 1 × 8 2 + 2 × 8 1 + 3 × 8 0 = 73 D 123Q=1\times8^2+2\times8^1+3\times8^0=73D 123Q=1×82+2×81+3×80=73D
-
十六进制 → \rightarrow →十进制: 345 H = 3 × 1 6 2 + 4 × 1 6 1 + 5 × 1 6 0 = 325 D 345H=3\times16^2+4\times16^1+5\times16^0=325D 345H=3×162+4×161+5×160=325D
(2)十进制——>非十进制
-
整数部分
-
一般求法
- 连续除以基,记录每次的余数,直到商为0,最后一个余数作最高位
-
按权展开
- 十进制 → \rightarrow →二进制: 5 D = 4 + 1 = 1 × 2 2 + 0 × 2 1 + 1 × 2 0 = 101 B 5D=4+1=1\times2^{2}+0\times2^{1}+1\times2^{0}=101B 5D=4+1=1×22+0×21+1×20=101B
-
-
小数部分
-
一般求法
- 连续乘以基,记录每次的整数部分,直到小数部分为0,第一个整数部分作最高位
-
按权展开
- 十进制 → \rightarrow →二进制: 0.525 D = 0.5 + 0.125 = 1 × 2 − 1 + 0 × 2 − 2 + 1 × 2 − 3 = 0.101 B 0.525D=0.5+0.125=1\times2^{-1}+0\times2^{-2}+1\times2^{-3}=0.101B 0.525D=0.5+0.125=1×2−1+0×2−2+1×2−3=0.101B
-
(3)二进制<——>八进制
-
二进制 → \rightarrow →八进制
- 从右向左,每3个一组(不足在左边补0)
-
八进制 → \rightarrow →二进制
- 用3位二进制数代替一个八进制数
(4)二进制<——>十六进制
-
二进制 → \rightarrow →十六进制
- 从右向左,每4个一组(不足在左边补0)
-
十六进制 → \rightarrow →二进制
- 用4位二进制数代替一个十六进制数
3.计算机中的数据表示
(1)原码、反码、补码
-
正数
- 原码、反码、补码相同
-
负数
-
反码符号位为1,其余各位对原码取反
-
补码符号位为1,其余各位对原码取反后再对整个数加1
-
-
补码产生的原因
-
原码和反码的0有两种表示,00000000和10000000
-
补码的0只有一种表示,00000000(100000000最高位的1溢出)
-
以八位数为例(允许溢出) [ − 1 ] 补 = [ 256 − 1 ] 补 = [ 11111111 ] 补 [-1]_补=[256-1]_补=[11111111]_补 [−1]补=[256−1]补=[11111111]补,这种情况下,补码11111111对应两个数即-1和255,会产生歧义,因此八位的补码的表示范围为-128~127
-
(2)BCD码
-
定义
- 二进制编码的十进制
-
分类
-
压缩BCD码和非压缩BCD码
-
例如
-
31的压缩BCD码为:0011 0001
-
31的非压缩BCD码为:0000 0011 0000 0001
-
-
-
BCD码的运算结果尽量用十六进制表示,原因是BCD码的运算可能会出错
(3)ASCII码
-
编码
-
用7位二进制数表示,第8位为0
-
共表示128个字符
-
A:41h,a:61h,0:30H
-
4.基本数据类型
- 字节
- 8个位,高4位称高半字节,低4位称低半字节
- 字
- 2个字节,低8位称低字节,高8位称高字节
- 双字
- 2个字,低16位称低字节,高16位称高字节
- 四字
- 4个字,低32位称低字节,高32位称高字节
- 十字节
- 10个字节
- 字符串
- 由字符构成的一个线性数组
- 例如:063Eh(06为高字节,3E为低字节)
(三)8086微处理器
1.8086的功能结构及寄存器
2.8086的存储器组织
(1)数据的存储格式
①每个存储单元的内容为1字节,字或双字占相邻的2个或4个存储单元,存放时低字节放低地址,高字节放高地址,字或双字用低地址表示(小端方式)
②同一个地址可以看作字节单元、字单元、双字单元的地址
2号“字节”单元的内容为[0002H]=34H
2号“字”单元的内容为[0002H]=1234H
2号“双字”单元的内容为[0002H]=78351234H
-
若X单元的内容为Y,则X单元的内容可表示为[X]=Y
-
若X单元的内容Y也为地址,则Y单元的内容可表示为[Y]=[[X]]
③字节单元的地址可以是偶数,也可以是奇数。字单元常放在偶地址(能被2整除),双字单元常放在模4地址(能被4整除)(地址对齐)
(2)存储器的分段管理
-
8086的存储器是16位的,可以存储 0000 H − F F F F H 0000H-FFFFH 0000H−FFFFH的地址,容量为 2 16 = 64 K B 2^{16}=64KB 216=64KB;
-
8086的地址线是20位的,可以存储 00000 H − F F F F F H 00000H-FFFFFH 00000H−FFFFFH的地址,容量为 2 20 = 1 M B 2^{20}=1MB 220=1MB;
-
8086CPU将1MB的存储空间分成许多逻辑段,每个段最大为64KB,于是每个存储单元可以用“段基地址:段内偏移地址”表达其准确的物理位:
-
①段基地址(段地址)——说明逻辑段在主存中的起始位置,段地址放在模16地址,即xxx0H(段地址后4位一定为0)
-
②段内偏移地址(偏移地址)——说明主存单元距起始位置的偏移量
-
-
逻辑地址的形式为“段地址:偏移地址”,将逻辑地址中的段地址左移4位(2进制左移4位相当于16进制左移1位),加上偏移地址得到20位物理地址,同一个物理地址可以有多个逻辑地址
-
段加偏移的优点
-
①允许程序在存储器内重定位
-
②允许在保护模式下运行实模式下编写的地址
-
(3)段寄存器的作用
段 | 用途 |
---|---|
代码段 | 用来存放程序的指令序列。CS存段地址,IP存偏移地址,处理器用CS:IP取下一条要操作的指令 |
堆栈段 | 确定堆栈所在的主存区域。SS存段地址,SP存偏移地址,处理器用SS:SP操作堆栈中的数据 |
数据段 | 存放当前程序所用的数据。DS存段地址,EA存偏移地址,有效地址EA由各种主存寻址方式得到 |
附加段 | 附加的数据段,也用于数据的保存。ES存段地址 |
(六)8086的寻址方式
1.寻址方式
-
定义:寻找指令中操作数的方式或寻找指令转移目标地址的方式
-
分类:数据寻址方式、程序寻址方式
-
格式:
操作码 操作数1, 操作数2 ;注释
-
操作数2:源操作数SRC,表示参与指令操作的一个对象
-
操作数1:目的操作数DEST,可作为指令操作的对象或存放指令操作的结果
-
-
操作数的符号表示
操作数 | 表示 |
---|---|
R8 | AH/AL/BH/BL/CH/CL/DH/DL |
R16 | AX/BX/CX/DX |
REG | R8或R16 |
SEG | CS/DS/SS/ES |
M8 | 一个8位存储器操作单元 |
M16 | 一个16位存储器操作单元 |
MEM | M8或M16 |
I8 | 一个8位立即数 |
I16 | 一个16位立即数 |
IMM | I8或I16 |
DEST | 目的操作数 |
SRC | 源操作数 |
2.数据寻址方式
MOV指令
格式:MOV DEST, SRC
功能:源操作数的内容传送到目标操作数,目标操作数中的内容不变
定义 | 举例 | ||
---|---|---|---|
立即数寻址方式 | 操作数为立即数IMM | MOV AL,05H 功能:将8位立即数05H送至AL寄存器;MOV AX, 0102H 功能:将16位立即数0102H送至AX寄存器,01H存放在AH,02H存放在AL | |
寄存器寻址方式 | 操作数为寄存器REG/SEG | MOV BX, AX 功能:将AX寄存器的内容送至BX寄存器 | |
存储器寻址方式 | 直接寻址方式 | 操作数为[EA] | MOV AX, [2000H] 功能:将DS:[2000H](默认为DS,否则要用段超越前缀)的内容送至AX;MOV AX, ES:[2000H] 功能:将ES:[2000H]的内容送至AX; |
寄存器间接寻址方式 | 操作数为[EA],EA=BX/SI/DI | MOV AX, [SI] 功能:将DS:[SI](默认为DS,否则要用段超越前缀)的内容送至AX; | |
基址变址寻址 | 操作数为[EA],EA=BX/BP/SI/DI+8/16位偏移量(若EA超过FFFFH,则取64K的模) | MOV AX, [DI+06H] 功能:将DS:[DI+06H](DI默认为DS,否则要用段超越前缀)的内容送至AX;MOV AX, [BP+06H] 功能:将SS:[BP+06H](BP默认为SS,否则要用段超越前缀)的内容送至AX;MOV AX, [BP] 功能:等同于MOV AX, [BP+0H] | |
寄存器相对寻址 | 操作数为[EA],EA=BX/BP+SI/DI(若EA超过FFFFH,则取64K的模) | MOV AX, [BX+SI] 功能:将DS:[BX+SI](BX默认为DS,否则要用段超越前缀)的内容送至AX;MOV AX, [BP+DI] 功能:将SS:[BP+DI](BP默认为SS,否则要用段超越前缀)的内容送至AX; | |
相对基址变址寻址 | 操作数为[EA],EA=BX/BP+SI/DI+8/16位偏移量(若EA超过FFFFH,则取64K的模) | MOV AX, [BX+SI+06H] 功能:将DS:[BX+SI+06H](BX默认为DS,否则要用段超越前缀)的内容送至AX;MOV AX, [BP+DI+06H] 功能:将SS:[BP+DI+06H](BP默认为SS,否则要用段超越前缀)的内容送至AX; |
注意
①偏移量可以用符号表示,该符号为事先定义好的变量或常量,作为偏移量的时候就是一个数值
②同一个寻址方式可以有不同的形式
MOV AX, [BX][SI]等价于MOV AX, [BX+SI]
MOV AX, count[SI]等价于MOV AX, [SI+count]
MOV AX, wnum[BX][SI]等价于MOV AX, wnum[BX+SI]或MOV AX, [BX+SI+wnum]
3.程序寻址方式
- 用途:确定转移指令和子程序调用指令的转向地址
- 分类:直接、相对、间接
(BP默认为SS,否则要用段超越前缀)的内容送至AX; |
注意
①偏移量可以用符号表示,该符号为事先定义好的变量或常量,作为偏移量的时候就是一个数值
②同一个寻址方式可以有不同的形式
MOV AX, [BX][SI]等价于MOV AX, [BX+SI]
MOV AX, count[SI]等价于MOV AX, [SI+count]
MOV AX, wnum[BX][SI]等价于MOV AX, wnum[BX+SI]或MOV AX, [BX+SI+wnum]
3.程序寻址方式
- 用途:确定转移指令和子程序调用指令的转向地址
- 分类:直接、相对、间接