内联汇编汇编成标准的c++代码
Inline assembly compiled into standard C++ code
我需要一些内联汇编使用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");
这可能适用于您列出的大多数平台,但您必须进行测试。
- 为什么我的C++程序的程序集输出充满了 .ascii,没有汇编代码?
- 在 emscripten 网页汇编正在运行期间更新进度条?
- 为什么我们不编写可以处理C++标识符的汇编器和链接器?
- 在什么情况下,我想在 C/C++ 代码中使用内联汇编代码
- 为什么 memcpy() 和其他类似的函数使用汇编?
- [[可能]]和[[不太可能]]影响程序汇编的简单示例?
- 为什么 MSVC C++编译器将一个简单的 Hello World 扩展为 4000 行汇编?
- 英特尔汇编与内部函数,AVX
- 这个x86汇编代码是如何接收和存储子程序返回的数据的
- Capstone cs_disasm仅反汇编一小部分代码
- C++和汇编中的对数
- 卤化物:X86汇编代码生成
- C++:汇编代码包含断言结果
- 在 g++4.4.7 中为复数算术生成快速汇编
- 混合 c++ 和汇编不能将多个参数从C++函数传递到程序集
- 如何使用 gcc 内联汇编器代码访问成员变量
- SSE 内联汇编和可能的 g++ 优化错误
- C++汇编代码分析(使用 clang 编译)
- 设置Qt Creator以链接和编译汇编代码
- 在Cython中使用移动方法时的汇编误差