MSDOS源代码中的printf函数怎么实现向屏幕输出
MSDOS源代码中的printf函数如何实现向屏幕输出
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代码,但是看不明白。请各位不吝赐教。谢谢。
------解决方案--------------------
个人的心得是:不论是哪个平台,MSDOS,Windows,Linux⋯⋯它们都有提供平台的API,除非能看到源代码,否则也只能大概猜测。
------解决方案--------------------
++
------解决方案--------------------
楼主猜得不算错,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对应的汇编并单步执行观察相应内存和寄存器变化。
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,除非能看到源代码,否则也只能大概猜测。
------解决方案--------------------
++
------解决方案--------------------
楼主猜得不算错,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对应的汇编并单步执行观察相应内存和寄存器变化。