检测点 13.1
(1) 在上面的内容中,用 7ch 中断例程实现 loop 的功能,则上面的 7ch 中断例程所能进行的最大转移位移是多少?
答:由于存储位移数据的是 16 位的 BX 寄存器,而压栈后,栈元素也是 16 位的字内存单元,16 位存储空间所能存储的有符号数范围是 -32768~32767,因此最大位移就是 32767 字节(Byte)和 -32768 字节(Byte)。
(2) 实现用 7ch 中断例程完成“jmp near ptr s”指令的功能,用 BX 寄存器向中断例程传送转移的位移值 —— (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 的转移位移:(bx)=offset s-offset ok
int 7ch ; 转移到标号 s 处
ok: mov ax,4c00h
int 21h
code ends
end start
7ch 中断例程实现“jmp near ptr s”指令功能的代码如下:
注意,由于在主调程序中已经对字符是否为结束符(ASCII 码值为 0)作出了判断,所以 7ch 中断例程中无需添加这一判断功能的代码,只需直接跳转至主调程序的 s 标号处即可。
jtos: push bp
mov bp,sp
add [bp+2],bx
pop bp
iret