首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 汇编语言 >

汇编 中止

2013-01-20 
汇编 中断感谢看这个帖子的人,谢谢每个为我提出意见的人.我的问题:1.真是的DOS环境下,退不出来,中断服务子

汇编 中断
感谢看这个帖子的人,谢谢每个为我提出意见的人.
我的问题:
         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





代码就这么多,可能有些小知识点我没注意到,还请指出来。 汇编
[解决办法]
EOI 大概是你们自己定义的一个宏,可以把头文件包含进来。
如果看不到屏幕输出,请在 INT 1ch 后加上暂停等待按键的指令。
这样应该可以了。

热点排行