文章目录
核心图
M是内存
IO是输入输出接口
AB是地址总线 add bus
DB是数据总线
CB是控制总线
8088CPU
8088处理器有20根地址线,8根数据线
基本指令
MOV BX,2000H
将2000H赋值给BX,H表示16位
ADD AL, [BX]
读BX地址单元里的内容与AL相加赋值给AL,L表示AX的低8位
cpu将发送读信号RD
ADD [BX], AL 读BX地址单元里的内容与AL相加赋值到BX地址单元,结果传送到数据总线,cpu发出写命令
[xx]都是与memory有关的读写操作
CMP AL, BL
JZ L1
比较AL BL,为0时转移
编程模型
数据寄存器:AX, BX, CX, DX
AX是累加寄存器(下面简称R)
BX是基址R
CX是计数R
DX是数据R
指针寄存器:SP,BP
SP 堆栈指针
BP 基地址指针
变址寄存器:SI, DI,多用于数组的拷贝,SI赋值到DI,接着SI和DI依次+1
SI 源变址
DI 目的变质
控制寄存器:IP, FLAG
IP 指令指针:CS*10H + IP = PC,*10H即为CS16位后补4个零,PC是起始指针
FLAG 状态标志
状态标志位有:OF, DF, IF, TF, SF, ZF, AF, PF, CF
段寄存器:CS, DS, SS, ES
CS 代码段
DS 数据段
SS 堆栈段
ES 附加段
寄存器的分段管理思想
地址线有20根,那么所能表达内存的地址可以有2^20个(1M),但是一个寄存器所能存放的位数只有16位,不能表示完全,那么8088就用了分段管理,将1M的内存地址分段。分成16个段,用DS*10H作数据段的开始地址,再加上寄存器中存放的16位(偏移地址)即为要找的地址
假如要查找的内容是[BX],那么地址可计算:DS*10H + BX。段超越:默认的数据段是DS,可以在[BX]前加上ES:,将默认数据段DS改成ES进行计算,但是一般不常用。
段寄存器的使用规定
下图标明了默认使用的段寄存器、是否可超越和偏移地址
寄存器的总结
8个8位通用寄存器指的是AL,AH…DL,DH
8个16位通用寄存器是数据寄存器(4个)加上指针寄存器及变址寄存器(4个),AX,BX,CX,DX,SP,BP,SI,DI
6个状态标志 OF, SF, ZF, AF, PF, CF
1、进位标志CF(Carry Flag)
2、奇偶标志PF(Parity Flag)
3、辅助进位标志AF(Auxiliary Carry Flag)
4、零标志ZF(Zero Flag)
5、符号标志SF(Sign Flag)
6、溢出标志OF(Overflow Flag)
3个控制标志 DF, IF, TF
1、追踪标志TF(Trap Flag)
2、中断允许标志IF(Interrupt-enable Flag)
3、方向标志DF(Direction Flag)
汇编程序框架
data segment
buf db "123456abc.$"
count equ $-buf
data ends
code segment
assume cs:code,ds:data,es:data
start: mov ax,data
mov ds,ax
...
exit: mov ah, 4cH ;否则,返回DOS
int 21H
code ends
end start
基础汇编代码分析
buf db "123456abc.$"
解析:指从BUFF的位置开始连续存放指定字节数的$字符,其中要显示的字符串一定要用$结尾,DB定义变量为字节,每个字节占一个字节单元。
mess db "please input", 0dh,0ah,'$'
解析:mess是变量名,0ah, 0dh是回车换行
buf db 100
db ?
db 100 dup (0)
解析:在内存中申请一个缓冲区为100个字节,首地址给BUF。
缓冲区的第一个字节内放的是100,表示申请的存放数据的缓冲区的字节数为100个
第二个字节“?”表示的是实际存放的字节个数(就是说,你放入2个字节的数据,“?”变成2,放10个字节的数据,变成10)
输入的数据从第三个字节开始存放,第100个字节存放回车符(0DH),0DH作为输入数据的结束。
DUP(0)表示的是存放数据的100个字节初始值全为0,即为:100 0 0 0 0······0 ODH。
assume cs:code,ds:data,es:data
解析:assume: 段寄存器关联说明伪指令。所谓关联,只某一段寄存器使用某一指定的段空间。
cs:code ,ds:data ,es:extra: 代码段寄存器cs与code关联;数据段寄存器ds与data关联;附加段寄存器es与extra关联。
start: mov ax,data
mov ds,ax
解析:使DS的值为DATA.其中DATA为定义的数据段,它的作用就是把数据段寄存器DS的值赋为DATA,就是让数据段指向正确的位置
mov dx,offset mess
解析:offset返回数据标号的偏移量
mov ah,8
int 21h
解析:INT 21H是DOS的中断调用。调用INT 21H指令,计算机就会根据AH寄存器中的值执行相应的操作。
MOV AH
01H、07H和08H——从标准输入设备输入字符
02H —— 字符输出
03H —— 辅助设备的输入
04H —— 辅助设备的输出
05H —— 打印输出
06H —— 控制台输入/输出
09H —— 显示字符串
0AH —— 键盘缓冲输入
0BH —— 检测输入状态
0CH —— 清输入缓冲区的输入
mov dl,0ah
mov dl,0dh
解析:将DL中的码显示到屏幕,前提就是要往DL中传送ASCII码。这里的0AH是换行符的ASCII码,0DH是回车符的ASCII码
cmp al,'1'
jz num
解析:al与1相减为0跳转,即为相等跳转
cmp a,b
jb x
解析:jb小于跳转,ja大于跳转,jnz不相等跳转
inc si
解析:inc 寄存器或内存操作数加1,dec减1
jmp exit
exit: mov ah, 4cH
int 21H
code ends
end start
解析:jump无条件转移
补充的一些指令
-
XLAT
汇编语言查表指令,操作是以DS:[BX+AL]为地址,提取存储器中的一个字节再送入AL
用法:
mov bx, offset buf
mov al, n
XLAT
把buf的第n个元素送入al -
DIV
除法运算指令,得到整数:商和余数
用例:
mov ax, 0400h
mov bl, 04bh
div bl
ax除以bl,除数bl是8位:(AX)/NUM=(AL)…(AH)
如果除数是16位如bx:(DX(H)AX(L))/NUM=(AX)…(DX),用dx和ax两个寄存器合并存放被除数 -
DAA
该指令是用于调整AL的值,该值是由指令ADD或ADC运算二个压缩型BCD码所得到的结果。
用例:
mov al, 7
add al, 10
daa
al为17(011h),在al中以位表示为 0001 0001,使用daa后,al以位表示变为0001 0111,高四位就可以看成1,第四位就可以看成7了,某种程度上来说转化为了十进制表示。 -
SHR
逻辑右移指令,shl类似是逻辑左移
用例:
mov cl, 4
shr al, cl
将al逻辑右移4次,补零 -
ADC
adc是带进位加法指令,它利用了CF位上记录的进位值。语义:操作数1+操作数2+进位标志CF->操作数1
用例:
mov ax,2
mov bx,1
sub bx,ax
adc ax,1
执行后,(ax)=4。sub bx,ax将CF置为了1,adc执行时,相当于计算: (ax)+1+CF = 2+1+1 = 4。
寻址方式
- 立即寻址 mov ax, 1234h
- 寄存器寻址 mov ax, bx
- 直接寻址 mov ax, [2000h]
- 寄存器间接寻址 mov ax,[bx]
- 寄存器相对寻址 mov ax,DISP[SI]
其有效地址是一个基址寄存器(BX、BP)或变址寄存器(SI、DI)的内容和指令中的8位/16位偏移量之和。在不使用段超越前缀的情况下,规定:如果有效地址中含有BP,则缺省的段寄存器为SS;否则,缺省的段寄存器为DS - 基址加变址寻址 mov ax, [bx][si]
- 相对基址加变址寻址
MOV AX, [BX+SI+1000H]
MOV AX, 1000H[BX+SI]
MOV AX, 1000H[BX][SI]
MOV AX, 1000H[SI][BX]
基址加变址寻址有多种写法,以上的书写格式都是正确的,并且其寻址含义也是一致的。所用寄存器写在外面是错的
数据可转移路径
自己总结的
存储器与接口设计
基础知识
-
三总线分别为AB,DB,CB
-
不同的应用对应不同的接口
-
外设是与总线相连接,如[PCI-E总线]接显卡,[PCI总线]接声卡、网卡、USB2.0卡等等
-
M非/IO :MIO控制线用来区分是送到M还是是IO,memory低电位有效,IO高电位有效
-
I O R ‾ \overline{IOR} IOR:IOR总线,IOR低有效->RD低有效,类似的有IOW低有效->WR低有效,同样地都是MIO控制线高IO有效,IOR低有效->IN:端口数据送数据总线,IOW低有效->OUT :数据总线内容送至端口
-
IOR 读 in ,IOW 写 out,软件与硬件的桥梁
接口与总线设计SRAM例子
SRAM和CPU接口例子是最常见的题目了,按自己心得来说,作图可以拆解成三部分
-
片内选部分(地址线主要部分)
这部分主要是地址总线都与SRAM芯片相连接,地址总线连接从0到几取决与芯片的大小,如芯片大小为1k,那只用10跟地址线A0~A9相连就够了 -
数据总线部分
这部分是最简单的,芯片都与数据总线相连,数据总线数量由一次处理几位决定,例如一次处理×8,那么数据总线就从D0~D7 -
片选部分
片选部分主要由138译码器或者24译码器构成,使用哪一类的译码器这要看芯片一共要用几组,这里组意味着一组可能由两块或者两块以上芯片构成,这要看CPU是处理几位的和芯片是几位的,ABC接口连接一般的是地址线,G1始终高电位,G2A和G2B连接MREQ,允许访问内存控制信号,Y输出端连接芯片的CS片选控制线。
接口的物理组成
接口一般为大规模集成电路,用来解决高速cpu与慢速外设之间的差异,那么输出锁存和输入缓冲为基本功能
端口地址编址方式和端口地址译码电路
输入
如果数据属于0~255(如上面例子100),用DX和立即数都可以,如果超过255,那么只能用DX
输出
总线与接口设计
- IOR低有效->IN:并行接口端口数据送数据总线
- IOW低有效->OUT :数据总线内容送至端口
为什么进行片选是A3到A9? 原因是CPU是串行执行的,每次只能处理一个IO接口,如果10根地址线都用作表示端口地址就有1k个端口了,1k个端口能接几百个外设,而通常情况下主机外设不会超过10余个。A3~A9:7根地址线表示的128个端口就够了。其中A0~A3用来作并行接口。
地址译码电路(片选译码部分)
一般题目中长下图这个样子,138译码器,其中A3~A5接译码器的ABC,其余的地址线、IOR和IOW又来干嘛的,起到控制作用的,经过与非门接到译码器E1低有效控制线
举个例子如mov dx, 280h,写成bit位表示形式,1010 000 000,A3~A5 000 3位就是走的译码器-> Y0低有效,Y0接CS进行片选,其余地址线走74LS30(8输入端与非门)
题目截图,完整地址译码电路
8255控制字
方式控制字
D7 1有效
D6 D5 A组方式
D4 A口
D3 C口高4
D2 B组控制
D1 B口
D0 C口低4
C口按位置位/复位控制字
程序控制方式
方式0与打印机
读C口保存到AL,AL与04h,取出PC2位,判断是否忙
置位/复位控制字送控制端口,PC7置1
置位/复位控制字送控制端口,PC7置0,模拟脉冲
方式1工作输入
时序信号
STB信号,0有效,外部设备向8255发来的选通信号,在该信号有效期间,8255将外设发来的数据锁存在芯片内置的缓冲器中,并向外设发出缓冲器满的信号(IBF:高电平有效)作为对外设的应答,用来告诉外设暂时不能发送下一个数据。
INTR——中断请求信号,高电平有效
8255A输出的信号,可用于向CPU提出中断请求,要求CPU读取外设数据
RD,0有效,CPU开始读取数据,读取完后,RD置1并IBF置低位,表示input buff空,告诉外设可以发生下一个数据。
8255方式1输入
在8255方式1中,C口很多位都已经用了(PC3,4,5,6,7),所以不再用C口做输入输出
(查询8255是否空闲)
PA0~PA7(A口)在STB信号(选通信号)作用下,将数据输入到8255中
IBF:Input buff full,输入缓冲区满,8255发出信号
INTE:中断信号=1 & IBF, => INTR 中断请求信号=1,向CPU请求中断
CPU用IN指令取走数据,IBF=0
方式1工作输出
工作时序
Write 写信号,低电平有效,数据送到A口,OBF,output buffer full 满
INTR=0 不进行中断请求,开始输出数据
ACK信号(接收站发送给发送站),低有效(脉冲),表示数据已传送完成,INTR=1,向CPU请求中断,表示输出已完成请求下一步指示
OBF,变回高电平,表示output buffer空了
8255方式1输出
8255方式1状态字
状态字借了C口保存,8255在方式1读C口数据获取状态字
一般常用的是查D3(INTR)状态位,与08h相与就能取出D3了
设置8255 INTE中断允许
在8255方式1输入时,用PC4置1的方法达到INTE=1的目的
0 000 100(PC4) 1(置1)
在8255方式1输出时,用PC6置1的方式达到INTE=1的目的
0 000 110(PC6)1(置1)
发送至控制端口28bH
8255方式1输入程序流程图
io8255a equ 288h ;端口A 地址
io8255b equ 28bh ;控制口地址
io8255c equ 28ah ;端口C地址
code segment
assume cs:code
start:
mov dx, io8255b
mov al, 0b8h ; 1 01(方式1) 1(A口输入) 1(C高输入) 000
out dx, al ;设置端口A方式1输入
mov al, 09h ; 0(?有效) 000(无效) 100(选中位 4) 1(置1)
out dx, al ;使PC4允许中断
receive:
mov dx, io8255c ;c口
in al, dx ;查询INTRA=0?
and al, 08h ;08h 0000 1000 & c口, 取出第四位的值
jz receive ;如果==0,说明没准备好
mov dx, io8255a ;接收数据
in al, dx
mov ah, al
add al, 30h ;显示数据到屏幕
mov dl, al
mov ah, 02
int 21h
jmp receive
code ends
end start
8255方式1输出程序
io8255a equ 288h ;端口A地址
io8255b equ 28bh ;控制口地址
io8255c equ 28ah ;端口C地址
code segment
assume cs:code
start:
mov dx, io8255b
mov al, 0a0h
out dx, al ;输出工作字,端口A方式1输出
mov al, 0dh
out dx, al ;使 PC6 =1,允许中断
mov al,0
mov dx,io8255a
out dx,al ;将A口清0
mov bl,0h
trsmt: mov dx,io8255c
in al,dx
and al,08h ;查询 INTRA=1?(STATE)
jz trsmt ;等于0就一直等待
mov al,bl
add al,1 ;累加
mov bl,al
mov dx,io8255a
out dx,al ;将al的数据输出到A口
jmp trsmt
code ends
end start
方式一8255编程要点
- 8255是一个并行可编程接口芯片,在使用时首先要进行初始化编程,也即向控制字送控制端口。
- 8255端口C可以工作在方式0,端口B可以工作在方式0、1,端口A可以工作在方式0、1、2
- 8255工作在方式1时,用查询或者用中断方式与CPU交换数据,都要设置INTE为允许
- 设置8255内部中断允许INTE,用C口按位置位来实现,输入用PC4置1(0 000 100 1),输出用PC6置1(0 000 110 1).
方式2
8255工作方式2是方式1输入输出的组合,变为并行
方式1中断编程
控制信号
- NMI:不可屏蔽的中断信号,用户级用不到
- INTR:外设的控制信号不直接连接CPU的INTR,由中断控制器控制(8259A),外设的控制信号接到8259A的IR上
- INTA非:中断请求的应答信号
8259A的级联
如下图,展示了CPU与8259之间部分的连接,8259的IR接口与外设的控制线相连,如果连接的是另一块中断控制器,则成为级联。中断控制器间的连接层次可以分为主从片,一般两片就够了。
中断基本概念
高速的CPU与低速的外设并行工作,CPU在执行时,CPU执行完一条指令后检测是否有中断到来,这由CPU执行指令的时序决定的,中断到来,CPU要切换至中断程序。
所要做的事情:查询中断向量表找到入口地址,保护现场,为外设服务,恢复现场。
开关中断位
状态寄存器有一位:I(Interrupt)位,INTR来时,I位为1应答,I位为0不应答,STI开中断置I位为1,CLI关中断置I位为0。
8259A优先级
IR0优先级最高,往后优先级依次降低,IR7优先级最低
内部结构主要体现的部件是ISR,当前服务器寄存器,在服务时会将相应位置1,下个中断请求来时会判断ISR内容,来控制是中断嵌套(高级中断来时)还是不理睬(低级中断来时)
中断来源识别
-
向量中断
向量带着身份信息(中断类型号)给CPU -
程序查询
CPU依次查询 do you send? 外设与CPU之间进行应答
中断类型号
中断类型码为8位二进制数,即0~255。
中断向量表:所有类型中断的服务子程序入口地址放在中断向量表中(256 * 4B(DS:DX) = 1KB)
服务子程序入口地址:由中断类型码×4得到在中断向量表的位置,然后从中取出这个地址,转到相应的子程序。
中断服务程序的入口地址送中断向量表
最简单的方法是用DOS的功能调用,int 21h指令
- mov AH, 25h
- mov AL, 类型号
- mov DX, 偏移地址
- mov DS, 段地址
- int 21H
8259A,送IR3(中断类型号为0Bh)的例子如下:
8259A内部结构图
- IMR:中断屏蔽寄存器,有请求不屏蔽相应位置0
- ISR:当前服务寄存器,相应位置1表示正在服务,每次中断服务程序结束要置回0,同时ISR可以判断优先级,得以实现中断嵌套
IMR置0
IMR在21端口
IN AL,21H
AND AL,0F7h (1111 0111)
(屏蔽置1, OR AL,08H(0000 1000))
OUT 21h,AL
ISR置0
中断服务程序完成后,要将ISR对应为置为0
20号端口送20H
MOV AL,20H
OUT 20H,AL
8259在工程应用
主程序:
- 设置中断向量(int 21h)
- 开放相应的中断请求(设置中断屏蔽字为0)
- CPU允许中断(STI开中断指令)
中断服务程序:
- 中断返回前执行中断结束命令(OUT 20H,(20H))
例子
8255方式1输入
主程序:
- 设置中断向量(int 21h)
- 开放相应的中断请求(设置中断屏蔽字IR3为0)
- CPU允许中断(STI开中断指令)
中断服务程序: