我写一个时间中断的程序,下面是初始化部分.运行到mov ax,251ch,int 21h偏会出错.在windowsxp下,计算机就提示无效指令.在实模式dos下就死机.请各位帮忙看一下.begin: push cspop dsmov ax,351chint 21hmov old_int,bxmov old_int,esmov dx,offset new08hmov ax,251chint 21hmov dx,offset begin+15+200mov cl,4shr dx,cladd dx,10hmov al,0mov ah,31hint 21hcode endsend begin完整程序:.386stack segment use16 stackdb 200 dup(0)stack endscode segment use16assume cs:code,ds:code,ss:stackcount db 18hour db ?,?,':'min db ?,?,':'sec db ?,?buf_len=$-hourcursor dw ?old_int dw ?,?new08h proc farpushfcall dword ptr cs:old_intdec cs:countjz disppopfiretdisp: mov cs:count,18stipushapush dspush esmov ax,csmov ds,axmov es,axcall get_timemov bh,0mov ah,3int 10hmov cursor,dxmov bp,offset hourmov bh,0mov dh,0mov dl,80-buf_lenmov bl,07hmov cx,buf_lenmov al,0mov ah,13hint 10hmov bh,0mov dx,cursormov ah,2int 10hpop espop dspopapopfiretnew08h endpget_time procmov al,4out 70h,aljmp $+2in al,71hmov ah,aland al,0fhshr ah,4add ax,3030hxchg ah,almov word ptr hour,axmov al,2out 70h,aljmp $+2in al,71hmov ah,aland al,0fhshr ah,4add ax,3030hxchg ah,almov word ptr min,axmov al,0out 70h,aljmp $+2in al,71hmov ah,aland al,0fhshr ah,4add ax,3030hxchg ah,almov word ptr sec,axretget_time endpbegin: push cspop dsmov ax,351chint 21hmov old_int,bxmov old_int,esmov dx,offset new08hmov ax,251chint 21hmov dx,offset begin+15+200mov cl,4shr dx,cladd dx,10hmov al,0mov ah,31hint 21hcode endsend begin
參考答案:你oldint里面本来应该存放的是旧的中断入口地址和段首址但是mov old_int,bx
mov old_int,es
你这样一写 oldint里面就只有es段地址了,建议用位操作改一下