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
上一篇:正则表达式基础


下一篇:使用llama-index连接neo4j知识图谱 达成大模型构建查询知识图谱功能