c++ - 简单的 x86-64 C++ 内联汇编 "Hello World"示例

标签 c++ linux assembly x86-64 inline-assembly

我试图找到一个非常基本的 C++ 内联 x86-64 汇编示例,类似于:

a Simple "Hello World" Inline Assembly language Program in C/C++

char msg[] = "Hello, world";

asm {
    mov ax,4       // (I/O Func.)
    mov bx,1       // (Output func)  
    lds cx, msg   // (address of the string)
    mov dx,6       //  (lenght of the string)
    int 0x21       // system call
}

这将与英特尔编译器一起工作。有人可以帮忙吗?

编辑关于操作系统我有 Windows 和 Linux 上的 ICC - 让我们说 Linux!

最佳答案

您发布的代码是 16 位代码。 64 位 Windows(或任何版本的 Linux)不支持 16 位代码。 [而且它有点问题,因为它将长度设置为 6,而字符串的实际长度是 12...]

你可能想出如何在 Windows 代码中做同样的事情,但我看不出学习如何从汇编器在 Windows 中进行系统调用的意义。编写一些您可以在现实生活中实际应用的代码,例如计算字符串中的字符数。

当然,您需要使用 Intel 或 GCC 编译器,因为 Microsoft 编译器不允许在 64 位模式下使用内联汇编程序。

这里有一个使用“读取时间戳记计数器”指令的内联汇编程序的小示例,它可以与 gcc 编译器一起使用(并且通过兼容性应该也可以与 Intel 编译器一起使用)。

static __inline__ unsigned long long rdtsc(void)
{
    unsigned hi, lo;
    __asm__ __volatile__ ("rdtsc" : "=a"(lo), "=d"(hi));
    return ( (unsigned long long)lo)|( ((unsigned long long)hi)<<32 );
}

关于c++ - 简单的 x86-64 C++ 内联汇编 "Hello World"示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15534899/

相关文章:

c++ - 在可移植应用程序中使用 Windows DLL

汇编(MIPS)正确使用: Registers vs.堆栈

optimization - 为什么INC和ADD 1有不同的表现?

c++ - 私有(private)纯虚函数的目的?

c++ - 试图返回一个用 `std::unique_ptr` 构造的 `NULL`

c++ - 没有任何附加数据成员的派生类的大小

python - 将 pyvisa 与 pyvisa-py 后端一起使用时出现 "No such device"错误

Linux TCshell 脚本

c++ - 链接 C++ 和程序集时出现段错误

c++ - 在 C/C++ 中两个定界符字符串之间是否有可用的内置函数两个获取字符串?