内联汇编编译为标准C ++代码

时间:2014-05-12 01:16:14

标签: c++ assembly

我需要在Code :: Blocks中使用GNU GCC编译器进行一些内联​​汇编。目前在标准C ++中没有可用的方法,相当于旧的CLS' DOS的功能。我拒绝偏离标准/ ANSI C ++并通过Windows API或使用图形库是不可能的,因为我需要一些跨平台的东西。向这些年幼的孩子传授的系统(" CLS")是不可能的,因为它为安全问题开辟了一个巨大的后门,而且微软希望结束 - 用户绑定并插入Windows。我也能在几年内继续学习,并且无法承担学习汇编语言所需的时间来实现这一目标,所以我希望你们其中一位精通内联汇编的女士们或先生们可以做些什么为我翻译。我的一位老朋友曾经做过汇编编程,但退休了一段时间后,挖出了他的旧汇编代码的两个片段,其中一个暂停屏幕等待用户按任意键。我已经在C ++中无数次地完成了这项工作,但我也想尝试一下,看看我们是否可以在内联汇编中获得一些东西,只是为了看它是否更快更顺畅。实际上,第二个片段确实执行了一个真正清晰的屏幕,就像DOS' CLS'功能。所以,我也想尝试一下,看看我们是否最终能够为C ++程序中的跨平台CLS提供至少一个由陪审团操纵的固定程序。我的朋友认为这个汇编代码是16位的,但自从他在2002年退休后他就不记得了,而且他对C ++一无所知,所以我们对彼此没有帮助。我想创建单独的函数,我可以在代码中的任何地方调用它。

如果比我更聪明的人可以将汇编代码转换为内联汇编,我会非常感谢你,并且你会为很多C ++编码人员做出巨大帮助。我需要将此代码转换为可在英特尔x86 \ 64架构上运行的代码,并且可以成功编译(使用相应的编译器)以在Windows 32 \ 64,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;
}

1 个答案:

答案 0 :(得分:3)

这个16位汇编代码(或类似代码)很遗憾在现代操作系统上工作。它取决于内存映射文本显示区域,在当今的系统中根本不存在。

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

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

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