[アセンブリ言語] by Wang Shuang | 実験 13: 割り込みプログラムの作成と適用

まえがき: この実験は、王双氏著『アセンブリ言語』第 3 版の実験 13です(p262)

実験環境:DOSBox 0.74-3

実験的なタスク:

(1) int 7ch割り込みルーチン        を記述して実装します。機能は末尾が 0 の文字列を表示する機能で、割り込みルーチンは0:200に実装されます。

        パラメータ: (dh)= 行番号、(dl)= 列番号、(cl)= 色、ds:si は文字列の最初のアドレスを指します。

        上記の割り込みルーチンをインストールした後、以下のプログラムを段階的に実行します。特に、int 命令と iret 命令の実行前後の CS、IP、およびスタックのステータスを観察することに注意してください。

cs:code
データ セグメント
    db "masm へようこそ!"、0
データ終了
コード セグメント
開始を想定します: mov dh,10
          mov dl,10
          mov cl,2
          mov ax,data
          mov ds,ax     
          mov si,0
          int 7ch 
          mov ax, 4c00h
          int 21h
コード終了
終了開始

プログラムのインストールコードを中断します:

assume cs:code

code segment
start: ;安装7ch中断例程
       mov ax,cs
       mov ds,ax
       mov si,offset do7ch
       mov ax,0
       mov es,ax
       mov di,200h
       mov cx,offset do7chend - offset do7ch
       cld
       rep movsb

       ;设置中断向量表
       mov ax,0
       mov ds,ax
       mov word ptr ds:[7ch*4],200h
       mov word ptr ds:[7ch*4 + 2],0

       mov ax,4c00h
       int 21h

do7ch: push ax
       push es
       push dx
       push di
       push cx
       push si
       ;将程序使用到的寄存器入栈保存
       
       mov ax,0b800h
       mov es,ax
       mov al,160
       mul dh  ;160 x 行号 
       add al,dl  ;160 x 行号 + 列号
       adc ah,0
       mov di,ax  ;di为字符显示位置
       ;es:di指向字符显示位置
 
    s: mov al,[si]
       cmp al,0
       je ok  ;为0则字符串结束
       mov es:[di],al
       mov es:[di+1],cl
       inc si
       add di,2
       jmp short s

   ok: pop si 
       pop cx
       pop di
       pop dx
       pop es
       pop ax
       ;恢复寄存器原始值
       
       iret

       mov ax,4c00h
       int 21h

do7chend: nop

code ends
end start

テストプログラムの実行結果:

おすすめ

転載: blog.csdn.net/Amentos/article/details/127335096