微机接口与汇编课堂笔记

核心图

在这里插入图片描述

M是内存
IO是输入输出接口
AB是地址总线 add bus
DB是数据总线
CB是控制总线

8088CPU

8088处理器有20根地址线,8根数据线
8088图示

基本指令

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接口例子是最常见的题目了,按自己心得来说,作图可以拆解成三部分

  1. 片内选部分(地址线主要部分)
    在这里插入图片描述
    这部分主要是地址总线都与SRAM芯片相连接,地址总线连接从0到几取决与芯片的大小,如芯片大小为1k,那只用10跟地址线A0~A9相连就够了

  2. 数据总线部分
    在这里插入图片描述
    这部分是最简单的,芯片都与数据总线相连,数据总线数量由一次处理几位决定,例如一次处理×8,那么数据总线就从D0~D7

  3. 片选部分
    在这里插入图片描述
    片选部分主要由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优先级最低

8259A优先级
内部结构主要体现的部件是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在工程应用

主程序:

  1. 设置中断向量(int 21h)
  2. 开放相应的中断请求(设置中断屏蔽字为0)
  3. CPU允许中断(STI开中断指令)

中断服务程序:

  1. 中断返回前执行中断结束命令(OUT 20H,(20H))

例子

8255方式1输入
主程序:

  1. 设置中断向量(int 21h)
  2. 开放相应的中断请求(设置中断屏蔽字IR3为0)
  3. CPU允许中断(STI开中断指令)
    在这里插入图片描述
    在这里插入图片描述
    中断服务程序:
    在这里插入图片描述
    在这里插入图片描述
  • 5
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值