汇编语言与接口技术(速通版)

变量:

字符量值为ASCII码
‘0’=30H,‘A’=41H,‘Z’=5AH,‘a’=61H,‘z’=7AH
八进制后缀Q,
符号名 EQU 数值表达式在汇编前就被计算
变量:DB 字节,DW 字,DD 双字,DQ 8byte,DT 10byte
重复次数 dup (重复内容)

0DH:回车(光标回到本行第一个字符)
0AH:换行
输出文字:

lea bx,string
mov cx,7;7为长度
one:mov di,cs:[bx]
	mov ah,2
	int 21H
	inc bx
	loop one
string db "hello"
end start

汇编模板:

DATAS SEGMENT												.model small
    ;此处输入数据段代码  									   .stack 100	
DATAS ENDS                                                  .data
																;此处输入数据段代码  	
STACKS SEGMENT												.code
    ;此处输入堆栈段代码										   start:
STACKS ENDS														mov ax,@data
																mov ds,ax
CODES SEGMENT														;逻辑代码
    ASSUME CS:CODES,DS:DATAS,SS:STACKS							mov ax,4c00h
START:															int 21h
    MOV AX,DATAS                                             end start
    MOV DS,AX
    ;此处输入代码段代码
    MOV AH,4CH
    INT 21H
CODES ENDS
    END START

输出字符串:

lea dx,string
mov ah,9
int 21h
string db 0DH,0AH,"hello",0DH,0AH,'$'  ;回车 换行

输入输出:

in AL/AX,imm8/DX
out imm8/DX,AL/AX

读外设(查询):

status:in al,dx
	test al,80H;//测标志位
	jz status
	mov dx,100h
	in al,dx

写外设(查询)

status:mov dx,102H
	in al,dx
	test al,80H
	jnz status;//D7=1,忙,继续查
	mov dx,100h
	mov al,char
	out dx,al

无符号字数组以-1为结束,求平均值:

lea bx,array
one:cmp word ptr[bx],-1
	je done;//数组结束
	add ax,[bx]
	adc dx,0;保留进位
	inc cx;//数组元素个数
	add bx,2
	jmp one
done:jcxz null
	div cx
	mov avg,ax
	jmp exit
null:mov avg,-1

用N^2=1+3+…+(2N-1)求平方根

square proc near
	push cx
	push bx
	mov bx,ax;要求的数
	mov al,0
	mov cx,1
next:sub bx,cx
	jb done
	inc al
	add cx,2
	jmp next
done:
	pop bx
	pop cx
	ret
square endp

中断: CPU执行程序时,突然有某个外部或内部事件发生,请求CPU处理,CPU暂停当前正在执行的程序,转去执行处理当前该事件的服务程序,服务完毕后, CPU返回原来程序被中断的地方继续执行

**中断源:**引起中断发生的内部或外部事件称为中断源

中断类型号/向量号: 每个中断源唯一的一个编号

断点: 由于中断的发生,被暂停执行的程序中即将执行,但还没有被执行的那条指令的地址被称为断点,即中断发生时的CS值和IP值

中断服务程序: 处理中断事件的程序段

中断向量: 中断服务程序的入口地址(CS:IP) 组成及格式:4个字节 高->低字节依次为:段地址高字节、段地址低字节、偏移地址高字节、偏移地址低字节

中断向量表: 存放256个中段向量的内存区域。即存放中断服务程序入口地址的内存区域被称为中断向量表 大小:1 KB 地址范围: 0000H ~ 003FFH

中断类型号n与其对应的中断向量存放起始地址之间的关系: 起始地址 = 4 x n , 末地址 = 4 x n + 3

中断系统的功能: 1.能实现中断响应、中断服务及中断返回 2.能实现中断优先权排队 3.能实现中断嵌套

中断请求: 中断源发出中断请求信号(可由内部标志或指令引起;也可由外部电路引起)

中断判优: 对申请中断的中断源进行优先级别判断的过程(方法1.软件查询优先权排队法 2.硬件优先权判别法:菊花链法、向量优先权排队电路)

中断响应: 从请求有效到转中断服务程序入口地址这一段时间。实现程序的切换

中断服务(处理): 中断程序的主体
步骤:
1.保护现场:将重要信息压入堆栈
2.开中断(开放所有可屏蔽中断,以允许高级中断嵌套)
3.执行中断服务程序
4.关中断
5.恢复现场(将重要信息弹出栈)

