如何在不填写屏幕的情况下清除屏幕

时间:2011-11-23 08:33:49

标签: assembly x86 dos interrupt

是否存在中断服务程序来帮助我清除终端屏幕?它会在Windows上运行吗?

4 个答案:

答案 0 :(得分:14)

通过BIOS设置图形模式(int 10h,AH = 0)将清除屏幕。

通过BIOS向上或向下滚动屏幕(在AH = 6或7的情况下为10h)也可以清除屏幕。

这仅适用于可以调用BIOS服务功能的地方。

MSDOS始终可以使用。

在Windows中,这仅适用于DOS应用程序,如果Windows可以实际运行它们。 64位版本的Windows根本不支持DOS应用程序,从Windows Vista开始,即使在32位版本的Windows中,许多DOS应用程序也无法完全运行。

还要记住,如果DOS应用程序在Windows窗口中运行,则只会清除该窗口,而不是整个屏幕。

答案 1 :(得分:3)

我让这个工作(使用qemu,NASM)

http://www.gabrielececchetti.it/Teaching/CalcolatoriElettronici/Docs/i8086_and_DOS_interrupts.pdf

call cls
jmp $

cls:
  pusha
  mov ah, 0x00
  mov al, 0x03  ; text mode 80x25 16 colours
  int 0x10
  popa
  ret

答案 2 :(得分:2)

在装配中,试试这个:

mov ah, 0x06
mov al, 0
int 10h

不,你不能在Windows上这样做。此代码只能用于引导加载程序和汇编内核(仅限16位,警告:不要尝试32位!!!)

如果您想在Windows(控制台应用程序)中执行此操作,请尝试以下操作:

C ++

//YOU SHOULD INCLUDE STDIO.H and CONIO.H. You should also type:
//using namespace std

system("cls");

VB.NET

//You should imports System and other Default namespaces
shell("cls")

C#

System.Diagnostics.Proccess.Start("CMD.exe /c cls");

注意:我认为我们不能使用C#或VB制作控制台应用程序。当然,我从未尝试过。只是说。但这些代码仅适用于Windows。

答案 3 :(得分:0)

对于Windows控制台应用程序,在普通C:

#include <tchar.h>
#include <wincon.h>

VOID
ClearScreen(HANDLE hConsoleOutput)
{
    CONSOLE_SCREEN_BUFFER_INFO csbi;
    COORD coPos;
    DWORD dwWritten;

    GetConsoleScreenBufferInfo(hConsoleOutput, &csbi);

    coPos.X = 0;
    coPos.Y = 0;
    FillConsoleOutputAttribute(hConsoleOutput, csbi.wAttributes,
                               csbi.dwSize.X * csbi.dwSize.Y,
                               coPos, &dwWritten);
    FillConsoleOutputCharacter(hConsoleOutput, TEXT(' '),
                               csbi.dwSize.X * csbi.dwSize.Y,
                               coPos, &dwWritten);
    SetConsoleCursorPosition(hConsoleOutput, coPos);
}

...

// In your main code:
/* Clear the full console screen */
ClearScreen(hOutput);

其中hConsoleOutput是控制台屏幕缓冲区的HANDLE(通过GetStdHandle(STD_OUTPUT_HANDLE)CreateConsoleScreenBuffer(...)或其他方式获得。 这个函数的作用是,首先,检索当前控制台屏幕缓冲区信息(包含其当前大小),然后使用默认文本属性和空格填充整个屏幕缓冲区,最后将光标放在(0, 0)。