内联汇编汇编成标准的c++代码

Inline assembly compiled into standard C++ code

本文关键字:汇编 c++ 代码 标准      更新时间:2023-10-16

我需要一些内联汇编使用GNU GCC编译器在Code::Blocks的帮助。目前在标准c++中还没有一种方法可以等同于DOS的旧的CLS函数。我拒绝偏离标准/ANSI c++,通过Windows API或使用图形库是不可能的,因为我需要一些跨平台的东西。教给这些孩子的系统("CLS")程序是不可能的,因为它为安全问题打开了一个巨大的后门,而微软希望最终用户被捆绑和限制在Windows上。我也上了年纪,不能花时间去学习汇编语言来实现这个目标,所以我希望你们中精通内联汇编的女士们或先生们可以为我做一点翻译。我的一个老朋友曾经做过汇编编程,但不久前退休了,他找到了他以前的汇编代码的两个片段,其中一个暂停屏幕等待用户按下任何键。我已经在c++中做过无数次了,但我也想尝试一下,看看我们是否能在内联汇编中得到一些东西,只是想看看它是否更快更流畅。第二个代码片段实际上执行了一个真正的清屏,就像DOS的"CLS"函数一样。因此,我也想对此进行实验,看看我们是否最终能够为c++程序中的跨平台CLS提供至少一个临时修复。我的朋友认为这个汇编代码是16位的,但是他已经不记得了,因为他在2002年退休了,而且他对c++一无所知,所以我们彼此没有帮助。我想创建一个独立的函数,我可以从任何地方调用我的代码。

如果有人比我聪明得多,可以把汇编代码翻译成内联汇编,我会非常感激你,你会做很多c++程序员一个巨大的帮助。我需要将此代码翻译到它将在英特尔x8664架构上工作的地方,并且可以成功编译(使用各自的编译器)在Windows 3264, Linux, UNIX, Ubuntu或OS x上工作。请尽可能彻底地翻译,因为我不理解汇编,我无法理解我试图阅读的2或3本书,以便学习它。我基本上需要能够复制和粘贴它(只有内联汇编代码和任何要求编译使用它)。我需要这两个功能,因为我为我的公司编写了大量的控制台应用程序,我的工作主要是处理网络和内部网。IT/网络人员要求主机应用程序配置他们的小玩具,以减少开销,但他们需要能够阅读提示和输入,而不仅仅是看着一堆文本滚动。我已经用依赖于系统的黑客实现了这一点,他们认为目前他们与程序交互的方式是完美的。但是,在我明年退休之前,我想让它们摆脱对系统的依赖,使它们成为跨平台的,这样我就可以以相当体面的状态离开我的雇主了。

我很抱歉这是一个很长的帖子,但我需要帮助。事先非常感谢你,如果有人能解决的话,我将不胜感激。

最诚挚的问候,GypsyPrince

的例子:

#include <someheader>
void clrscrn()    // Clear user's screen like 'CLS'...
{
        // Execute assembly code to clear screen...
    mov ax,0A000h    // Yes, this is the actual assembly code...
    mov es,ax
    xor di,di
    xor ax,ax
    mov cx,32000d      
    cld
    rep stosw
}
void pauseapp(bool ShowPrompt = false)    // Halt execution of program til user presses key...
{
    if(ShowPrompt)    // If the prompt is displayed...
    {
        std::cout << "nPress any key to continue...";   // Prompt user to press a key...
     }
     /* Execute assembly code to halt program and wait for keypress - show flashing caret at end of prompt if prompt is displayed (just like in an IDE console)... */         
    mov ah,00    // Yes, this is the actual assembly code too...    
    int 16h
}

int main()
{
    std::cout << "First block of text paused to give user time to read." << endl;
    pauseapp(true)
    clrscrn();
    std::cout << "Second block of text paused to give user time to read." << endl;
    pauseapp(true)
    clrscrn();
    std::cout << "Third block of text paused to give user time to read." << endl;
    pauseapp(true)
    clrscrn();
    return 0;
}

那个16位汇编代码(或任何类似的代码)不幸地没有在现代操作系统上工作的机会。它依赖于内存映射的文本显示区域,这在今天的系统中根本不存在。

清除屏幕的最方便的方法可能是使用ANSI转义码:

fputs(stdout, "x1b[2J");

这可能适用于您列出的大多数平台,但您必须进行测试。