MSDOS源代码中的printf函数怎么实现向屏幕输出

MSDOS源代码中的printf函数如何实现向屏幕输出
本帖最后由 cmail2005 于 2013-01-26 20:59:59 编辑
   
    MSDOS源程序里需要输出字符的时候,使用了printf函数。网上某些printf函数的代码:
    
    int printf(const char *fmt, ...)
  {
   int i;
   char buf[256];
   va_list arg = (va_list)((char*)(&fmt) + 4);
   i = vsprintf(buf, fmt, arg);
   write(buf, i);
   return i;
  }
    我想知道在MSDOS源程序里函数是用什么语句实现printf()的。是调用int21h么,int21h是在io.sys文件内吗? msdos.sys,io.sys是由什么文件形成的?我看了一点网上的DOS代码,但是看不明白。请各位不吝赐教。谢谢。
printf()

------解决方案--------------------
个人的心得是:不论是哪个平台,MSDOS,Windows,Linux⋯⋯它们都有提供平台的API,除非能看到源代码,否则也只能大概猜测。

------解决方案--------------------
引用:
个人的心得是:不论是哪个平台,MSDOS,Windows,Linux⋯⋯它们都有提供平台的API,除非能看到源代码,否则也只能大概猜测。


++
------解决方案--------------------
引用:
本帖最后由 cmail2005 于 2013-01-26 20:59:59 编辑
               
    MSDOS源程序里需要输出字符的时候,使用了printf函数。网上某些printf函数的代码:
    
    int printf(const char *fmt, ...)
{
 int i;
 char buf[256];
……


楼主猜得不算错,dos src里面显然不可能有printf这种高端的C函数,所以类似的功能都是调用int 21h来完成的,比如 AH=02或者AH=09 等等,源代码自然也主要是汇编

至于int21的实现也是dos的一部分在boot的时候初始化到中断表中和bios vendor提供的bios routine共同组成系统服务。

那么楼主也基本可以猜到int21的实现也不过是一堆内存读写+ 设备相关的io读写(如果楼主考虑把显示器,显示卡当作与其他硬件无异的IO设备)
原始的实现在msdos.sys,后来融合到io.sys,在dos7之后运行在仿真环境估计实现会变化很多,具体不详

网上有dos6 的leaked src,楼主感兴趣可以自己参详,不过实用估计不大
------解决方案--------------------
Turbo C或Borland C用Turbo Debugger调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。