第一章 计算机基础
预备知识
冯·诺曼依计算机体系
1.计算机中的数制
(1)十进制、二进制、十六进制:
(2)二进制特点:每位代码非0即1;高位权是低位权的2倍;加减运算法则:逢二进一,借一当二
(3)十六进制特点:每位代码0~9,A ~ F ;高位权是低位权的16倍 ;加减运算法则:逢十六进一,借一当十六
每4位二进制数用1位十六进制数来表示;
(4)BCD码:常用的是8421BCD码,它是用4位二进制数对十进制数的每一位进行编码,这4位二进制码的值就是被编码的一位十进制数的值。BCD码在计算机中的存储分为紧凑型和非紧凑型两种:
紧凑型BCD码: (37)D = 0011,0111B
非紧凑型BCD码: (37)D = 0000,0011B
0000,0111B
2.数制转换
1.二、十六进制数→十进制数
算法:每位的代码和该位的权值相乘,再求累加和
2.二进制数→十六进制数 四位二进制数为一组,每组用等值的十六进制代换 如:(101011.11)B=(10 1011.1100)B=(2B.C)H、
3.十六进制数→二进制数 一位十六进制数用等值的四位二进制数代换 如: (17E.58)16=(0001 0111 1110.0101 1000)2
4.十进制数→二进制数
① 十进制整数→二进制数 算法:除2取整,直到商为零,倒排余数
②十进制数纯小数→二进制数 算法: 小数部分乘2取整数部分,直到乘积的小数部分为0时止,顺排整数部分
③ 十进制带小数 →二进制数 整数、纯小数分别计算,再合并
二、计算机中数据的编码
1.字符的编码——ASCII码
0~9的ASCII码为30H ~ 39H
A~F的ASCII码为41H ~ 46H
回车符的ASCII码为0DH
换行符的ASCII码为0AH
2.码制
- 真值和机器数的概念
真值:一个数的数值。用“+”表示正数,用“-”表示负数。如:+101 -101
机器数:把符号数值化,用0表示“+”,用1表示“-”,这样,连同符号位在一起作为一个数,称为机器数。
字长:包括符号位在内,一个二进制数占有的位数 如:字长n=8的二进制数,除了符号位,数值部分为7位。
- 原码、反码和补码
1.原码:原码表示的有符号数,最高位为符号位,数值位部分就是该数的绝对值。
2.反码:反码表示的有符号数,也是把最高位规定为符号位,但数值部分对于正数是其绝对值,而对于负数则是其绝对值按位取反(即1变0,0变1)。
3.补码:补码表示的有符号数,对于正数来说同原码、反码一样,但负数的数值位部分为其绝对值按位取反后末位加1所得。
结论:
① 机器数比真值数多一个符号位。
② 正数的原、反、补码与真值数相同。
③ 负数原码的数值部分与真值相同;负数反码的数 值部分为真值数按位取反;负数补码的数值部分为真值 数按位取反末位加1。
④ 没有负零的补码,或者说负零的补码与正零的补 码相同。
⑤ 由于补码表示的机器数更适合运算,为此,计算机 系统中负数一律用补码表示。
⑥ 补码机器数的数值范围 设机器数字长为n位,用来表示整数,则n位补码数,其 真值范围为
十进制下会有新的体验:
真值与机器数的转换(设字长n=8)
若已知一个负数的补码,再取一次补,则 {[x]补}补= [x]原
n位字长的有符号数、无符号数的数值范围
设机器数字长=n位,则n位补码(有符号)数,其真值范围为 -2^(n-1) ~+2^(n-1)-1;
无符号数其数值范围为 0 ~ 2^n-1
例:16位二进制数表示的无符号数范围是0~65535
整数补码的加减运算
[x+y]补=[x]补+[y]补
[x-y]补=[x]补 + [ -y]补
条件:
(1) 符号位参加运算
(2) 以2n为模(n为字长)
(3) 当真值满足下列条件时,结果是正确的,否则结果错误
而66+99 = 165, 真值超过127,-66-99 = -165,真值小于-128
∵运算器位数不够,不能表示165和-165 ∴出错。
利用汇编语言知识如何判断溢出错?
如果参与运算的数是无符号数,则判进位标志,进位标志=1,表示溢出错。
如果参与运算的数是有符号数,则判溢出标志, 溢出标志=1,表示溢出错。
1~4代计算机的对比:
代 别 | 年 代 | 使用的元器件 | 使用的软件类型 | 应用领域 |
第1代 | 20世纪40年代中期~50年代末期 | CPU:电子管 内存:磁鼓 | 使用机器语言和汇编语言编写程序 | 科学和工程计算 |
第2代 | 20世纪50年代中、后期~60年代中期 | CPU:晶体管 内存:磁芯 | 使用FORTRAN等高级程序设计语言 | 开始广泛应用于数据处理领域 |
第3代 | 20世纪60年代中期~70年代初期 | CPU:SSI,MSI 内存:SSI,MSI的半导体存储器 | 操作系统、数据库管理系统等开始使用 | 在科学计算、数据处理、工业控制等领域得到广泛应用 |
第4代 | 20世纪70年代中期以来 | CPU:LSI、VLSI 内存:LSI、VLSI的半导体存储器 | 软件开发工具和平台、分布式计算、网络软件等开始广泛使用 | 深入到各行各业,家庭和个人开始使用计算机 |
由32根地址线提供地址码。 注意操作系统位数与微机系统位数关系!
第二章 80X86微处理器
80486内部寄存器分为基本结构寄存器、浮点寄存器、系统级寄存器和调试测试寄存器。应用程序只能访问基本结构寄存器和浮点寄存器。
8个通用寄存器:
AX、BX、CX、DX 共同特点: 既可作为16位寄存器来用又可作为两个8位寄存器(高、低位)来用;
都是用于暂存操作数,或是运算的中间结果或其它一些信息。
指令=操作码+操作数 SP、BP、SI、DI、IP:为寻址存贮单元提供偏移地址。
4个段寄存器:
和偏移地址寄存器一起形成20位存储器物理地址,对存储器中存放的程序、数据、堆栈区域加以区别、寻址。
标志寄存器:
标志寄存器FLAGS又称为程序状态字PSW,为16位寄存器,该寄存器主要有两个作用: 记录CPU运行结果状态标志和提供控制标志。
状态标志:表示前面的操作执行后,算术逻辑部件处在怎样一种状态,这种状态会像某种先决条件一样影响后面的操作。有SF、ZF、PF、CF、AF和OF。
控制标志:每个控制标志都对某一种特定的功能起控制作用。指令系统中有专门的指令用于控制标志的设置和清除。有DF、 IF、 TF。
32位微处理器工作模式
1.实地址模式
特点:
1⃣️加电、复位之后,486自动工作在实模式,系统在DOS管理下
2⃣️在实模式下,486只能访问第一个1M内存(00000H~FFFFFH)
3⃣️存储管理部件对存储器只进行分段管理,没有分页功能,每一逻辑段的最大容量为64K。
4⃣️在实模式下,段寄存器中存放段基址。
2.保护模式
3.虚拟86模式
处理器的保护机制
32位微处理器的地址空间(存储地址空间、I/O地址空间)
1.存储地址空间(物理空间、虚拟空间、线性空间):
物理空间(主存储器的实际空间): 程序的运行空间,即主存空间。有32条地址线,内存最大容量4G。这
4G字节称为物理存储器,每一单元的地址称为物理地址,其地址范围:
0000,0000H~FFFF,FFFFH为物理存储空间。
虚拟空间(虚拟存储器地址空间):编程空间 虚拟存储器是一项硬件和软件结合的技术。 存储管理部件把主存(物理存储器)和辅存(磁盘)看作是一个整体,即虚拟存储器。允许编程空间为246=64T,程序员可在此地址范围内编程,程序可大大超过物理空间。该空间对应的地址称为虚拟地址或逻辑地址。运行时,操作系统从虚拟空间取一部分程序载入物理存储器运行。当程序运行需要调用的程序和要访问的数据不在物理存储器时,操作系统再把那一部分调入物理存储器.……数据的交换极快,程序察觉不到。
2. I/O空间: 486利用低16位地址线访问I/O端口,所以I/O端口最多有2^16=64K,I/O地址空间为0000H~FFFFH。 注意: I/O地址空间不分段
物理地址的形成:
段寄存器和指针寄存器的初值
CS、IP的初值:由操作系统赋值,SS、SP的初值:①由程序员赋值②由操作系统自动赋值
DS/ES/FS/GS的初值:由程序员赋值。BX/SI/DI/BP的初值:由程序员赋值。
第三章 汇编语言指令集
概述
指令的组成:操作码 + 操作数
操作码 —— 告诉计算机要执行的操作是什么,如:加、减、逻辑与等。
操作数 —— 执行操作过程所要操作的数,如加运算的两个加数。
指令长度 80X86指令长度(机器指令长度)为1~16字节 规定:多字节指令占用连续的内存单元,存放指令第
一字节的内存单元地址,称为“指令地址”
符号指令:
标号: | 操作码助记符 | 空格 | 操作数助记符 | ;注释 |
状态标志寄存器:
有符号数运算,判O标志,O标志为1,有溢出
无符号数加/减,判C标志,C标志为1,有溢出
寻址方式
3类共计7种寻址方式
1.立即寻址方式:获得立即数
立即数书写规定: 立即数以数字开头,以A~F开头的16进制数,必须前缀0。
立即数的数制用后缀表示,B表示二进制数,H表示十六进制数,D或 缺省为十进制数,单引号括起来的
字符编译成相应的ASCII码 。
可以用+ – * / 组成立即数表达式 。
各种合法的立即数经汇编后,一律自动转换成等值的二进制数,负数用补码表示。
2.寄存器寻址方式:获得寄存器操作数
3.存储器寻址方式:获得内存操作数(存储器操作数)
• 直接地址 —— 包含在指令中的16位地址偏移量。
• 间接地址—— 由CPU内部某个16位寄存器的内容决定,如 BX、BP、SI、DI。
间址寄存器 | 约定访问的逻辑段 |
|
BP | 堆栈段SS |
16位寻址方式 |
BX,SI,DI | 数据段DS | |
EBP,ESP | 堆栈段 |
32位寻址方式 |
EAX~EDX,ESI,EDI | 数据段 |
注:MOV AL , DS:[BX] 等价于: MOV AL , [BX]
由于BX间址,约定访问的是数据段, ∴“DS:”可省
• 基址—— 基址寄存器BX或BP加上指令中包含的8位或16位位移量。
① 基址寻址的地址表达式: 段寄存器:[基址寄存器+位移量]
物理地址=段寄存器内容×16+基址寄存器+位移量
② 访问约定的逻辑段,简化的地址表达式: [基址寄存器+位移量]
物理地址=约定的段寄存器内容×16+基址寄存器+位移量
基址寄存器 | 约定访问的逻辑段 |
|
BP | 堆栈段 |
16位寻址方式 |
BX | 数据段 | |
EBP, ESP | 堆栈段 |
32位寻址方式 |
EAX~EDX, ESI, EDI | 数据段 |
• 变址—— 变址寄存器SI或DI加上指令中包含的8位或16位位移量。
有比例因子的变址寻址其地址表达式为 段寄存器:[比例因子×变址寄存器+位移量]
物理地址=段寄存器×16+比例因子×变址寄存器+位移量
没有比例因子的变址寻址其地址表达式为: 段寄存器:[变址寄存器+位移量]
访问约定的逻辑段可简化为 : [变址寄存器+位移量]
物理地址=约定的段寄存器×16+变址寄存器+位移量
变址寄存器 | 约定访问的逻辑段 | 适用于…… |
SI, DI | 数据段 | 无比例因子,16位 寻址 |
EBP | 堆栈段 | 有比例因子,32位 寻址 |
EAX~EDX, ESI, EDI | 数据段 |
• 基址加变址—— 由一个基址寄存器BX或BP加上一个变址寄存器SI或DI,再加上指令中包含的8位或16位位移量。
有比例因子的基址加变址的地址表达式为: 段寄存器:[基址寄存器+比例因子*变址寄存器+位移量]
访问约定逻辑段其地址表达式简化为: [基址寄存器+比例因子*变址寄存器+位移量]
无比例因子基址加变址 地址表达式: 段寄存器:[基址寄存器+变址寄存器+位移量]
访问约定逻辑段: [基址寄存器+变址寄存器+位移量]
基址加变址寻址是基址寻址和变址寻址的组合,要求:
基址寄存器和变址寄存器都是16位或都是32位,否则(16位寻址和32位寻址混合使用)是非法指令
默认的段寄存器不一致,这样的组合虽然是合法,但容易出错
在不使用段超越前缀的情况下,规定:如果偏移地址中含有BP,则其缺省的段寄存器为SS;否则,其缺省的段寄存器为DS。
在实模式下,一个逻辑段的体积最大为64K,存储单元的偏移地址为16位,不可能超过FFFFH,∴在实模式下运行的程序通常采用16位寻址。
汇编语言语法
汇编语言源程序包括的语句类型为:指令性语句和指示性语句。
指令性语句即为通常所说的符号指令。
标号: | 操作码助记符 | 空格 | 操作数助记符(多个操作数之间用,隔开) | ;注释 |
NEXT: ADD AX, BX ;AX+BX → AX
INC SI ;SI+1 → SI
指示性语句包括伪指令和宏指令。
变量 | 伪指令助记符 | 空格 | 操作数项(多个操作数之间用,隔开) | ;注释 |
常用的伪指令
字节字义伪指令 变量名 DB 一个或多个用逗号间隔的单字节数
字定义伪指令 变量名 DW 一个或多个用逗号间隔的双字节数
双字定义伪指令 变量名 DD 一串用逗号间隔的4字节数
等值伪指令 符号常数 EQU 表达式 如: NUM EQU 33 功能: 定义符号常数NUM的值为33
等号伪指令 符号常数 = 表达式 如: NUM = 33 功能:定义符号常数NUM的值为33
用EQU定义的符号常数,其值在后继语句中不能更改 ;用“=”定义的符号常数,其值在后继语句中可以重新定义
算术运算符
1. 算术运算符: +, -, *, /
2. 关系运算符: EQ(等于), NE(不等于), GT(大于),LT(小于), GE(大于或等于)
3.$运算符 汇编程序对源程序是逐行汇编的,$运算符可以返回 汇编计数器的当前值。
运算符紧跟在 DB、DW、DD伪指令之后,统计字符串的长度。
4. SEG运算符 格式: SEG 段名或变量名或标号名 功能: 计算某一逻辑段的段基址
5.OFFSET运算符 格式:OFFSET 变量名或标号名 功能:算出逻辑段中某个变量或标号名所在单元相对于段首的偏移地址。
6. PTR运算符 格式: 类型说明符 PTR 地址表达式 功能: 在本条指令中临时修改地址表达式的属性
PTR运算符使用规则
(1) 指令的操作数至少有一个类型属性要确定,否则必须用PTR运算符说明其中的内存操作数的类型
(2)若两个操作数的类型属性都确定,则必须保持一致。否则必须用PTR运算符改变其中的内存操作数的类型,以保持前后属性一致。
具体应用方法: 在满足下面列出的五个条件(双操作数指令三个,单操作数 指令两个)之一时,必须按照对应要求使用PTR 运算符。否 则不需要使用PTR运算符。
• 在双操作数指令中(例如:MOV,ADD,SUB等指令)
(1) 源操作数为立即数,目标操作数为(变量名)直接寻址的存储器操作数,当二者类型属性不一致时,后者必须用PTR临时修改其属性,使源目类型属性一致。
(2) 源操作数为立即数,目标操作数为间址、变址、基址或基址加变址寻址的存储器操作数,无论两者类型属性是否已经一致,后者都必须用PTR显式说明其类型属性,使得源目操作数类型属性一致。
(3) 源操作数和目标操作数中一方为寄存器操作数,另一方为直接寻址的存储器操作数,但二者类型属性不一致,必须用PTR临时修改其中的存储器操作数的属性。
•在单操作数指令中(例如:INC,DEC等指令)
(1) 操作数为间址、变址、基址或基址加变址寻址的存储器操作数,必须用PTR说明是字节操作、字操作、还是双字操作,具体根据使用该条指令操作的意图。
(2) 操作数是直接寻址方式的存储器操作数,是否使用PTR要看操作数的类型属性要求是否与指令规定的操作数的类型属性一致(例如: PUSH指令)或者依据使用该条指令的操作意图。
7. 方括号运算符 用方括号括起来的地址表达式是访问内存操作数常用的寻址方式,方括号的另一用途是标注数组元素的下标,下标从0开始。
汇编语言基本指令集
应注意以下三个问题:
(1)指令的书写格式,助记符以及指令的功能。
(2)指令中允许的合法的操作数,以及这些操作数的寻址方式。
(3)指令执行对标志位,特别是对六个状态标志(A、C、 O、P、S、Z)是否产生影响。
N 代表立即数,N8、N16、N32代表8、16、32位立即数
R 代表寄存器操作数,R8、R16、R32代表8、16、32位寄存器操作数
M 代表内存操作数,M8、M16、M32代表8、16、32位内存操作数
S 代表段寄存器
总说明:
1. 对于双操作数指令(如:MOV,ADD,CMP……)
源、目操作数不可同为内存操作数
源、目操作数属性一致(长度相同)
当目标操作数为间址、变址、基址、基+变址的内存操作数,而源操作数为单字节/双字节立即数,则目标操作数必须用PTR说明类型
2. 对于单操作数指令(如:I NC,DEC……)
若操作数为间、变、基、基+变的内存操作数,则必须用PTR说明类型
第一类、 传送类指令(本类指令执行后,不影响状态标志)
第二类、 算术运算指令
分类 | 名称 | 格式 | 功能 | O S Z A P C |
加法指令 | 加法指令 | ADD DST,SRC | 加法(字、字节) | O S Z A P C |
带进位加法指令 | ADC DST,SRC | 带进位加法(字、字节) | O S Z A P C | |
加 1 指令 | INC OPRD | 加 1(字、字节) | O S Z A P | |
减法指令 | 减法指令 | SUB DST,SRC | 减法(字、字节) | O S Z A P C |
带借位减法指令 | SBB DST,SRC | 带借位减法(字、字节) | O S Z A P C | |
减 1 指令 | DEC OPRD | 减 1(字、字节) | O S Z A P | |
比较指令 | CMP DST,SRC | 比较(字、字节) | O S Z A P C | |
求补指令 | NEG OPRD | 求负真值的补码 | O S Z A P C | |
乘法指令 | 无符号数乘法 | MUL SRC | 不带符号数乘法(字,字节) | O C |
带符号数乘法 | IMUL SRC | 带符号数乘法(字,字节) | O C | |
除法指令 | 无符号数除法 | DIV SRC | 不带符号数除法(字,字节) | 没有定义 |
带符号数乘法 | IDIV SRC | 带符号数除法(字,字节) | 没有定义 | |
符号扩展指令 | CBW | 扩展AL中的符号 | 不影响 | |
符号扩展指令 | CWD | 扩展AX中的符号 | 不影响 | |
|
|
|
|
第三类、 转移和调用指令
第四类、逻辑运算指令
第五类、串操作指令
第四章 汇编语言程序设计
1.汇编语言程序结构
2.汇编语言的编程格式
3.DOS功能调用
4.BIOS功能调用
5.分支和循环程序设计
6.子程序设计
7.宏指令程序设计
如果宏体中有分支、循环,必然有标号,两次以上调用这样的宏指令必然出现标号重复定义的错误。
8.代码转换实例
字符串处理