【问题标题】:How can I clear the screen without having to fill it如何在无需填充的情况下清除屏幕
【发布时间】:2012-01-04 13:33:57
【问题描述】:

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

【问题讨论】:

  • 目标是哪个环境? Windows 还是 MSDOS?
  • 16 位还是 32 位?文本模式还是图形模式?
  • 我们使用的是 x86 模拟器,所以我相信是 16 位环境,在文本模式下。

标签: assembly x86 dos interrupt


【解决方案1】:

我得到了这个工作(使用 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

【讨论】:

  • mov ax, 0x0003 then int 0x10 适用于 MacOS,带有 nasm 的 bochs。
【解决方案2】:

对于 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 是控制台屏幕缓冲区的句柄(通过GetStdHandle(STD_OUTPUT_HANDLE)CreateConsoleScreenBuffer(...) 或其他方式获得。 该函数的作用是,首先检索当前控制台屏幕缓冲区信息(包含其当前大小),然后用默认文本属性和空格填充整个屏幕缓冲区,最后将光标置于 (0, 0).

【讨论】:

    【解决方案3】:

    在汇编中,试试这个:

    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。

    【讨论】:

    • 从技术上讲,如果您在 32 位 Windows 上运行它,您可以运行已编译的汇编代码(假设它是为 16 位编译和链接的)。它将通过 NTVDM 运行,它允许您运行 16 位 Windows 和 DOS 应用程序以及一些 32 位 DOS 应用程序。支持许多 BIOS 和 DOS 中断,并且对视频模式有一些限制。一般的例外是任何会危及安全的东西,在 64 位 Windows 上,您需要一个模拟器或虚拟机。
    • 搞笑,在QEMU上使用汇编方法只清除第一个字符。
    【解决方案4】:

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

    通过 BIOS 上下滚动屏幕(int 10h with AH=6 or 7)也可以清屏。

    这仅适用于您可以调用 BIOS 服务功能的情况。

    MSDOS 是它始终有效的地方。

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

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

    【讨论】:

    • 谢谢,int 10,0 运行良好。关于如何为 32/64 位控制台应用程序执行此操作的任何想法?只打印几个空格?
    • 如果是 32 位 DPMI DOS 应用程序,您仍然可以使用 BIOS 功能。除此之外,你运气不好。 BIOS 在 64 位模式下不起作用。 DOS 也没有。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-13
    • 1970-01-01
    • 2019-10-05
    • 2021-12-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多