まえがき: この実験は、王双氏著『アセンブリ言語』第 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
テストプログラムの実行結果: