RISC 发表于 2013-1-27 14:05:29

关于call指令的迷惑

call指令与ret:
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:
           pop ds:
           push es:
           pop ds:    ;;将原来的int9中断例程的入口地址保存在ds:0、ds:2单元中
          
           mov word ptr es:,offset int9
           mov word ptr es:,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:,ah
           call delay   ;;调用延时函数
           inc ah
           cmp ah,'z'
           jna s
           mov ax,0
           mov es,ax
          
           push ds:
           pop es:
           push ds:
           pop es:
          
           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:
          
           cmp al,1
           jne int9ret
          
           mov ax,0b800h
           mov es,ax
           inc byte ptr es:;属性增加1,改变颜色
          
int9ret:
           pop es
           pop bx
           pop ax
           iret
          
code ends
end start
代码中若将delay 延时函数写在标号s: (即调用指令call后面),用masm编译就会提示位于不同代码段
可不可以不换位置,就是delay函数卸载s:代码块后面是不是可以用call far ptr   与retf连用   但我试过 解决不了这个问题
          
          
          
          
          
          
          







aa7769640 发表于 2013-1-28 09:16:09

这个帖子不错,大家快来顶起来!
页: [1]
查看完整版本: 关于call指令的迷惑