返回介绍

第 13 章:int 指令

发布于 2024-10-04 13:37:13 字数 8279 浏览 0 评论 0 收藏 0

检测点 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(段内近转移),返回值:无。

例程代码如下:

lp:
    push bp         ; 将 bp 这个 ss 栈的偏址保存
    mov bp, sp      ; 将当前栈顶指针值送入到 bp
    add [bp+2], bx  ; 修改 ss 栈中的从栈顶向下第 2 个单元的值
lpret:
    pop bp          ; 恢复 bp 值
    iret            ; 返回到调用处

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

assume cs:code

code segment
start:      ; 7cH 中断例程的安装程序
            mov ax, cs
            mov ds, ax
            mov si, offset lp   ; 将 ds:si 指向源地址(captial 的机器码)
            mov ax, 0000H
            mov es, ax
            mov di, 200H        ; 将 es:di 指向目的地址(0:200H 向量表中)
            mov cx, offset lpend - offset lp    ; 设置传输长度
            cld             ; 传输方向为正
            rep movsb       ; 字节传输
            ; 设置中断向量表,使 7cH 条目中断向量指向 0000:200H
            mov ax, 0000H
            mov es, ax
            mov word ptr es:[7cH*4], 200H
            mov word ptr es:[7cH*4+2], 0000H
            mov ax, 4c00H
            int 21H
;-----------
; 装载的例程:7cH
; 功能:int 7cH 实现和 jmp near ptr s 指令相同的功能
; 入口参数:bx 相对地址偏移量
; 返回值:无
;-----------
lp:
    push bp         ; 将 bp 这个 ss 栈的偏址保存
    mov bp, sp      ; 将当前栈顶指针值送入到 bp
    add [bp+2], bx  ; 修改 ss 栈中的从栈顶向下第 2 个单元的值
lpret:
    pop bp          ; 恢复 bp 值
    iret            ; 返回到调用处。
lpend:
    nop             ; 代码段结尾,便于计算 7cH 例程的长度。   

code ends

end start

检测点 13.2

判断下面说法的正误:

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

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

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

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

参考链接

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文