首页 > 解决方案 > TSR服务程序汇编

问题描述

对裁定号 90H 给出了服务程序。在初始化标签之后,编写代码片段,将过程记录到中断向量并在 TSR 中结束程序。

 jmp initialize

    msg db "this is 2 times", 0ah ,0dh, '$'
    
    isra90 proc
    
    push ax
    push dx
    lea dx, cs:msg
    mov ah, 09
    int 21h
    inc byte ptr msg+8
    
    exist:
    pop dx
    pop ax
    iret
    
    Endp

该过程由一个程序触发,其中在数据段中定义了字符串:

味精数据库“你好$”

并且在代码段中出现命令 int 90H。

输出会是什么?为什么它不会是“这是 2 次”?否则它会打印“你好”?

标签: assemblyx86-16

解决方案


这个中断 90h 的中断服务程序不能打印消息“这是 2 次”。

当您的第二个程序运行int 90h指令并因此调用处理程序时,存储在第一个程序(即 TSR 程序)中的消息需要通过DS:DX指针进行寻址。情况并非如此,因为DS段寄存器将指向属于第二个程序的数据。

接下来可以工作。它临时设置DS=CS以便在 中获得正确的远指针DS:DXlea dx, cs:msg由于暗示消息在代码段内的指令,我可以做出这个假设:

isra90 proc

 push ax
 push dx
 PUSH DS
 PUSH CS
 POP  DS
 lea  dx, cs:msg
 mov  ah, 09h
 int  21h
 inc  byte ptr msg+8

exit:
 POP  DS
 pop  dx
 pop  ax
 iret

Endp

中断 90h 的这个中断服务程序不能打印消息“hello”。

当您的第二个程序运行int 90h指令并因此调用处理程序时,存储在第二个程序中的消息需要通过DS:DX指针来寻址。情况并非如此,因为尽管DS段寄存器可能会指向包含“hello”字符串的部分,但第一个程序中的msg标签值几乎肯定会与第二个程序中的msg标签值不同程序。


推荐阅读