第 13 章:int 指令

检测点 13.1

(1)在上面的内容中,我们用 7ch 中断例程实现 loop 的功能,则上面的 7ch 中断例程所能进行的最大转移位移是多少?

lp:     push bp
        mov bp,sp
        dec cx
        jcxz lpret
        add [bp+2],bx
lpret:  pop bp
        iret

答案:最大转移位移是指的相对地址的偏移量,它用十进制表示比较好。

如果从 loop 的指令角度上看,loop 就是个段内短转移,它的范围是 -128~127,也就是说最大转移位移是 128。

如果从例程中 bx 变量来说,先搞定 bx 存储二进制补码数据的表示范围。对于 16 位来说它表示的范围是(-32768~32767)。我们知道在内存中是按照计算机补码方式存储的,最小的负数(也就是绝对值最大的数)是 8000H 也就是 -32768,那么它最大的转移位移是 32768(绝对值)。

(2)用 7ch 中断例程完成 jmp near ptr s 指令的功能,用 bx 向中断例程传送转移位移。

应用举例:在屏幕的笫 12 行,显示 data 段中以 0 结尾的宇符串 。

assume cs:code

data segment
    db 'conversation',0
data ends

code segment
start:  mov ax,data
        mov ds,ax
        mov si,0
        mov ax,0b800h
        mov es,ax
        mov di,12*160
s:      cmp byte ptr [si],0
        je ok                       ; 如果是 0 跳出循环
        mov al,[si]
        mov es:[di],al
        inc si
        add di,2
        mov bx,offset s-offset ok   ; 设置从标号 ok 到标号 s 的转移位移
        int 7ch                     ; 转移到标号 s 处
ok:     mov ax,4c00h
        int 21h
code ends

end start

此程序目的是将 int 7cH 指令等价于 jmp near ptr s(段内近转移),位移范围是(-32768~32767)。

7cH 的入口参数是 bx,实现功能是 jmp near ptr s(段内近转移),返回值:无。

例程代码如下:

将 7cH 代码写入 0:200H 的装载程序如下:

检测点 13.2

判断下面说法的正误:

(1)我们可以编程改变 FFFF:0 处的指令,使得 CPU 不去执行 BIOS 中的硬件系统检测和初始化程序。

答案:错误。FFFF:0 处的指令是只读的,无法改变。

(2)int 19h 中断例程,可以由 DOS 提供。

答案:错误。中断例程 19h 是主板上的 ROM 中固化的例程,是由 BIOS 提供的。不是由 DOS 提供的。

参考链接

Last updated