佳礼资讯网

 找回密码
 注册

ADVERTISEMENT

查看: 1767|回复: 24

关于Visual Studio C++内常用到的DOS指令...

[复制链接]
发表于 9-3-2006 06:15 PM | 显示全部楼层 |阅读模式
一般上在windows用C++写简单的DOS程式时,往往都会一些DOS的指令在程式码里

有一个用来clear screen的程式码为system( "cls" );
用来pause program的程式码为system( "pause" );
用来change screen colour的程式码为system( "color 60" ); (6=背景颜色,0=字体颜色)


想请问大家除了以上方法,有没有哪些"纯"C++程式码+library能写出这些效果呢
谢谢指教!!

[ 本帖最后由 AdventChildren 于 2-9-2006 02:25 PM 编辑 ]
回复

使用道具 举报


ADVERTISEMENT

发表于 9-3-2006 10:08 PM | 显示全部楼层
原帖由 AdventChildren 于 9-3-2006 06:15 PM 发表
一般上在windows用C++写简单的DOS程式时,往往都会一些DOS的指令在程式码里

有一个用来clear screen的程式码为system("cls";
用来pause program的程式码为system("pause";
用来 ...


那先學學甚麼是B800:0000吧。
回复

使用道具 举报

发表于 9-3-2006 11:16 PM | 显示全部楼层
原帖由 馬拉棧 于 9-3-2006 10:08 PM 发表


那先學學甚麼是B800:0000吧。

不需要去自己去fill那4k的video ram吧。。。
回复

使用道具 举报

发表于 9-3-2006 11:51 PM | 显示全部楼层
原帖由 馬拉棧 于 9-3-2006 10:08 PM 发表


那先學學甚麼是B800:0000吧。


拜託, 在一些 vga card 或 display mode 的 B800:0000 是無效的.
回复

使用道具 举报

发表于 10-3-2006 09:12 AM | 显示全部楼层
原帖由 flashang 于 9-3-2006 11:51 PM 发表


拜託, 在一些 vga card 或 display mode 的 B800:0000 是無效的.


他是指DOS嘛。難道要教他怎麼從 16 bits real mode 換去 virtual / 32 bits protected mode 再使用那 Linear Video Frame Buffer 嗎
回复

使用道具 举报

发表于 10-3-2006 09:25 AM | 显示全部楼层
原帖由 AdventChildren 于 9-3-2006 06:15 PM 发表
一般上在windows用C++写简单的DOS程式时,往往都会一些DOS的指令在程式码里

有一个用来clear screen的程式码为system("cls";
用来pause program的程式码为system("pause";
用来 ...


...
c 的 library 裡面不是有 clear screen, read key 和 change colour 的 function 嗎 ??
回复

使用道具 举报

Follow Us
发表于 10-3-2006 10:46 AM | 显示全部楼层
原帖由 AdventChildren 于 9-3-2006 06:15 PM 发表
一般上在windows用C++写简单的DOS程式时:),往往都会一些DOS的指令在程式码里:o。

有一个用来clear screen的程式码为system("cls");
用来pause program的程式码为system("pause");
用来 ...


如果我没记错,在DOS的C/C++可以用clrscr()来clear screen,getch()或getche()来pause screen。

至于visual studio的C++,我就没有找到clrscr()。不过getch()还可以用,library是conio.h。

至于clear screen,我找到的方法的是:
1,CreateFile来控制console,library是windows.h。
HANDLE mycon;
mycon=CreateFile("CONOUT$",GENERIC_READ | GENERIC_WRITE ,FILE_SHARE_WRITE,NULL,OPEN_EXISTING ,0,NULL);
WriteFile(mycon,"test",4,NULL,NULL);
如果有错的话,请帮我更正,谢谢

2,GetStdHandle(STD_OUTPUT_HANDLE)和FillConsoleOutputCharacter,制作一个clear screen的function,library是windows.h和iostream。
http://www.adrianxw.dk/SoftwareSite/Consoles/Consoles2.html
回复

使用道具 举报

发表于 10-3-2006 11:03 AM | 显示全部楼层
这里有:
http://support.microsoft.com/kb/q99261/


  1. /* Standard error macro for reporting API errors */
  2. #define PERR(bSuccess, api){if(!(bSuccess)) printf("%s:Error %d from %s \
  3.     on line %d\n", __FILE__, GetLastError(), api, __LINE__);}

  4. void cls( HANDLE hConsole )
  5. {
  6.     COORD coordScreen = { 0, 0 };    /* here's where we'll home the
  7.                                         cursor */
  8.     BOOL bSuccess;
  9.     DWORD cCharsWritten;
  10.     CONSOLE_SCREEN_BUFFER_INFO csbi; /* to get buffer info */
  11.     DWORD dwConSize;                 /* number of character cells in
  12.                                         the current buffer */

  13.     /* get the number of character cells in the current buffer */

  14.     bSuccess = GetConsoleScreenBufferInfo( hConsole, &csbi );
  15.     PERR( bSuccess, "GetConsoleScreenBufferInfo" );
  16.     dwConSize = csbi.dwSize.X * csbi.dwSize.Y;

  17.     /* fill the entire screen with blanks */

  18.     bSuccess = FillConsoleOutputCharacter( hConsole, (TCHAR) ' ',
  19.        dwConSize, coordScreen, &cCharsWritten );
  20.     PERR( bSuccess, "FillConsoleOutputCharacter" );

  21.     /* get the current text attribute */

  22.     bSuccess = GetConsoleScreenBufferInfo( hConsole, &csbi );
  23.     PERR( bSuccess, "ConsoleScreenBufferInfo" );

  24.     /* now set the buffer's attributes accordingly */

  25.     bSuccess = FillConsoleOutputAttribute( hConsole, csbi.wAttributes,
  26.        dwConSize, coordScreen, &cCharsWritten );
  27.     PERR( bSuccess, "FillConsoleOutputAttribute" );

  28.     /* put the cursor at (0, 0) */

  29.     bSuccess = SetConsoleCursorPosition( hConsole, coordScreen );
  30.     PERR( bSuccess, "SetConsoleCursorPosition" );
  31.     return;
  32. }
复制代码
回复

使用道具 举报


ADVERTISEMENT

发表于 10-3-2006 11:05 AM | 显示全部楼层
或是

http://www.sunlightd.com/Windows/FAQ.html#ConsoleClearScreen



  1. #include <windows.h>
  2. void clrscr()
  3. {
  4.     COORD coordScreen = { 0, 0 };
  5.     DWORD cCharsWritten;
  6.     CONSOLE_SCREEN_BUFFER_INFO csbi;
  7.     DWORD dwConSize;
  8.     HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
  9.    
  10.     GetConsoleScreenBufferInfo(hConsole, &csbi);
  11.     dwConSize = csbi.dwSize.X * csbi.dwSize.Y;
  12.     FillConsoleOutputCharacter(hConsole, TEXT(' '), dwConSize,
  13.         coordScreen, &cCharsWritten);
  14.     GetConsoleScreenBufferInfo(hConsole, &csbi);
  15.     FillConsoleOutputAttribute(hConsole, csbi.wAttributes, dwConSize,
  16.         coordScreen, &cCharsWritten);
  17.     SetConsoleCursorPosition(hConsole, coordScreen);
  18. }
复制代码
回复

使用道具 举报

 楼主| 发表于 10-3-2006 03:23 PM | 显示全部楼层
原帖由 astral 于 9-3-2006 11:16 PM 发表
[quote]原帖由 馬拉棧 于 9-3-2006 10:08 PM 发表
那先學學甚麼是B800:0000吧。

不需要去自己去fill那4k的video ram吧。。。 [/quote]
那是属于什么语言的,好象Assembly Language但又没看过的
回复

使用道具 举报

 楼主| 发表于 10-3-2006 03:27 PM | 显示全部楼层
原帖由 馬拉棧 于 10-3-2006 09:12 AM 发表
[quote]原帖由 flashang 于 9-3-2006 11:51 PM 发表
拜託, 在一些 vga card 或 display mode 的 B800:0000 是無效的.

他是指DOS嘛。難道要教他怎麼從 16 bits real mode 換去 virtual / 32 bits protected mode 再使用那 Linear Video Frame Buffer 嗎 [/quote]
听看来好象是Program hardware的,C++ compiler也能做到吗
回复

使用道具 举报

 楼主| 发表于 10-3-2006 03:30 PM | 显示全部楼层
原帖由 flashang 于 10-3-2006 09:25 AM 发表
...
c 的 library 裡面不是有 clear screen, read key 和 change colour 的 function 嗎 ??

请问是哪一个C的library呢, 不知VC++Studio有没有...?能说明一下吗
回复

使用道具 举报

发表于 10-3-2006 05:05 PM | 显示全部楼层
原帖由 AdventChildren 于 10-3-2006 03:27 PM 发表

他是指DOS嘛。難道要教他怎麼從 16 bits real mode 換去 virtual / 32 bits protected mode 再使用那 Linear Video Frame Buffer 嗎

听看来好象是Program hardware ... [/quote]

忘了有ASM的那 Keyword 吧?

__asm
{
        push es;
        mov ax,0xb800;
        mov es,ax;
        mov di,0;
        mov cx,25*80;
        mov ax,0x0720;
        rep stos;
        pop es;
}

我還沒試過的。回家試了再讓你知道可不可以
回复

使用道具 举报

发表于 10-3-2006 10:48 PM | 显示全部楼层
原帖由 馬拉棧 于 10-3-2006 05:05 PM 发表

听看来好象是Program hardware ...


忘了有ASM的那 Keyword 吧?

__asm
{
        push es;
        mov ax,0xb800;
        mov es,ax;
        mov di,0;
        mov cx,25*80;
        mov ax,0x0720;
        rep ... [/quote]
把rep stos 改成rep stosw
回复

使用道具 举报

发表于 10-3-2006 11:06 PM | 显示全部楼层
原帖由 馬拉棧 于 10-3-2006 05:05 PM 发表

忘了有ASM的那 Keyword 吧?

__asm
{
        push es;
        mov ax,0xb800;
        mov es,ax;
        mov di,0;
        mov cx,25*80;
        mov ax,0x0720;
        rep stos;
        pop es;
}

我還沒試過的。回家試了再讓你知道可不可以.



應該是 rep stosw


忘了有 32 bit 的 register 吧 ?

mov cx, 25 * 80 / 2

mov EAX, 0x07200720

66 D8 20 07 20 07 或者 db 66, mov ax, 0x0720, db 20, db 07


rep STOSD
66 F3 AB 或者 db 66, rep stosw

[ 本帖最后由 flashang 于 10-3-2006 11:13 PM 编辑 ]
回复

使用道具 举报

发表于 10-3-2006 11:12 PM | 显示全部楼层
原帖由 AdventChildren 于 10-3-2006 03:23 PM 发表

不需要去自己去fill那4k的video ram吧。。。

那是属于什么语言的,好象Assembly Language但又没看过的。 [/quote]
那个其实没什么。。。只是一个address to video ram而已... 别放在心上
回复

使用道具 举报


ADVERTISEMENT

发表于 11-3-2006 08:27 AM | 显示全部楼层
原帖由 flashang 于 10-3-2006 11:06 PM 发表


應該是 rep stosw


忘了有 32 bit 的 register 吧 ?

mov cx, 25 * 80 / 2

mov EAX, 0x07200720

66 D8 20 07 20 07 或者 db 66, mov ax, 0x0720, db 20, db 07


rep STOSD
66 F3 AB 或 ...


但這就只能夠在 Virtual X86 Mode 執行了。X86 Real Mode 不能夠執行的。
回复

使用道具 举报

发表于 11-3-2006 04:37 PM | 显示全部楼层
原帖由 馬拉棧 于 11-3-2006 08:27 AM 发表


但這就只能夠在 Virtual X86 Mode 執行了。X86 Real Mode 不能夠執行的。


前幾天有個朋友要把一個 dos 的軟件 upgrade 到 win xp 可以使用,
找了整天都找不到 win98 的電腦來測試, 連那個 dos 軟件 '長甚麼樣' 都沒看到...
現在要找 x86 real mode 的電腦 ( os ) 有點困難...

[ 本帖最后由 flashang 于 11-3-2006 04:39 PM 编辑 ]
回复

使用道具 举报

发表于 11-3-2006 07:43 PM | 显示全部楼层
原帖由 flashang 于 11-3-2006 04:37 PM 发表

前幾天有個朋友要把一個 dos 的軟件 upgrade 到 win xp 可以使用,
找了整天都找不到 win98 的電腦來測試, 連那個 dos 軟件 '長甚麼樣' 都沒看到...
現在要找 x86 real mode 的電腦 ( os ) 有點困難...


我就保留了3張 MSDOS 6.22 的 image。不旦祗是 DOS,連 DRMUDOS,OS 2,Win3.11 等等等的全都有。

還有不同版本的 Virtual PC。隨時可以 Boot up。
回复

使用道具 举报

 楼主| 发表于 21-3-2006 01:30 AM | 显示全部楼层
原帖由 meemee 于 10-3-2006 10:46 AM 发表
如果我没记错,在DOS的C/C++可以用clrscr()来clear screen,getch()或getche()来pause screen。

想请问getch()和getche()有何不同呢?通常都只看过getch()而已
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

 

ADVERTISEMENT



ADVERTISEMENT



ADVERTISEMENT

ADVERTISEMENT


版权所有 © 1996-2023 Cari Internet Sdn Bhd (483575-W)|IPSERVERONE 提供云主机|广告刊登|关于我们|私隐权|免控|投诉|联络|脸书|佳礼资讯网

GMT+8, 10-3-2025 05:18 PM , Processed in 0.159036 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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