第 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 提供的。
参考链接
汇编语言(王爽第三版)检测点13 - 筑基2017 - 博客园
Last updated