当前位置: 首页 > news >正文

8086 汇编笔记(十二):int 指令 端口 直接定址表

一、int 指令

int 指令的格式为:int n,n 为中断类型码,它的功能是引发中断过程

CPU 执行 intn 指令,相当于引发一个n号中断的中断过程,执行过程如下:

(1) 取中断类型码 n;

(2) 标志寄存器入栈,IF=0,TF=0;

(3) CS、IP 入栈;

(4) (IP)=(n*4),(CS)=(n*4+2)。

从此处转去执行n号中断的中断处理程序。 

二、BIOS 和 DOS 提供的中断例程 

系统 ROM 中存放着一套程序,称为 BIOS,除此之外还有 DOS 都提供了一套可以供我们调用的中断例程,不同历程有不同的中断类型码,并且还能根据传入的参数不同而实现不同的功能,也就是说同一个类型码的中断例程可以实现很多不同功能,如 int 10h 是 BIOS 提供的包含了多个和屏幕输出相关子程序的中断例程

BIOS 和 DOS 安装历程的过程是,开机后 CPU 一加电,自动初始化 CS 为 0FFFFH,IP为 0 ,而在这个地方有一个跳转指令,挑战到 BIOS 和系统检测初始化程序。在 BIOS 系统检测初始化程序中会设置中断向量表中的值 

三、端口

从 CPU 的角度,将这些寄存器都当作端口,对它们进行统一编址,从而建立了一个统一的端口地址空间。每一个端口在地址空间中都有一个地址。 

四、端口的读写

在访问端口的时候,CPU 通过端口地址来定位端口

端口的读写指令只有两条:in 和 out,分别用于从端口读取数据和往端口写入数据 

in al 60h    ;从 60h 号端口读入一个字节

注意,在 in 和 out 指令中,只能使用 ax 或 al 来存放从端口中读入的数据或要发送到端口中的数据。访问 8 位端口时用 al,访问 16 位端口时用 ax。

五、shl 和 shr 指令

shl 是逻辑左移指令,它的功能为:

        1. 将一个寄存器或内存单元中的数据向左移位

        2. 将最后移出的一位写入 CF 中

        3. 最低位用 0 补充

mov al,01001000b
shl al,1            ;将 a1 中的数据左移一位

执行后 (al)=10010000b,CF=0 

shr 是逻辑右移指令,它和 shl 所进行的操作刚好相反
        1. 将一个寄存器或内存单元中的数据向右移位
        2. 将最后移出的一位写入 CF 中
        3. 最高位用 0 补充

mov al,10000001b
shr al,1            ;将 al 中的数据右移一位

执行后(al)=01000000b,CF=1

六、外中断信息

在 PC 系统中,外中断源一共有以下两类:

        1. 可屏蔽中断(CPU 可以不响应的外中断)

        2. 不可屏蔽中断(CPU 必须响应的外中断)

CPU 是否响应可屏蔽中断,要看标志寄存器的 IF 位的设置

当 CPU 检测到可屏蔽中断信息时,如果 IF=1,则 CPU 在执行完当前指令后响应中断,引发中断过程;如果 IF=0,则不响应可屏蔽中断

当然,如果在中断处理程序中需要处理可屏蔽中断,可以用指令将 IF 设置为 1。8086 CPU 提供的设置 IF 的指令如下:

        1. sti,设置 IF=1
        2. cli,设置 IF=0

七、PC 机键盘的处理过程

键盘上有一个芯片对键盘中每一个键盘的状态进行扫描,开关按下生成一个扫描码——通码,记录按下的按键位置,开关抬起也会产生一个扫描——断码,码记录松开的位置,都是送入60h端口。通码的第7位为0,断码第7位为1,也就是说断码=通码+80h

BIOS中键盘缓冲区能存储15个键盘输入,每个键盘输入两字节,高位存放扫描码,低位存放字符。此外,0040:17单元存放键盘状态字节,记录了控制键和切换键的状态,记录信息如下:

含义
0右shift,1表示按下
1左shift,1按下
2Ctrl,1按下
3Alt,1按下
4ScrollLock状态,1表示指示灯亮
5NumLock状态,1表示小键盘输入的是数字
6CapsLock状态,1表示大写字母
7Insert状态,1表示处于删除状态

八、描述了单元长度的标号

下面的程序将 code 段中的a标号处的8个数据累加,结果存储到b标号处的字中

code segmenta: db 1,2,3,4,5,6,7,8b: dw 0start:  mov si offset amov bx,offset bmov cx,8s:  mov al,cs:[si]mov ah,0add cs:[bx],axinc siloop smov ax,4c00hint 21hcode endsend start

九、在其他段中使用数据标号

注意,在后面加有“:”的地址标号,只能在代码段中使用,不能在其他段中使用

data seqmenta: db 1,2,3,4,5,6,7,8b:  dw 0data endscode seqmentstart:  mov ax,datamov ds,ax……………………

十、直接定址表

使用查表的方法编写相关程序,如输出一个字节型数据的16进制形式(子程序):

showbyte jmp short show
table db '0123456789ABCDEF'
show:push bx
push es
mov ah,al
she ah,1
she ah,1
she ah,1
she ah,1 ;右移四位,位移子程序限制使用的寄存器数,只能这么移
and al,00001111b
mov bl,al
mov bh,0
mov ah,table[bx]  ;高四位作为相对于table的偏移,取得对应字符
mov bx,0b800h
mov es,bx
mov es:[160*12+40*2],ah
mov bl,al
mov bh,0
mov al,table[bx]
mov es:[160*12+40*2+2],al
pop es
pop bx
ret
http://www.lryc.cn/news/368927.html

相关文章:

  • 揭开FFT时域加窗的奥秘
  • 【AI基础】第二步:安装AI运行环境
  • 【MySQL】聊聊唯一索引是如何加锁的
  • k8s-CCE使用node节点使用VIP--hostNetworkhostPort
  • 18、关于优化中央企业资产评估管理有关事项的通知
  • AI大模型日报#0610:港大等1bit大模型“解决AI能源需求”、谷歌开源TimesFM时序预测模型
  • 速盾:图片cdn加速 免费
  • 贪心算法例子
  • vivado HW_ILA_DATA、HW_PROBE
  • refault distance算法的一点理解
  • 软件安全技术【太原理工大学】
  • 异常(Exception)
  • 一文者懂LLaMA 2(原理、模型、训练)
  • MySQL 存储函数及调用
  • 设计模式七大原则-单一职责原则SingleResponsibility
  • msfconsole利用Windows server2008cve-2019-0708漏洞入侵
  • Reinforcement Learning学习(三)
  • hw meta10 adb back up DCIM
  • Unity2D游戏制作入门 | 12(之人物受伤和死亡的逻辑动画)
  • 从河流到空气,BL340工控机助力全面环保监测网络构建
  • 零拷贝技术
  • Flutter_Android上架GooglePlay_问题
  • 【Java】解决Java报错:NumberFormatException
  • 视觉大模型(VLLM)学习笔记
  • 【软考的系统分析师的考题考点解析2025】
  • JavaScript前端技术入门教程
  • 类和对象(上续)
  • 【C++初阶学习】第十三弹——优先级队列及容器适配器
  • Java(十七)---ArrayList的使用
  • 实验六、IPv4 地址的子网划分,第 2 部分《计算机网络》