我试图找到一个非常基本的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!答案 0 :(得分:5)
您发布的代码是16位代码。 64位Windows(或任何版本的Linux)不支持16位代码。 [它有点儿麻烦,因为它将长度设置为6,当字符串的实际长度为12时......]
你可能想出如何在Windows代码中做同样的事情,但我没有看到学习如何在汇编程序中在Windows中进行系统调用的重点。编写一些可以在现实生活中实际应用的代码,例如计算字符串中的字符数。
当然,您需要使用Intel或GCC编译器,因为Microsoft编译器不允许在64位模式下使用内联汇编程序。
以下是使用“读取时间戳计数器”指令的内联汇编程序的一些示例,该指令将与gcc编译器一起使用(兼容性也应与英特尔编译器一起使用)。
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 );
}
答案 1 :(得分:1)
AT&amp; T vs.英特尔组装格式。
at&t noprefix intel
mov eax, -4(ebp,edx,4) mov DWORD PTR[-4 +ebp +edx *4], eax
mov eax, -4(ebp) mov DWORD PTR[-4 +ebp], eax
mov edx, (ecx) mov DWORD PTR[ecx], edx
lea ( ,eax,4), eax lea eax, DWORD PTR[8 + eax*4]
lea (eax,eax,2), eax lea eax, DWORD PTR[eax*2+eax]
或者这个。
asm(".intel_syntax noprefix");
asm("mov eax, ebx");
asm(".att_syntax prefix");
asm("mov %ebx, %eax");
AT&amp; T语法。
int main(int argc, char *argv[])
{
int x=1, f=2, fa=3;
asm("int $0x3");
asm("mov 4%0,%%eax"::"m"(x));
asm("movss 4%0,%%xmm1"::"m"(f));
asm("fld 4%0"::"m"(fa));
return 0;
}
请注意,一个区别是使用'%'和寄存器的赋值方向。