汇编 中断
感谢看这个帖子的人,谢谢每个为我提出意见的人.
我的问题:
1.真是的DOS环境下,退不出来,中断服务子程序。(板子是intel Q35)
2.中断服务子程序的写法。(公司培训和书上有些不同)
请看看我的代码,然后指点下。
代码如下
;------------------------------------------------
;This file is used to alter 1cH function to
;dispaly 'Hello masm611!' on screen 10 times.
;
;Author: ripple.wang
;Date: 2012-12-26
;------------------------------------------------
.model small
.386
data segment
string db 'Hello masm611!', 10, 13, '$'
data ends
stack segment
db 10000 dup(0)
stack ends
code segment
assume cs:code, ds:data, ss:stack
start:
push cs
pop ds ;string code transfer to 0000:0204h
mov ax, 0
mov es, ax ;also can ues stosw do it..
mov si, offset int1c
mov di, 204h
mov cx, offset int1cend - offset int1c
cld ;set direction..
rep movsb
push es:[1ch*4]
pop es:[200h] ;save the old interupt vector...
push es:[1ch*4+2]
pop es:[202h]
cli
mov word ptr es:[1ch*4], 204h ;set the new interupt vector...
mov word ptr es:[1ch*4+2], 0h
sti
int 1ch
cli
mov word ptr es:[1ch*4], 204h ;restore interupt vector...
mov word ptr es:[1ch*4+2], 0h
sti
mov ax, 4c00h
int 21h
;----------------------------
;int1c is a replacement interupt
;----------------------------
int1c:
pusha
mov ax, 0b800h
mov es, ax
mov bx, 0
mov di, 0
mov ax, data
mov ds, ax
s:
mov al, byte ptr ds:[0+di]
mov byte ptr es:[160*12+30*2+bx], al ;如果这个不开中断的话,则想显存当中输入数据
add bx,2 ;如果开中断,请看另一段程序
inc di ;这个地方我的本意是: 在中断服务子程序当中如果
cmp al, '!' ;想利用int 21 这个中断输出字符串,则必须允许
jnz s ;中断,然后调用; 如果不允许中断,要输出信息,
;则应该向显存写入内容,才能输出到屏幕
EOI //这个地方?EOI是外部中断的结束命令,为什么我不可以用呢?
popa
iret
int1cend:
nop
;<AMI_PHDR_START>
;----------------------------
;Procdure: Next_line
;
;Descripton: This function is to go to a new line
;
;Input: dl = 0ah(Enter) , dl = 0dh(wrap)
;
;Output: None
;----------------------------
;<AMI_PHDR_END>
Next_line proc far
push dx
mov dl, 0ah
call show_byte
mov dl, 0dh
call show_byte
pop dx
ret
Next_line endp
;<AMI_PHDR_START>
;----------------------------
;Procdure: show_byte
;
;Descripton: This function is to display a byte
;
;Input: AH = 02h DL = character
;
;Output: None
;----------------------------
;<AMI_PHDR_END>
Show_byte proc far
push ax
mov ah,02h
int 21h
pop ax
ret
Show_byte endp
;<AMI_PHDR_START>
;----------------------------
;Procdure: delay
;
;Descripton: This function is to display a byte
;
;Input: None
;
;Output: None
;----------------------------
;<AMI_PHDR_END>
delay:
push ax
push dx
mov dx, 1000h
mov ax, 0
s1:
sub ax, 1
sbb dx, 0
cmp ax, 0
jne s1
cmp dx, 0
jne s1
pop dx
pop ax
ret
code ends
end start