CPU响应中断必须满足的条件:
1.CPU接收到中断请求
2.没有DMA指令
3.当前指令执行结束
4.如果是INTR中断请求,CPU还必须开中断,即中断标志IF = 1

8086中断的分类:内部(软件)异常中断
1.指令中断(INT n)
2.异常中断(失效异常、陷阱异常、中止异常)

外部(硬件)异常中断
1.不可屏蔽中断(NMI):中断类型为2号

2.可屏蔽中断(INTR):可用软件控制是否允许中断的外部中断。即STI使IF = 1,允许中断 ; CLI使IF = 0,禁止中断、

注:除单步中断外,任何内部中断的优先级都高于外部中断

基本输入输出接口:

保存中断向量:

MOV AH,35H;AH = 35H
MOV AL,N;AL = 中断类型号
INT 21H
PUSH ES;返回时送ES:BX = 中断向量
PUSH BX

设置中断向量:

MOV AX,SEG INTPROC                                   
MOV DS,AX
MOV DX,OFFSET INTPROC;DS:DX = 中断向量
MOV AL,N			 ;AL = 中断类型号
MOV AH,25H			 ;AH = 25H
INT 21H;INT 21H

通过传送类指令直接设置中断向量:

MOV AX,0
MOV ES,AX
MOV BX,N*4
MOV AX,OFFSET INTPROC
MOV ES:[BX],AX 		;偏移地址->(N*4)
MOV AX,SEG INTPROC 
MOV ES:[BX + 2],AX	;段地址->(N*4+2)
...
INTPROC:
	....
	IRET

中断控制器8259A:

ICW1:芯片控制初始化命令字 偶地址 A 0 = 0 A_0=0 A0=0

D 7 D 6 D 5 D 4 = 0001 ; D 3 : 中断电平触发 1 ,边沿触发 0 ; D 2 : 0 或 1 均可 ; D 1 : 单片方式 1 ,多片级联 0 ; D 0 : 使用 I C W 4 1 , 不使用 I C W 4 0 D_7D_6D_5D_4 = 0001;D_3:中断电平触发1,边沿触发0;D2:0或1均可;D_1:单片方式1,多片级联0;D_0:使用ICW_41,不使用ICW_40 D7D6D5D4=0001;D3:中断电平触发1,边沿触发0;D2:01均可;D1:单片方式1,多片级联0;D0:使用ICW41,不使用ICW40

ICW2:设置中断类型号的初始化命令字,只需设置高5位,低3位可为任意 奇地址 A 0 = 1 A_0=1 A0=1

D 7 D 6 D 5 D 4 D 3 = 该中断的类型号 ; D 2 D 1 D 0 = 任意数 D_7D_6D_5D_4D_3 = 该中断的类型号;D_2D_1D_0 = 任意数 D7D6D5D4D3=该中断的类型号;D2D1D0=任意数 例:ICW2=20H,则IR0~IR7对应中断类型号为20H-27H

ICW3:标识主片/从片的初始化命令字,多片8259级联时才有意义 奇地址 A 0 = 1 A_0=1 A0=1

​ 主片: D 7 − D 0 对应于引脚 I R 7 − I R 0 上的连接情况 : 有从片 1 ,没有从片 0 D_7-D_0 对应于引脚IR_7-IR_0上的连接情况:有从片1,没有从片0 D7D0对应于引脚IR7IR0上的连接情况:有从片1,没有从片0

​ 从片: D 7 − D 3 可以为任意值, D 2 − D 0 为标识码 ( I D 2 − I D 0 ) : 表示从片的 I N T 信号连接到主片 I R 引脚的编号, 000 − 111 对应主片 I R 0 − I R 7 引脚 D_7-D_3 可以为任意值,D_2-D_0为标识码(ID_2-ID_0):表示从片的INT信号连接到主片IR引脚的编号,000-111对应主片IR_0-IR_7引脚 D7D3可以为任意值,D2D0为标识码(ID2ID0):表示从片的INT信号连接到主片IR引脚的编号,000111对应主片IR0IR7引脚

ICW4:方式控制初始化 奇地址 A 0 = 1 A_0 = 1 A0=1

D 7 D 6 D 5 = 000 作为 I C W 4 标识号 D_7D_6D_5 = 000 作为ICW_4标识号 D7D6D5=000作为ICW4标识号

D 4 : 特殊全嵌套方式 ( 主从系统的主片 ) 1 ,完全嵌套方式 ( 单片或级联系统从片 ) 0 D_4:特殊全嵌套方式(主从系统的主片)1,完全嵌套方式(单片或级联系统从片)0 D4:特殊全嵌套方式(主从系统的主片)1,完全嵌套方式(单片或级联系统从片)0

D 3 : 缓冲方式 1 ( 多级联系统常用 , 8259 通过总线缓冲区与数据总线相连 ) ,非缓冲方式 0 ( 8259 直接与数据总线相连 ) D_3:缓冲方式1(多级联系统常用,8259通过总线缓冲区与数据总线相连),非缓冲方式0(8259直接与数据总线相连) D3:缓冲方式1(多级联系统常用,8259通过总线缓冲区与数据总线相连),非缓冲方式0(8259直接与数据总线相连)

D 2 : 主从片标识位,当 D 3 = 1 时该位才有意义,主片 1 ,从片 0 D_2:主从片标识位,当D_3=1时该位才有意义,主片1,从片0 D2:主从片标识位,当D3=1时该位才有意义,主片1,从片0

D 1 : 设置中断自动结束方式,中断自动结束方式 1 ,非自动结束中断方式 0 D_1:设置中断自动结束方式,中断自动结束方式1,非自动结束中断方式0 D1:设置中断自动结束方式,中断自动结束方式1,非自动结束中断方式0

D 0 : 8259 用于 8 位微机 0 , 用于 16 位微机 1 ( 8086 系统中,该位必须为 1 ) D_0:8259用于8位微机0,用于16位微机1(8086系统中,该位必须为1) D0:8259用于8位微机0,用于16位微机1(8086系统中,该位必须为1)

OCW1:中断屏蔽操作命令字,对8259A的中断请求信号进行屏蔽操作 奇地址 A 0 = 1 A_0 = 1 A0=1

D 7 − D 0 : D i 表示 I R i 引脚的中断是否被屏蔽,中断屏蔽 1 ,允许中断 0 D_7-D_0:D_i表示IR_i引脚的中断是否被屏蔽,中断屏蔽1,允许中断0 D7D0:Di表示IRi引脚的中断是否被屏蔽,中断屏蔽1,允许中断0

OCW2:设置优先级循环方式和中断方式的操作命令字 偶地址 A 0 = 0 A_0 = 0 A0=0

D 7 : 循环优先级 1 ,固定优先级 0 ; D 6 : D 2 − D 0 使能位,有效 1 ,无效 0 ; D 5 : 中断结束命令位,非自动中断结束方式 1 ,中断自动结束方式 0 D_7:循环优先级1,固定优先级0;D_6:D_2-D_0使能位,有效1,无效0;D_5:中断结束命令位,非自动中断结束方式1,中断自动结束方式0 D7:循环优先级1,固定优先级0;D6:D2D0使能位,有效1,无效0;D5:中断结束命令位,非自动中断结束方式1,中断自动结束方式0

D 4 D 3 = 00 , 特征位 ; D 2 D 1 D 0 : 指定中断登记, 000 − 111 对应 0 级 − 7 级中断 D_4D_3=00,特征位;D_2D_1D_0:指定中断登记,000-111对应0级-7级中断 D4D3=00,特征位;D2D1D0:指定中断登记,000111对应07级中断

OCW3:1.设置和撤销特殊屏蔽方式 2.设置中断查询方式 3.设置对8259内部寄存器的读出命令

D 7 = 0 ; D 6 : 特殊屏蔽模式使能位,有效 1 ,无效 0 ; D 5 : 特殊屏蔽模式位,特殊屏蔽方式 1 ; D 4 D 3 = 01 , O C W 3 标识位; D 2 : 优先级查询方式 1 D_7=0;D_6:特殊屏蔽模式使能位,有效1,无效0;D_5:特殊屏蔽模式位,特殊屏蔽方式1;D_4D_3=01,OCW_3标识位;D_2:优先级查询方式1 D7=0;D6:特殊屏蔽模式使能位,有效1,无效0;D5:特殊屏蔽模式位,特殊屏蔽方式1;D4D3=01,OCW3标识位;D2:优先级查询方式1

D 1 : 内部寄存器使能位,不能读内部寄存器 0 ,能读 1 ; D 0 : 内部寄存器选择位,读出 I S R 内容 1 ,读出 I R R 内容 0 D_1:内部寄存器使能位,不能读内部寄存器0,能读1;D_0:内部寄存器选择位,读出ISR内容1,读出IRR内容0 D1:内部寄存器使能位,不能读内部寄存器0,能读1D0:内部寄存器选择位,读出ISR内容1,读出IRR内容0

可编程并行接口8255A:

方式0:基本输入/输出方式

方式1:选通输入/输出方式

方式2:双向传输方式

方式控制字:

D 7 = 1 ; D 6 D 5 : A 组方式 0 / 1 / 2 ; D 4 : A 口输出 0 ,输入 1 D_7=1;D_6D_5:A组方式0/1/2;D_4:A口输出0,输入1 D7=1;D6D5:A组方式0/1/2;D4:A口输出0,输入1

D 3 : P C 7 − P C 4 输出 0 ,输入 1 ; D 2 : B 组方式 0 / 1 ; D 1 : B 口输出 0 ,输入 1 ; D 0 : P C 3 − P C 0 输出 0 ,输入 1 D_3:PC_7-PC_4输出0,输入1;D_2:B组方式0/1;D_1:B口输出0,输入1;D_0:PC_3-PC_0输出0,输入1 D3:PC7PC4输出0,输入1D2:B组方式0/1D1:B口输出0,输入1D0:PC3PC0输出0,输入1

端口C按位置位/复位控制字:

D 7 = 0 ; D 6 D 5 D 4 : 不使用; D 3 D 2 D 1 : 位选择, 000 − 111 对应 P C 0 − P C 7 ; D 0 : 置位 1 (选通无效,不存外设数据),复位 0 D_7=0;D_6D_5D_4:不使用;D_3D_2D_1:位选择,000-111对应PC_0-PC_7;D_0:置位1(选通无效,不存外设数据),复位0 D7=0D6D5D4:不使用;D3D2D1:位选择,000111对应PC0PC7D0:置位1(选通无效,不存外设数据),复位0

可编程定时/计数接口芯片8254:

方式控制字:

D 7 D 6 : 00 / 01 / 10 选择计数器 0 / 1 / 2 , 11 读出控制 ( 8253 非法 ) ; D 5 D 4 : 计数器锁存 00 , 只读 / 写高 8 位 10 ,只读 / 写低 8 位 01 ,先低后高 11 D_7D_6:00/01/10选择计数器0/1/2,11读出控制(8253非法);D_5D_4:计数器锁存00,只读/写高8位10,只读/写低8位01,先低后高11 D7D600/01/10选择计数器0/1/2,11读出控制(8253非法)D5D4:计数器锁存00,只读/写高810,只读/写低801,先低后高11

D 3 D 2 D 1 : 方式 0 / 1 / 2 / 3 / 4 / 5 分别为 000 / 001 / x 10 / x 11 / 100 / 101 ; D 0 : 数制,二进制 0 ,十进制 1 ( B C D ) D_3D_2D_1:方式0/1/2/3/4/5分别为000/001/x10/x11/100/101;D_0:数制,二进制0,十进制1(BCD) D3D2D1:方式0/1/2/3/4/5分别为000/001/x10/x11/100/101;D0:数制,二进制0,十进制1BCD)

读出控制字:

D 7 D 6 D 0 : 110 ; D 5 : 锁存当前的计数值 0 ; D 4 : 锁存当前状态 0 ; D 3 D 2 D 1 : 用来锁存的的计数器分别对应于计数器 2 、 1 、 0 ,锁存 1 D_7D_6D_0:110;D_5:锁存当前的计数值0;D_4:锁存当前状态0;D_3D_2D_1:用来锁存的的计数器分别对应于计数器2、1、0,锁存1 D7D6D0:110;D5:锁存当前的计数值0D4:锁存当前状态0D3D2D1:用来锁存的的计数器分别对应于计数器210,锁存1

单极性电压输出:

V o u t = − ( D / 2 n ) × V R E F V_{out} = -(D/2^n) \times V_{REF} Vout=(D/2n)×VREF

ADC0809转换公式:
输出数字量 N = V i n − V R E F ( − ) V R E F ( + ) − V R E F ( − ) × 2 8 输出数字量N = \frac{V_{in}-V_{REF(-)}}{V_{REF(+)}-V_{REF(-)}} \times {2^8} 输出数字量N=VREF(+)VREF()VinVREF()×28
启动ADC0809对 I N 4 IN_4 IN4输入的模拟量转换的代码:

MOV AL,04H
MOV DX,300H
OUT DX,AL

读取转换结果:

MOV DX,300H
IN AL,DX
  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值