文章目录
一、数值信息
编码
- 编码是指将多种形式转换成一种特定形式(高低电平去表示图像、数字、音频等)
- BCD:以4位二进制数表示一位十进制数,再拼凑起来表示十进制数。
- 一个存储单元常有8个二进制码、相当于2个BCD
- ASCLL:有效位只有7位,一位符号位。校验:约定8位ASCLL中的1的个数是奇/偶,若符合,则去掉符号位的ASCLL为传输的字符。
- 位、比特、字节
- 带宽即位、即比特。1B(Byte)=8b
- 1K=1024b;1KB=1024*8b 例:16位的寄存器:(2^16)/1024=64K
数
- 无符号数:
- 首位也算在所表示的真值中。每当乘或除2时,二进制整体向左/右移动一位。
- 溢出判断:最高位有向下一位的进位时,溢出到标志寄存器中。
- 有符号数:
- 原码:第一位符号位,其余数值位。但0的表示不唯一,不用。
- 反码:当原码表示复数时,原码符号位不变,其余取反。0不唯一,不用。
- 补码:正数时,原码=反码=补码;复数时,补码=反码+1。0唯一,计算机使用。(补码使减法等效于加法于移位的操作,省钱省空间。X-Y=[X+(-Y)]补=[X]补+[-Y]补)(特殊:补码10000000表示-128);补码表示负数时,想求其真值可通过再求补码的方式,而不是通过-1取反。
- 溢出:次高位进位
异或
最高位进位,为1即溢出。
逻辑运算
-
与算术运算的区别:逻辑运算不产生进位
-
与
-
或
-
异或 相同为0相异为1
-
同或 是对异或进行一个非运算
二、微型机基本原理
构成
-
CPU
- 运算器、寄存器(如5+4+3=9+3,9先放在CPU中)、控制器
-
存储器
- 分为内存储器(内存条)和外存储器(U盘-脱机外存、固态/机械硬盘-联机外存)
- 存储方式:RAM随机存储器(需要后备电源-大部分电脑的内存都是);ROM只读存储器(不需-U盘)
-
I/O接口
- 作用:1.协调CPU的高速与外设的低速(数据缓存)。2.作为不同信号的翻译。
-
总线
- what:是导线与控制、驱动电路的集合。
- why:信息的总类主要有三:地址、数据、控制。因此总线也有不同的传输单元。
工作过程
- 指令需要放在内存中(于CPU直接相连)
- 指令执行:CPU取指令-CPU分析指令-CPU取数据-CPU执行指令-CPU送回数据(取数据和送回不一定发生)(分为顺序于并行执行)
- 并行在于高效地利用了总线(分析指令时,让总线去取下一条指令-总线忙碌)
- 冯·诺依曼机:加入了程序计数器PC,用于存储内存中指令所在的地址,每次传给地址寄存器AR后,PC自动加一。之后总线把地址由AR传给内存,并将其地址译码。CPU发出读命令。由数据总线取出指令操作码传至数据寄存器DR-指令寄存器IR-指令译码器IL (顺序存储)
8088/8086
- 区别:主要体现在外部的数据总线的宽度,前者有8位,8086有16位
-
结构
- 为什么可以并行?因为BIU中指令队列缓存器与(?)实现的指令与数据预取加之现在软件对转移、循环指令的处理使得流水线“不断流”。
- 为什么可以存储分段?好处?
- 支持协处理器。Q:什么是协处理器?
-
工作模式
- 最小模式/最大模式:1.切换方式:MN/MX引脚;2.区别:否/是使用协处理器。
-
引脚
- 地址位有16位,
AD0~AD7
位地址和数据的分时复用线(地址先、数据后)。A8~A15
为8位的地址线。A16~A19
分时复用地传输地址与#状态信号(看ALE)。 - 引脚的
上划线
与#
表示低电平(0)有效 - #DEN数据允许信号,IO/#M,区分接口/存储器访问
- #WR读,#RD写,不可同时为1。针对储存器或IO
- DT/#R是CPU的写/读
- ALE地址锁存信号,1时表示已经取到地址,准备去取数据
- 总线保持信号:
- 中断信号:
- 地址位有16位,
-
寄存器
- 通用寄存器:用于暂时存储运算的数据
- 都是16位的,可以拆分成两个8位,但只有16位可以存地址,因为8088是16位的,它最小的地址也是16位的
- AX累加器:AH、AL
- BX基地址寄存器
- CX计数寄存器
- DX数据寄存器:存I/O地址或存16位数据。
- 标志寄存器FLAGS:反应运算结果与特征
- CF、PF、AF、ZF、SF、OF、DF、IF、TF
- 段寄存器:用于存放段地址
- 类型:CS-代码段寄存器、DS数据、ES附加、SS堆栈~
- 同一个内存单元可以分属于多个段(分时复用;储存时用的是逻辑内存-会浮动)
- 20位逻辑段表示 eg:
- 通用寄存器:用于暂时存储运算的数据
- 堆栈段:栈底→栈顶(指针SP)→栈首/段首;SS的值是栈首地址,栈顶是偏移地址;从下向上存入。
- 扩充内存
- 如何让16位带宽的处理器管理1M的地址?(1M需要20位)
- 每单元运用
16位段(基)地址+16位段内地址
可以获得32位的存储空间(利用分时复用)。 - 如何压缩?每单元用
前段基地址*16(二进制右移4位)+偏移地址
表示,即段前16+4=20位,对齐相加也20位
- 每单元运用
- 如何让16位带宽的处理器管理1M的地址?(1M需要20位)
-
总线
- 应用多总线通道的原因
- 单通道使得接口与内存共用一条到CPU的通道,会造成等待与争抢
- 双通道导致内存与接口没有通道,导致每次都需要通过CPU
- 基本功能
- 数据传送
- 同步:同时传给多个,不需要知道对方是否收到
- 异步:一个个传,需要应答信号
- 仲裁控制
- 用于处理争抢
- 出错处理
- 总线驱动
- 数据传送
- 总线带宽(单位时间的可传输数据量)=位宽(bit)*工作频率
- 应用多总线通道的原因
三、80X86指令系统
数与地址
-
指令形式:
操作码 目标操作数,源操作数
-
源操作数分类:
- 立即数
MOV AL,22H
- 来自寄存器(速度最快-在cpu中)
MOV AH,AL
- 来自存储器(速度最慢):
MOV AL,[1200H]
(ps:带有[]必在内存中,1200H表示偏移地址,AL是8位故取8位地址即1字长,若取到AX,取出16位)
- 立即数
-
寻址方式:表示了运算对象的来源或去向
- 立即寻址:源操作数参与到运算中:
MOV AX,1200H
,MOV AX,'B'
(此时,B是字符,ASCLL码为42H) - 寄存器寻址:寄存器中的值参与运算:
MOV AX,BX
- 直接寻址:利用[]表明偏移地址,默认在数据段中寻找操作数,可以修改:
MOV AX,ES:[1200H]
- 寄存器的间接寻址
- 以寄存器中的数值为地址(相当于指针p),MOV AX [BX]
- 可存储地址的寄存器:BX、BP、SI、DI (除BP默认在堆栈段外,其他都默认数据段)
- 好处:用BX+1配合循环来减少指令长度。
- 寄存器相对寻址:使用间接寻址的地址再加上常数表示要寻址的地址
MOV AX,[BX]5
(后面那相当于[BX+5]) - 基址、变址寻址:利用BX、BP作为基址,使它们值不变,改变SI/DI来改变地址。默认寻址段看基址。
MOV AX,[BX+SI]
或MOV AX,[BX][SI]
- 基址、变址、相对寻址
- 隐含寻址:操作数为默认,将其省略了
8086CPU指令
数据传送
- MOV 格式:
MOV DST,SRC
- 功能:实现数据从右向左传送
- 注意:
- 不能对CS、IP(代码段、指针寄存器)操作
- 两个段寄存器(CS、DS、SS、ES)间无法传送、段寄存器不可用立即寻址赋值
- 不允许两个寄存器间传送(即不允许两个数都是间接寻址)
- 栈指令
- 要求:不可使用立即数(因为栈顶指针按字存储,对源操作数字长有要求)、不能用CS
- PUSH 格式
PUSH 源操作数
- 过程:源操作数有2B及空栈时,SP指向栈底,PUSH后SP=SP-2,将低位传入SP,高位传入(SP+1)
- POP 格式
POP 源操作数
- 过程:SP累加取数
- 交换指令 XCHG 格式
XCHG DST,SRC
- 查表指令 XLAT 格式
XLAT
- 说明:表头需先存放于BX、偏移量需先存于AL
- 操作:读出表格数据存于AL (猜测:用于初始化某些表格)
- 有符号数的拓展:CBW(8→16)与CWD(16→32 )
- 地址传送指令
- 同一内存中传送:
LEA REG16, SRC
- 说明:目标操作数需是16位,原操作数可以是表示偏移地址的变量/间接寻址。
- 传输后,目标操作数相当于指针,当INC(累加)时,是按照一个字节单元累加
- 不同内存传送:LES、LDS
- 同一内存中传送:
- 标志位传送
- LAHF(load AH form flag) 、SAHF(Store AH to flag)分别是:将flag低八位(flag高八位为空闲位)存到AH、AH存到flag
- PUSHF(push flag into stack)、POPF(pop flag off stake)
- 输入输出指令
- 作用:进行端口地址数据(PORT-以8位立即数表示)与数据累加器(AL/AX)的读入或输出
- 输入
IN AL/AX,PORT
- 输出
OUT PORT,AL/AX
算术运算类
- 加法
ADD DST,SCR
(DST=DST+SCR)ADC DST,SCR
(DST=DST+SCR+CF)INC DST
+1指令,常用于指针 (不会影响标志位)
- 减法
SUB DST,SCR
,对标ADD(DST=DST-SCR)SBB DST,SCR
,对标ADC (DST=DST-SCR-CF)DEC DST
,对标INC ,常用于修改计数值NEG DST
求补指令(DST=0-DST)CMP SCR1,SCR2
比较指令:执行SCR1-SCR2,仅改变标志位CF(有借位时CF=1)(两操作数相等时ZF=1)
- 乘法
- 无符号:
MUL SCR
。有符号:IMUL SCR
- 注意:存放空间需是SCR的双倍字长,如SCR是1B(1字节,8位)则执行后AX=ALSCR;如SCR是2B,则执行后DXAX=AXSCR
- 无符号:
- 除法
- 无符号:
DIV SCR
。有符号:IDIV SCR
- 注意:被除数是SCR的双倍字长:如SCR是1B则AX/SCR后AL为商,AH为余数;如SCR是2B,执行DXAX/SCR,AX为商,DX为余数。
- 无符号:
逻辑运算和移位类
- 逻辑运算
- 逻辑运算对大多标志位无影响,除了每一次操作会使CF、OF为0
- 与
AND DST,SRC
结果放到DST中,每次操作都会将CF、OF清0 - 或
OR DST,SRC
- 非
NOT DST,SRC
- 异或
XOR DST,SRC
此外,由于逻辑运算相比数值运算快,因此最好的清零方式是异或自己。 - 测试
TEXT DST,SRC
用于测试某位的状态:将两数向与,但结果不返回到DST,可以接着用JZ WATT
(当ZF=1时转移)等跳转指令
- 移位
- 目标操作数都为要移位的单元,源操作数都为移位次数
- 移位次数需要存放在CL中。当仅移位一次时,1 可直接写出
- 向左移位时最高位放入到CF中,右移时最低位送到CF。
- 移位指令的分类:非循环/循环、逻辑/算术(区别在于它们用于无符号数/有符号数)、带进位/不带进位、左移/右移
- 非循环类(用于实现乘除运算):移动后会补零。具体指令:
算术左移/右移:SAL/SAR 、逻辑左移/右移:SHL/SHR
- 循环类:相当于整个数在转圈。分类:带进位(相当于CF的值放在最左/最右,一起转圈),不带进位(目标数转圈,但从最高/低位跑到最低/高位的数拷贝一份给CF)具体指令:
带进位左/右:RCL/RCR; 不带进位左右:ROL/ROR
- 算术移位(有符号数移位):将最高位(符号位)copy,待整体移位后再把最高位附上原来的数值。
串操作
- 初始化
- 设立源串与目标串:源串一般放在数据段,指定SI指针的数据。目标串必须放在附加段,指定指针DI。(除非进行串重设)
- 串需指定方向:DF=0表示增地址方向、DF=1表示减地址方向
- 串长度由CX指定。
- 重复前缀:如CX不断递减,当CX=0时停止(串操作实际上还是字节操作的重复执行,毕竟总线是有带宽的)具体有指令REP(CX!=0)、REPE/RRPZ、REPNE/REPNZ
- 指令
- 串传送
MOVS DST,SRC
(需要串重设,即初始化工作) 、MOVSB(按字节)、MOVSW(按字传) 如:REP MOVSB
是将SI所指的1字节单元数据放到DI所指位置。 - 串比较:
CMPS DST,SRC
、CMPSB、CMPSW。与CMP一样:相减→看CF位。例如:REPE CMPSB;JZ STOP;...;STOP :HLT
(两数相等是ZF=1,REPE当CX=0或ZF=0时取消重复,第二条指令意味着ZF=1时跳转。) - 串扫描:
SCANS SRC
(查附加段中是否有该数)、SCANSB(源操作数在AL)、SCANSW(源操作数在AX)。串扫描与CMPS类似,相减→看ZF位。 - 串装入:
LODS SRC
(同样地,需要串重设,不常用)、LODB(将[DS:SI]装入AL)、LODW(将[DS:SI]装入AX)。可以用于显示/输出到外设。 - 串存储:STOS SRC、STOSB(AL传到[ES:DI])、STOSW(AX传到[ES:DI])
- 串传送
程序控制
转移
- 前言:
- CS(代码段寄存器)用于存放指令的地址,将其左移4位(变为段基地址),加上存在IP(指令指针)中的偏移地址,即可得到待执行指令的地址。
- 程序控制的要义在于改变CS、IP
- 分类:无条件转移/有条件转移(条件一般指标志位)、近地址/远地址(即:段内/段间)、直接/间接(体现在执行的源操作数上,一个是立即数,一个是寄存器)
- 无条件:
- 段内直接:
JMP Label Label
Label是个在程序中出现两次的标号,偏移量=Label所指指令的地址-IP,执行后IP = IP+偏移量
- 段内间接:
JMP BX
(源操作数需是16位的)需要实现定义BX的值,执行后IP = BX
- 段间直接:
JMP FAR Label
- 段间间接:
JMP DWROD PTR[BX]
由于源操作数需是4字节数(4*8=32位),高16位存CS、低16存IP,因此要用DWORD PTR[指针],取出该地址下的数据作为地址。
- 段内直接:
- 条件转移: 示例:
JZ Label
ZF=1时跳转。
循环
- 循环经由CX判断次数,分为无条件循环/有条件循环(此处条件是指ZF),只能将IP在-128~+127的范围内移动
- 无条件循环
LOOP Label
,会自动DEC CX
- 有条件循环
LOOPZ Label
,继续循环的条件:CX!=0 && ZF = 1
.可类推LOOPNZ Label
调用
- 调用子程序其实就是把指针修改到子程序的入口处,之后一路执行子程序,子程序最后都要写一个RET指令,用来返回断点。
- 所谓断点,就是主程序发生跳转的位置,在调用前,断点地址会被存入堆栈段保护起来。
- 段内调用:
CALL TIMER
或CALL WORD PTR[SI]
前者时直接调用,后者是间接调用 - 段间调用:
CALL FAR TIMER
或CALL DWORD PTR[SI]
前者时直接调用,后者是间接调用
中断
- 区别于子程序调用的地方:1.子程序近地址调用不需要存段基地址,而中断都要存下段基与偏移地址(还要存flags)。2.中断被认为是异常,不知道发生的时间。
- 指令
INT n
n是一个立即数,0~255H范围内,成为中断码。 - 执行前:系统会将flags、段基地址CS、偏移地址IP依次压入堆栈段中。
- 执行时:CPU按中断码去取指令
IP=n*4;CS=(n*4)+2;
- 结束:中断子程序的出口是
IRET
处理器控制
- 是CPU对自己内部的控制
- 立即寻址:源操作数参与到运算中:
四、程序设计
前言
- 每个.ASM都要经历:编译(生成obj)-链接(生成.exe)的过程。
- 语句分为两类:指令语句、指示性语句(CPU不执行)。
- 指令语句的构成:
[标号:] 助记符 操作数 [;注释]
例如NEXT: CMP SUM,100
- 指示性语句:
[名称] 伪助记符 操作数 [;注释]
作用:用于提前声明空间等预处理操作。如DATA1 DB 30H
- 指令语句的构成:
指令助记符
取值类
- SEG 取出段地址
- OFFSET 取偏移地址
- TYPE 取类型
- LENGTH 取长度
- SIZE 取大小
伪指令助记符
-
数据定义:DB、DW、DD声明存储空间 ,可配合重复运算符定义:
DATA1 DB 5 DUP(?)
-
符号定义:用一个符号表达一个数/符号,
符号名 EQU 表达式
特点:只可以定义一次、不占用内存空间 如:CONSTANT EQU 100
-
段声明:
段名 SEGMENT ASSUME 寄存器:段名 ... 段名 ENDS END
- 段定义
段名 SEGMENT...段名 ENDS
段名是一个符号地址,作为源操作数时,它是个立即数。 - 说明当前定义的段的性质 ASSUME 段寄存器:段名,段寄存器:段名,…
- 段完整的使用方式是:段定义-声明类型-写入寄存器
- 段定义
-
结束:END标志汇编程序的结束。
-
过程(子程序)定义:
过程名 PROC [类型] PUSH 寄存器 ;不一定写,用于保护数据 ... PUSH 寄存器 ;不一定写,用于保护数据 RET 过程名 ENDP
- 调用时,用
CALL 过程名
,原理与RET一样是修改CX、IP - 类型有NEAR、FAR,主要看调用处和过程是否在同一个代码段中。
- 调用时,用
-
宏定义:很像高级语言了的函数定义!宏与过程的不同之处在于: 宏需要写在主程序中,不能跨程序。
宏命名 MACRO <形式参数> ... ENDM
-
调整偏移量指令:
ORG 下个偏移量
使得下一个定义的变量偏移地址改变。
操作数
运算符
- 重复:
重复次数 DUP(表达式)
- 合成(将某变量作为某类型使用):
类型 PTR 表达式
类型可以是BYTE、WORD之类
DOS系统功能调用
前言
- DOS与BIOS一样都是嵌在ROM中
- 对DOS的调用相当于产生中断:INT 21H;DOS的功能号需事先存放于AH中
DOS的输入输出
-
凡是输入都会存放在AL中,输出时是输出存放在DL的数据
-
字符串输出/输出会用到缓存区,由于缓存区的容量是用一个字节变量表示,因此,字符串长度最多为255
-
定义字符串需要以
‘$’
结尾,若输入字符串,还需要填上功能号‘0A’(输入字符串)‘0D’(以回车结束)如MESS DB 'Plz input:', 0DH , 0AH, '$' BUFF DB 20,?,20,DUP(?) ;BUFF的第一个单元存放着长度(即20的ASCLL),第二个单元存放着实际敲下的(目前是?)
五、半导体存储器与接口技术
概述
- 微机中的存储器(底层→顶层):通用寄存器组及栈(ROM\RAM→都属半导体存储器)、高速缓存(Cache)、主存储器、联机外存、脱机外存
- Cache也称‘快表’,用于协调CPU与主存之间的传输速度差距。主存中最常用的指令会被映射到Cache中。目的:加快访问速度
- 虚拟存储器系统:由主内存和部分磁盘构成,可以加大存储空间。
- 半导体存储器的容量指标=单元个数*每单元位数
内存单元编址
- 地址的高位为片选位,用于选择存储的范围,可由译码电路更改。
存储器接口
RAM
- A?表示地址线、D?表示数据线;#OE输出(读)允许,#WE写允许;CS片选
- 全地址译码:以CPU的8根地址线(A?)作为译码器的输入,让它们仅在某一状态下通过译码器输出低电平
- 部分地址译码:用少于8根的地址线作为译码器的输入
ROM
- 读取随意,写操作需要脉冲与电压
- 擦除需用紫外光
Flash
- 通过寄存器状态来确定读写操作
- 擦除有:字节、块、片擦除。擦除挂起(暂停)。