鱼C论坛

 找回密码
 立即注册
查看: 1734|回复: 1

关于call指令的迷惑

[复制链接]
发表于 2013-1-27 14:05:29 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
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:[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连用   但我试过 解决不了这个问题
          
          
          
          
          
          
          







想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2013-1-28 09:16:09 | 显示全部楼层
这个帖子不错,大家快来顶起来!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-10-7 22:28

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表