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按下
2 Ctrl,1按下
3 Alt,1按下
4 ScrollLock状态,1表示指示灯亮
5 NumLock状态,1表示小键盘输入的是数字
6 CapsLock状态,1表示大写字母
7 Insert状态,1表示处于删除状态

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

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

code segment

        a: db 1,2,3,4,5,6,7,8
        b: dw 0

start:  mov si offset a
        mov bx,offset b
        mov cx,8

    s:  mov al,cs:[si]
        mov ah,0
        add cs:[bx],ax
        inc si
        loop s

        mov ax,4c00h
        int 21h

code ends

end start

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

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

data seqment

    a: db 1,2,3,4,5,6,7,8
    b:  dw 0

data ends

code seqment

    start:  mov ax,data
            mov 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
相关推荐
dundunmm7 分钟前
机器学习之scikit-learn(简称 sklearn)
python·算法·机器学习·scikit-learn·sklearn·分类算法
古希腊掌管学习的神7 分钟前
[机器学习]sklearn入门指南(1)
人工智能·python·算法·机器学习·sklearn
波音彬要多做8 分钟前
41 stack类与queue类
开发语言·数据结构·c++·学习·算法
Hacker_xingchen20 分钟前
天融信Linux系统安全问题
linux·运维·系统安全
m0_748256781 小时前
WebGIS实战开源项目:智慧机场三维可视化(学习笔记)
笔记·学习·开源
红色的山茶花1 小时前
YOLOv9-0.1部分代码阅读笔记-loss.py
笔记
程序员老冯头2 小时前
第十五章 C++ 数组
开发语言·c++·算法
胡西风_foxww3 小时前
【es6复习笔记】Promise对象详解(12)
javascript·笔记·es6·promise·异步·回调·地狱
无泡汽水3 小时前
漏洞检测工具:Swagger UI敏感信息泄露
python·web安全
Crossoads6 小时前
【汇编语言】端口 —— 「从端口到时间:一文了解CMOS RAM与汇编指令的交汇」
android·java·汇编·深度学习·网络协议·机器学习·汇编语言