|  | 
 
| 
call指令与ret:
x
马上注册,结交更多好友,享用更多功能^_^您需要 登录 才可以下载或查看,没有账号?立即注册  assume cs:code
 stack segment
 db 128 dup(0)
 stack ends
 data segment
 dw 0,0
 data ends
 code segment
 start:mov ax,stack
 mov ss,ax
 mov sp,128
 mov ax,data
 mov ds,ax
 mov ax,0
 mov es,ax
 
 push es:[9*4]
 pop ds:[0]
 push es:[9*4+ 2]
 pop ds:[2]    ;;将原来的int9中断例程的入口地址保存在ds:0、ds:2单元中
 
 mov word ptr es:[9*4],offset int9
 mov word ptr es:[9*4+2],cs    ;在中断表中设置新的int9中断例程入口地址
 
 mov ax,0b800h     ;显示的初始设置
 mov es,ax
 mov ah,'a'
 delay:
 push ax     ;;对要用到的寄存器先保存,子程序返回时
 push dx     ;;再出栈,不至于丢失原先的数据  !好习惯
 mov dx,2000h
 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
 s: mov es:[160*2+40*2],ah
 call delay   ;;调用延时函数
 inc ah
 cmp ah,'z'
 jna s
 mov ax,0
 mov es,ax
 
 push ds:[0]
 pop es:[9*4]
 push ds:[2]
 pop es:[9*4+2]
 
 mov ax,4c00h
 int 21h
 
 
 
 int9:push ax     ;中断的自写处理程序
 push bx
 push es
 
 in al,60h
 
 pushf
 pushf
 pop bx
 and bh,11111100b
 push bx
 popf
 call dword ptr ds:[0]
 
 cmp al,1
 jne int9ret
 
 mov ax,0b800h
 mov es,ax
 inc byte ptr es:[160*2+40*2+1]  ;属性增加1,改变颜色
 
 int9ret:
 pop es
 pop bx
 pop ax
 iret
 
 code ends
 end start
 代码中若将delay 延时函数写在标号s: (即调用指令call后面),用masm编译就会提示位于不同代码段
 可不可以不换位置,就是delay函数卸载s:代码块后面  是不是可以用call far ptr     与retf连用   但我试过 解决不了这个问题
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 | 
 |