서문: 이 실험은 Mr. Wang Shuang이 저술한 "어셈블리 언어" 제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
테스트 프로그램 실행 결과: